【python】OpenCV—Greedy Snake

news2024/9/20 15:03:10

在这里插入图片描述

文章目录

  • 1、代码实现
  • 2、涉及到的库——cv2.setWindowProperty

1、代码实现

import cv2
import numpy as np
from random import choice


class SnakePart:

    def __init__(self, front, x, y):
        self.front = front
        self.x = x
        self.y = y

    def move(self):
        # 跟随它前面的部分移动
        self.x = self.front.x
        self.y = self.front.y


class Head:  # snake 用来存它
    def __init__(self, direction, x, y):
        self.direction = direction
        self.x = x
        self.y = y

    def move(self):
        # 检查它当前的方向,并相应地移动
        if self.direction == 0:  # d 初始化的时候往右边跑
            self.x += 1
        elif self.direction == 1: # s 下
            self.y += 1
        elif self.direction == 2: # a 左
            self.x -= 1
        elif self.direction == 3: # w 上
            self.y -= 1


def display():
    # 创建空白图像
    board = np.zeros([BOARD_SIZE, BOARD_SIZE, 3])

    # 把蛇涂成绿色
    for part in snake:
        board[part.y, part.x] = [0, 255, 0]

    # 把苹果涂成红色
    board[appley, applex] = [0, 0, 255]

    # 显示屏
    cv2.imshow("Snake Game", np.uint8(board.repeat(CELL_SIZE, 0).repeat(CELL_SIZE, 1)))
    key = cv2.waitKey(int(1000 / SPEED))

    # 返回按下的键。如果没有按下键,则为-1。
    return key


