文章目录
写在前面
本期内容
- 基于pygame的AI版贪吃蛇小游戏
所需环境
- python
- pycharm或anaconda
- pygame
下载地址
需求分析
本游戏使用Pygame模块开发,不需要玩家操纵贪吃蛇,贪吃蛇会自动吃掉屏幕上随机出现的食物,每吃一个食物贪吃蛇长度增加一节。如果贪吃蛇撞到屏幕边缘或自己的身体,则游戏结束。游戏界面包括游戏区域和得分显示区域。
程序设计
import pygame
import sys
from random import randint
# 蛇运动的场地长宽
HEIGHT =25
WIDTH =25
SCREEN_X = HEIGHT *25
SCREEN_Y = WIDTH *25
FIELD_SIZE = HEIGHT * WIDTH
# 蛇头总是位于snake数组的第一个元素
HEAD =0# 用来代表不同东西的数字,由于矩阵上每个格子会处理成到达食物的路径长度,# 因此这三个变量间需要有足够大的间隔(>HEIGHT*WIDTH)
FOOD =0
UNDEFINED =(HEIGHT +1)*(WIDTH +1)
SNAKE =2* UNDEFINED
# 由于snake是一维数组,所以对应元素直接加上以下值就表示向四个方向移动
LEFT =-1
RIGHT =1
UP =-WIDTH
DOWN = WIDTH
# 错误码
ERR =-1111# 用一维数组来表示二维的东西# board表示蛇运动的矩形场地# 初始化蛇头在(1,1)的地方,第0行,HEIGHT行,第0列,WIDTH列为围墙,不可用# 初始蛇长度为1
board =[0]* FIELD_SIZE
snake =[0]*(FIELD_SIZE +1)
snake[HEAD]=1* WIDTH +1
snake_size =1
……(完整代码请下载后查看)
程序分析
这段代码是一个基于Python和pygame库实现的贪吃蛇游戏的核心逻辑部分。游戏在一个25x25大小的网格上进行,其中每个格子都有一个对应的索引值,用于表示蛇的位置、食物位置以及地图上的可达性。
首先,定义了一些全局变量,如游戏区域尺寸(HEIGHT, WIDTH)、屏幕尺寸(SCREEN_X, SCREEN_Y)、场地大小(FIELD_SIZE)以及方向常量LEFT, RIGHT, UP, DOWN等。蛇和临时蛇的位置信息分别存储在一维数组snake和tmpsnake中,初始时蛇长度为1,位于(1,1)的位置。同时设置了食物food的初始位置,并且定义了FOOD、UNDEFINED和SNAKE三个特殊的数值,用来在二维矩阵board中区分食物、未探索区域及蛇体。
游戏中包含多个关键函数:
is_cell_free(idx, psize, psnake)
:检查给定索引idx处的单元格是否为空,即不被蛇身覆盖。is_move_possible(idx, move)
:判断蛇能否向给定方向move移动。board_reset(psnake, psize, pboard)
:重置地图状态,将蛇体和食物标记出来,并将其他空地设置为可到达的未知距离。board_refresh(pfood, psnake, pboard)
:采用广度优先搜索算法更新地图中的路径长度,计算从每个非蛇体单元格到食物的最短距离。choose_shortest_safe_move(psnake, pboard)
和choose_longest_safe_move(psnake, pboard)
:根据当前地图数据,选择距离食物最近或最远的安全移动方向。is_tail_inside()
和follow_tail()
:通过虚拟操作判断蛇头是否可以朝蛇尾方向移动以避免死路,并找到这个方向。any_possible_move()
:当无明确安全方向时,随机选择一个可行的方向。shift_array(arr, size)
:移动数组元素,模拟蛇的身体沿指定方向移动。new_food()
:生成新的食物位置,确保不在蛇体内。make_move(pbest_move)
:执行实际的蛇移动操作,包括增加蛇长、更新蛇头位置、调整蛇身以及处理吃到食物的情况。virtual_shortest_move()
:进行一次虚拟移动,尝试寻找最短路径吃到食物并更新虚拟地图状态。find_safe_way()
:结合虚拟运行结果判断蛇与食物间的路径情况,并确定安全的下一步移动方向。
主循环中,程序不断检测用户输入事件(如退出或按下空格键重新开始),并依据上述函数计算出最佳移动方向,然后更新蛇的位置。如果蛇碰到自身或其他不可移动区域,则游戏结束,显示“YOU DEAD!”提示,并告知玩家按空格键重新开始。同时,实时显示当前分数(score)。
最后,
main()
函数包含了游戏的初始化、事件处理、画面渲染和游戏逻辑更新等内容,构成了整个贪吃蛇游戏的核心框架。
运行结果
系列文章
写在后面
我是一只有趣的兔子,感谢你的喜欢!
版权归原作者 Want595 所有, 如有侵权,请联系我们删除。