android贪吃蛇opencv,使用Python代码制作贪吃蛇小游戏,你也可以打造自己的AI

a360a58485ba3779f4350a793f3c69a3.png

上期视频,我们分享了一个AI来玩贪吃蛇的视频,本期我们讲解一下其基础代码,利用本代码自己也可以写游戏了。

d70925499ab1f10d74c75593570315dd.png

游戏界面

贪吃蛇小游戏是一代人的梦,本期文章我们简单制作一个贪吃蛇小游戏import cv2

import numpy as np

from random import randint

from random import choice

85cd6b00f428e17a11d27242f4e93ef8.png

代码截图

首先导入我们需要的第三方库,然后定义一个贪吃蛇的类来定义贪吃蛇的运动,头部等信息

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

8a8274936c5c1f15e15cb25333495dee.png

代码截图

此类我们定义贪吃蛇的身体以及运动等

class Head:

def __init__(self, direction, x, y):

self.direction = direction

self.x = x

self.y = y

def move(self):

if self.direction == 0:

self.x += 1

elif self.direction == 1:

self.y += 1

elif self.direction == 2:

self.x -= 1

elif self.direction == 3:

self.y -= 1

91c29b383f87f0bffc787a34fb8e3c22.png

代码截图

然后我们定义贪吃蛇的头部以及运动信息,这里我们控制键盘的W\S\A\D四个键来控制贪吃蛇头部的运动方向

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))

return key

c958a58c8c530162fe6cd1379dec9b47.png

代码截图

Display函数类来显示贪吃蛇的颜色以及要吃的苹果的颜色

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)

cae5b8ea64ee50fc76cd5a0f9c3051fe.png

代码截图

Win_focus 类函数来显示游戏画面

1. cv2.VideoCapture(0) #构建视频抓捕器 参数说明:0表示需要启动的摄像头,这里也可以写视频的路径 2. cv2.nameWindow(name, cv2.WINDOW_NORMAL) # 构建视频的窗口 参数说明: 表示窗口的名字, cv2.WINDOW_NORMAL表示窗口的大小,这里窗口的大小是正常, 3.cv2.setWindowProperty(name, cv2.WND_PROP_FULLSCREEN, cv2.WND_PROP_FULLSCREEN) 参数说明: name表示需要更改像素的窗口名字, cv2.WND_PROP_FULLSCREEN表示全屏 4. video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) 对窗口像素进行设置 参数说明: cv2.CAP_PROP_FRAME_WIDTH 表示设置其宽的大小, 1920表示设置的像素

以上参数类设置后,我们开始主函数的部分

if __name__ == '__main__' :

# 每个cell的大小

CELL_SIZE = 20

# cell的数量

BOARD_SIZE = 45

# 游戏中贪吃蛇的运行速度

SPEED = 6

# 贪吃蛇成长的速度

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))

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

09f622c240a375d07b746ce77f895f3b.png

代码截图

接下来,我们设置一下贪吃蛇的键盘移动设置,W/A/S/D,分别代表贪吃蛇的移动方向,这个跟普通游戏设置的一样,由于opencv不能设置箭头,这里只能设置为W/A/S/D

key = display()

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

b7db4663bd9a039c86ca304f7cf65b6f.png

代码截图

设置完成后,就可以进行贪吃蛇的移动控制,以及贪吃蛇的游戏规则,当贪吃蛇吃过一个苹果后,其身体要增加一个大小尺寸

# 移动贪吃蛇

for part in snake[::-1]:

part.move()

# 设置游戏规则

if head.x < 0 or head.x > BOARD_SIZE - 1 or head.y < 0 or head.y > BOARD_SIZE - 1:

break

for part in snake[1:]:

if head.x == part.x and head.y == part.y:

quit = True

break

if quit:

break

# 设置贪吃蛇

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

bc63deb6240eddf56c32af231396ee91.png

Ok,所有设置完成后,便可以进行游戏了,当然这里只是设置了基本的贪吃蛇规格,你也可以在代码里面增加分数设置,看看你能跑多少分吧

af1825ad1589b8e7b272eb75f9a58fa7.png

游戏截图

86b119bb17e073bbdd43ace374c4efeb.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值