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

跳转目录

  • 前言
  • 运行示例
  • 程序分析
    • 捕获键盘操作
    • 输出游戏画面
  • 代码分析一
    • 安装运行环境
    • 游戏地图的实现
    • 炸弹的实现
    • 食物的实现
    • 蛇的实现
  • 初步测试
  • 键盘控制的实现
  • 主程序
    • game函数
    • 图形界面显示分数, 得分
    • 结束函数
    • 游戏主函数
  • 源码下载

前言

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

运行示例

贪吃蛇Python版 源码+代码分析_第1张图片


程序分析

捕获键盘操作

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)

贪吃蛇Python版 源码+代码分析_第2张图片

炸弹的实现

对于单个炸弹, 其包含的信息有在地图中的位置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, 

你可能感兴趣的:(python,游戏程序,经验分享)