python - 贪吃蛇

这个程序是初学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")
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值