贪吃蛇Python版 源码+代码分析

前言

该程序未使用pygame库, 而是采用keyboard库的on_press()函数捕获键盘操作, 使用windows控制台缓冲区作为图形界面。
第一次写文章,如有错误请谅解

运行示例

在这里插入图片描述


程序分析

捕获键盘操作

Python从控制台读取可以使用input()函数, 但很明显的是, 贪吃蛇游戏需要在游戏运行的同时不断读取键盘操作, 使用input()输入需要每次都使用回车键, 可行性较差
本程序中使用keyboard库中的on_press()函数捕获键盘操作, 并将捕获的键盘操作传递给一个key_envent()函数进一步处理, 进而控制游戏

输出游戏画面

贪吃蛇游戏需要不断的更新和显示游戏画面, 游戏地图可以使用二维矩阵的形式储存, 显示画面时, 将矩阵中的信息转换成字符串并输出即可


代码分析一

安装运行环境

# 测试python版本为3.9.8
pip install keyboard
pip install win32

游戏地图的实现

创建地图需要的基本信息包括宽度width, 以及高度height
地图的每个格子代表一种元素, 0代表空格, 1代表食物, 2代表炸弹, 3代表蛇的头部, 4代表蛇的身体
对地图的操作包括读取(x, y)位置的元素, 改变(x, y)位置的元素, 以及将列表输出为可以显示的形式

  • 地图的初始化
class Map():
    def __init__(self, width=10, height=10):
        if (width < 10):
            width = 10
        if (height < 10):
            height = 10
        self.size = (width, height)
        self.__map = [[0 for i in range(width)] for i in range(height)]
        # 0为空白块,1为食物,2为炸弹,3为蛇头,4为蛇尾
  • 读取某位置的元素
    def read(self, x, y):
        if (x >= 0 and x < self.size[0] and y >= 0 and y < self.size[1]):
            return self.__map[y][x]
        return -1	# 如果该位置超过地图边界, 返回-1
  • 改变某位置的元素
    def write(self, x, y, val=0):
        self.__map[y][x] = val
  • 将地图以可显示形式输出

输出部分为按行输出(便于后续图形界面的排版), 将每行结果储存在列表中并返回

    def list(self):
        ls = []
        ls.append('# ' * (self.size[0] + 2))	# 地图上边界
        for line in self.__map:
            li = '# '
            for k in line:
                if (k == 0):	# 0表示空白块
                    li += '  '
                elif (k == 1):	# 1表示食物
                    li += "\033[0;32m$\033[0m "
                elif (k == 2):	# 2表示炸弹
                    li += "\033[0;31m@\033[0m "
                elif (k == 3):	# 3表示蛇头
                    li += "\033[0;33m■\033[0m "
                elif (k == 4):# 4代表蛇的身体
                    li += "\033[0;36m■\033[0m "
            li += '#'
            ls.append(li)
        ls.append('# ' * (self.size[0] + 2))	# 地图下边界
        return ls

简单测试打印一下地图

ma = Map(20, 20)
ls = ma.list()
for line in ls:
    print(line)

在这里插入图片描述

炸弹的实现

对于单个炸弹, 其包含的信息有在地图中的位置x y剩余存在时间life
炸弹生成时位置应该保持随机, 并且只能在空白块处生成

class Bomb():
    def __init__(self, map : Map):
        self.x = randint(0, map.size[0] - 1)
        self.y = randint(0, map.size[1] - 1)
        while (map.read(self.x, self.y) != 0):	# 读取地图中该位置是否为空格
            self.x = randint(0, 
  • 14
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值