跳转目录
前言
该程序未使用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,