def win_focus():
    # 全屏打开图像,然后返回正常窗口
    cv2.namedWindow("Snake Game", cv2.WINDOW_AUTOSIZE)
    board = np.zeros([BOARD_SIZE * CELL_SIZE, BOARD_SIZE * CELL_SIZE, 3])
    cv2.imshow("Snake Game", board)
    cv2.setWindowProperty("Snake Game", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
    cv2.waitKey(2000)
    cv2.setWindowProperty("Snake Game", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_AUTOSIZE)


if __name__ == '__main__':

    # 棋盘游戏中每个单元格的大小
    CELL_SIZE = 20
    # 游戏中沿宽度排列的单元数
    BOARD_SIZE = 30
    # 改变速度使游戏进行得更快
    SPEED = 12
    # 吃过苹果后,蛇会按生长单位生长
    GROWTH = 3

    # 变量跟踪苹果是否被吃
    eaten = True
    # 变量来检查游戏是否应该退出
    quit = False
    # 变量跟踪增长。
    grow = 0

    # 存储蛇的数组
    snake = []

    # 蛇的头从棋盘的中心开始。
    head = Head(0, int((BOARD_SIZE - 1) / 2), int((BOARD_SIZE - 1) / 2))
    snake.append(head)

    # 通过打印说明开始游戏
    print('w = top, a = left, s = down, d = right')
    # 让窗口聚焦的丑把戏
    win_focus()

    while True:
        # 检查苹果是否被吃掉,并生成一个新的
        if eaten:
            # 列出所有可能的地点
            s = list(range(0, BOARD_SIZE ** 2))
            # 删除属于蛇的一部分的cell
            for part in snake:
                s.remove(part.x * BOARD_SIZE + part.y)

            # 从剩余的cell中随机挑选一个
            a = choice(s)
            applex = int(a / BOARD_SIZE)
            appley = a % BOARD_SIZE

            eaten = False

        # 制作并展示显示屏
        key = display()

        # 获取按下的键并相应地移动
        # 8和27是删除键和退出键
        # 方向键在OpenCV中很棘手。所以我们使用
        # 键'w', 'a','s','d'表示移动。
        # w = top, a = left, s = down, d = right

        if key == 8 or key == 27:
            break

        elif key == ord("d"):
            head.direction = 0

        elif key == ord("s"):
            head.direction = 1

        elif key == ord("a"):
            head.direction = 2

        elif key == ord("w"):
            head.direction = 3

        # 移动snake,头在最前面,头先动,所以逆序遍历
        for part in snake[::-1]:
            part.move()

        # 碰撞规则1、越界
        if head.x < 0 or head.x > BOARD_SIZE - 1 or head.y < 0 or head.y > BOARD_SIZE - 1:
            break

        # 碰撞规则2、吃到自己了
        for part in snake[1:]:
            if head.x == part.x and head.y == part.y:
                quit = True
                break

        if quit:
            break

        # 蛇在多帧中逐渐生长,头snake[-1]已经在吃下苹果的下一个位置了
        if grow > 0: 
            snake.append(SnakePart(snake[-1], subx, suby))
            grow -= 1

        # 当蛇吃苹果的时候,蛇就会长出来
        if applex == head.x and appley == head.y:
            subx = snake[-1].x
            suby = snake[-1].y
            eaten = True
            grow += GROWTH

在这里插入图片描述

2、涉及到的库——cv2.setWindowProperty

cv2.setWindowProperty 是 OpenCV 库中的一个函数,用于设置窗口的属性。这个函数允许你控制窗口的某些行为,比如窗口的标题、是否允许调整窗口大小等。这对于在使用 OpenCV 进行图像处理或视频处理时,创建更加友好和可控的用户界面非常有用。

函数原型如下:

cv2.setWindowProperty(winname, propid, propvalue)
  • winname:字符串类型,指定窗口的名称。这个名称是在创建窗口时通过 cv2.namedWindow() 或在显示图像时通过 cv2.imshow() 指定的。

  • propid:指定要改变的窗口属性的标识符。这是一个整数,OpenCV 提供了多个预定义的常量来表示不同的属性,例如 cv2.WND_PROP_FULLSCREEN(全屏模式)、cv2.WND_PROP_AUTOSIZE(自动调整窗口大小以匹配图像)等。

  • propvalue:根据 propid 的不同,这个参数可以是一个布尔值(如 True 或 False)、整数或其他类型,用于设置属性的新值。

一些常用的属性标识符包括:

  • cv2.WND_PROP_FULLSCREEN:设置窗口是否全屏。propvalue 为cv2.WINDOW_FULLSCREEN 时启用全屏,为 0 时禁用全屏。
  • cv2.WND_PROP_AUTOSIZE:设置窗口大小是否根据显示图像的大小自动调整。propvalue 为 cv2.WINDOW_AUTOSIZE 时启用自动调整,为 cv2.WINDOW_NORMAL 时允许用户调整窗口大小。

示例代码:

import cv2  
  
# 创建一个窗口  
cv2.namedWindow('Example Window', cv2.WINDOW_NORMAL)  
  
# 显示图像(这里假设你有一个名为 image 的图像变量)  
# cv2.imshow('Example Window', image)  
  
# 设置窗口为自动调整大小  
cv2.setWindowProperty('Example Window', cv2.WND_PROP_AUTOSIZE, cv2.WINDOW_AUTOSIZE)  
  
# 如果需要,可以设置为允许用户调整窗口大小  
# cv2.setWindowProperty('Example Window', cv2.WND_PROP_AUTOSIZE, cv2.WINDOW_NORMAL)  
  
# 注意:这里只是演示如何设置窗口属性,没有实际显示图像  
  
# 等待按键操作  
cv2.waitKey(0)  
cv2.destroyAllWindows()

请注意,由于 OpenCV 主要是一个计算机视觉库,而不是一个完整的 GUI 工具包,因此它的窗口管理功能相对有限。如果你需要更复杂的用户界面或窗口管理功能,可能需要考虑使用其他 GUI 库,如 Tkinter、PyQt 或 wxPython 等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1994825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构:链表经典算法OJ题

目录 前言 一、移除链表元素 二、反转链表 三、合并两个有序链表 四、链表的中间节点 五、环形链表的约瑟夫问题 前言 在了解了链表的相关知识后&#xff0c;我们还需要一些题目进行练习加深对链表这方面知识的理解&#xff0c;也可以用来检测链表这块学的的怎么样&#…

【手撕数据结构】二叉树和堆

目录 树的概念树的相关概念二叉树二叉树的概念满二叉树和完全二叉树 堆的概念与结构堆的向上调整算法思路分析代码详细解说 堆的向下调整算法算法图解分析代码详解分析 堆的各个接口堆的定义及声明堆的初始化堆的销毁堆的插入堆的删除取堆顶数据堆的数据个数堆的判空 树的概念 …

【CVE-2024-38077】核弹级Windows RCE漏洞如何自检并修复该漏洞(附批量漏洞检测工具及分析伪代码)

代码详细分析点击此处 # 伪代码分析链接 工具为官方工具&#xff0c;师傅可自行测试 深信服CVE-2024-38077漏洞扫描工具.exe Algorithm : SHA1Hash : 85ECBDB053950A20B9748E867586D059AAA19115Algorithm : SHA256Hash : 1BF3A372F95C4F5B2D776C6ABB1E9BCA51933C3…

机器学习·L3W2-协同过滤

推荐算法 推荐算法可以预测用户评分&#xff0c;并根据评分推荐数据 推荐算法与其他预测算法的区别在于&#xff1a;推荐算法中的数据大多都不完整&#xff0c;用户只对几个电影评分&#xff1b;而预测算法则要求数据完整&#xff0c;便于拟合和预测 协同过滤 评分矩阵Y&#x…

Install pytorch 使用 torch 的例子

如果不知道怎么开始和安装软件 从这里开始 如果需要GPU版本&#xff0c;请选择CUDA&#xff0c;而不是CPU PyTorchhttps://pytorch.org/ Python 3.8.13 | packaged by conda-forge | (default, Mar 25 2022, 06:04:10) [GCC 10.3.0] on linux Type "help", &quo…

k8s环境使用cronjob对mysql8进行备份

一、configmap 数据库备份脚本写入k8s环境的configmap文件&#xff0c;并生成config。 # cat mysql-back-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: mysql8backnamespace: crontabs data:mysql8back.sh: |#!/bin/bashDUMPDIR/tmp#backupbackupDatedate…

【专题】2023-2024跨境旅游消费趋势研究报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37306 近日&#xff0c;“世界旅游联盟中欧旅游对话”在匈牙利布达佩斯举办&#xff0c;发布《2023 - 2024 跨境旅游消费趋势研究报告》。 报告显示&#xff0c;2023 - 2024 年全球旅游业复苏&#xff0c;跨境旅游人数和支出显著增加…

【Material-UI】Checkbox组件:Indeterminate状态详解

文章目录 一、什么是Indeterminate状态&#xff1f;二、Indeterminate状态的实现1. 基本用法示例2. 代码解析3. Indeterminate状态的应用场景 三、Indeterminate状态的UI与可访问性1. 无障碍设计2. 用户体验优化 四、Indeterminate状态的最佳实践1. 状态同步2. 优化性能3. 提供…

SQL Zoo 10.Window functions

以下数据均来自SQL Zoo 1.Show the lastName, party and votes for the constituency S14000024 in 2017.&#xff08;显示2017年选区“S14000024”的姓氏、政党和选票&#xff09; SELECT lastName, party, votesFROM geWHERE constituency S14000024 AND yr 2017 ORDER BY…

多个IT系统数据同步方案-操作标识

这是一个很普遍的方案&#xff0c;实现多个IT系统数据同步&#xff1a; 从上游发出的数据标识&#xff0c;就可以完整的控制数据&#xff0c;当然对上游的要求也多一些&#xff0c;就是打数据标识前一定要读取一下现有的数据。

Spring Boot 基于 SCRAM 认证集成 Kafka 的详解

一、说明 在现代微服务架构中&#xff0c;Kafka 作为消息中间件被广泛使用&#xff0c;而安全性则是其中的一个关键因素。在本篇文章中&#xff0c;我们将探讨如何在 Spring Boot 应用中集成 Kafka 并使用 SCRAM 认证机制进行安全连接&#xff1b;并实现动态创建账号、ACL 权限…

Android Studio生成系统签名platform.jks

准备工作&#xff1a; 系统工程师需要提供以下文件并且在同一个目录文件夹下面 1、platform.pk8 2、platform.x509.pem 3、signapk.jar(通用的) 按照以下顺序执行 1、platform.pk8和platform.x509.pem 生成 .jks 提供platform.pk8、platform.x509.pem 、signapk.jar&…

低代码革命:重塑开发效率与质量的未来

1. 引言 随着信息技术的快速发展&#xff0c;企业对应用程序的需求日益增长。然而&#xff0c;传统的软件开发模式面临着开发周期长、成本高、人才短缺等问题。近年来&#xff0c;“低代码”开发平台如雨后春笋般涌现&#xff0c;承诺让非专业人士也能快速构建应用程序。这种新…

Netty原理及高性能

1. Netty原理 Netty是一个基于Java的异步事件驱动的网络应用框架&#xff0c;他用于快速开发高性能、高可靠性的网络服务器和客户端应用。Netty的原理涉及多个方面&#xff0c;包括 Reactor模式、核心组件、编解码、线程模型以及TCP粘包和拆包处理等。 1.1 Reactor模式 Reactor…

玻璃存储还没整明白,陶瓷纳米存储又来了!

关注我们 - 数字罗塞塔计划 - 在信息爆炸的当下&#xff0c;我们每天产生的数据比以往任何时候都多。其实很多数据都是存储后很少被访问&#xff0c;但仍需要长期保存的“冷数据”。磁带、硬磁盘、光盘等传统存储介质难以提供冷数据存储所需的超长寿命、超大容量和持续可访问性…

Docker Compse单机编排

一.Docker Compse 介绍 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;你可以使用 YAML 文件来配置应用程序的服务、网络和卷&#xff0c;然后使用单个命令创建和启动所有服务。这使得在开发、测试和部署过程中管理多容器应用程…

精彩分享|暴雨亮相第二十届智能计算国际会议(ICIC 2024)

8月6日至8日&#xff0c;第二十届智能计算国际会议&#xff08;ICIC 2024&#xff09;在天津盛大召开&#xff0c;这场由宁波东方理工大学&#xff08;暂名&#xff09;主办&#xff0c;天津科技大学承办&#xff0c;中国矿业大学&#xff08;北京&#xff09;、中国矿业大学和…

【学习笔记】Matlab和python双语言的学习(非线性规划法)

文章目录 前言一、非线性规划法二、例题&#xff1a;选址问题1.确定决策变量2.确定约束条件3.确定目标函数4.建立模型5.求解 三、代码实现----Matlab1.Matlab 的 fmincon 函数&#xff08;1&#xff09;基本用法&#xff08;2&#xff09;简单示例 2.Matlab 代码第一问&#xf…

RegNet 图像识别网络,手写阿拉伯数字的图像分类

1、RegNet 网络介绍 regnet 是一个深度学习模型架构&#xff0c;用于图像分类任务。它是由 Facebook AI Research&#xff08;FAIR&#xff09;提出的&#xff0c;旨在实现高效的网络设计。regnet 通过在不同的网络层级上增加网络宽度和深度来提高模型性能。 regnet 的设计思…

如何使用 AWS CLI 创建和运行 EMR 集群

为初学者提供清晰易懂的教程 为初学者提供清晰易懂的教程 Apache Spark 和 AWS EMR 上的 Spark 集群 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 欢迎来到雲闪世界。Spark 被认为是“大数据丛林之王”&#xff0c;在数据分析、机器学习、流媒体和图形…