重磅干货,第一时间送达 导读 本文详细介绍贪吃蛇小游戏,主要是使用方向键来控制小蛇的移动,并让小蛇尽可能多的吃到地图中的小苹果,变得更长。 基础工作导入基础程序库首先需要导入我们所需要的各种程序库。 import cv2 import numpy as np form random import randint form random import choice 定义小蛇的基础构成在这个程序中,我们的小蛇由头部和身体组成。
具体如下图所示。 接下来,我们分别定义小蛇的头部类和身体类。 头部类因为整个小蛇是二维平面的小蛇,因此,确定一个蛇头的位置需要x和y两个值。此外,对于蛇头的移动方向,需要一个direction变量来确定。具体代码如下。
身体类身体类也需要使用x和y来确定位置,但由于每个身体但小块的运动均依赖于前一个小块的运动,因此,身体类没有direction变量,有的只是front变量,用来让身体知道自己的上一块的位置。具体代码如下。 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 定义游戏变量
编写游戏初始化opencv窗口除了初始化窗口外,这个函数还可以让用户的焦点自动到该贪吃蛇游戏中。 # 构建窗口并获取焦点 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 eaten: # 将二维地图转换为一维序列 s = list(range(0, BOARD_SIZE ** 2)) # 将序列中被小蛇占有的值给剔除 for part in snake: s.remove(part.x * BOARD_SIZE + part.y)
# 随机生成一个不被小蛇覆盖的新苹果 a = choice(s) applex = int(a/BOARD_SIZE) appley = a % BOARD_SIZE
eaten = False 刷新屏幕并更新移动方向
小蛇吃到苹果后长大# 当小蛇吃到苹果后的生长代码 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 游戏失败的判断
小结这只是一个小的Demo,大家感兴趣可以去下载源代码,并让这个游戏变得更加的具有可玩性。 代码:https://github.com/spmallick/learnopencv/tree/master/SnakeGame 英文原文:https:///snake-game-with-opencv-python/ |
|