这个程序是初学python的算是第一个程序吧,每个函数的功能和核心代码尽量注释的很清楚了,
在这就不详解了。
运行截图
'''
初学python练手之贪吃蛇
环境:python3.6 + opencv
只是加了蛇的移动逻辑,吃食物的逻辑
没有蛇的死活判断,中间还有一些bug
比如:食物随机产生,有可能产出在地图外
最近没有时间继续做了,贴上代码,算是留个纪念
请各位看官大佬批评指正
'''
'''
初学python练手之贪吃蛇
环境:python3.6 + opencv
只是加了蛇的移动逻辑,吃食物的逻辑
没有蛇的死活判断,中间还有一些bug
比如:食物随机产生,有可能产出在地图外
最近没有时间继续做了,贴上代码,算是留个纪念
请各位看官大佬批评指正
'''
import cv2
import numpy as np
import time
import random
class Point(object):
def __init__(self, x, y, dir):
self.x = x
self.y = y
self.dir = dir
return
class Snake(object):
'''
dir 1 2 3 4 代表上下左右四个方向
'''
def __init__(self, w, h,x, y, dir):
#保存蛇每个单元的坐标和移动方向
self.snake = [Point(x, y, 4), Point(5,4,4), Point(5, 2, 4)]
#设置每个单元的边长
self.side = 20
#蛇头坐标
self.x = x
self.y = y
#地图大小
self.w = w * self.side
self.h = h * self.side
#蛇头初始方向
self.dir = dir
#上下左右四个方向
self.offset = [[],[0,-1],[0,1],[-1,0],[1,0]]
#食物坐标
self.food = Point(random.randint(0, self.w // self.side),
random.randint(0, self.h // self.side),0)
return
#调试函数
def printf(self):
print("h:" + str(self.w))
print("w:" + str(self.h))
print("x:" + str(self.x))
print("y:" + str(self.y))
print("dir:" + str(self.dir))
return
#画蛇的身体
def paintBody(self,mp, point, mycolor):
cv2.rectangle(mp, (point.x * self.side + 1, point.y * self.side + 1), (point.x * self.side + self.side - 2, point.y * self.side + self.side - 2), mycolor, -1)
#蛇的移动逻辑
def moveSnake(self):
i = len(self.snake) - 1
last = Point(self.snake[i].x, self.snake[i].y, self.snake[i].dir)
#先移动蛇的身体
while i > 0:
self.snake[i].x = self.snake[i - 1].x
self.snake[i].y = self.snake[i - 1].y
self.snake[i].dir = self.snake[i - 1].dir
i -= 1
#移动蛇头
self.snake[0].x = self.snake[0].x + self.offset[self.dir][0]
self.snake[0].y = self.snake[0].y + self.offset[self.dir][1]
self.snake[0].dir = self.dir
#吃到食物
if self.snake[0].x == self.food.x and self.snake[0].y == self.food.y:
self.snake.append(last)
self.creatFood()
return
#改变蛇头的方向
def changeSnakeDir(self, dir):
self.dir = dir
return
#产生随机食物
def creatFood(self):
self.food = Point(random.randint(0, self.w // self.side), random.randint(0, self.h // self.side), 0)
return
#更新前台
def paintSnake(self):
mp= np.zeros((self.h, self.w, 3), dtype="uint8")
#cv2.line(mp,(0,0),(self.w,self.h),(0,255,0))
i = 0;j = 0
#绘制画布
while i < self.w:
while j < self.h:
bx = i
by = j
cv2.rectangle(mp, (bx, by), (bx + self.side, by + self.side),(0,100,0))
j += self.side
i += self.side
j = 0
#绘制蛇头
head = self.snake[0]
self.paintBody(mp, head, (0,0,255))
#绘制蛇身
i = 1
while i < len(self.snake):
self.paintBody(mp, self.snake[i], (255,0,0))
i += 1
#绘制食物
self.paintBody(mp, self.food, (0,255,0))
cv2.imshow("Snake",mp)
#获取当前键盘输入
ch = cv2.waitKey(1) & 0xFF
if ch == ord('w'):
self.dir = 1
elif ch == ord('s'):
self.dir = 2
elif ch == ord('a'):
self.dir = 3
elif ch == ord('d'):
self.dir = 4
return
if __name__ == "__main__":
#初始化蛇 20 * 20 的地图, 蛇的初始位置, 蛇的初始方向
snake = Snake(20, 20, 5, 5, 4)
#不断刷新前台
#中间逻辑控制不是很好,所以用了三个paintSnake来提高游戏体验
while True:
snake.paintSnake()
time.sleep(0.3)
snake.moveSnake()
snake.paintSnake()
snake.paintSnake()
#os.system("pause")