今天做一个Python版的贪吃蛇游戏,主要用到了pygame包。写这个程序的目的是针对Python语言练练手。使用的开发工具是Pycharm,程序代码如下,另外代码会同步到github一份。原创作品,未经允许不要转载。

动画效果:

python贪吃蛇写好了运行不了 贪吃蛇编程python_方向键

python贪吃蛇写好了运行不了 贪吃蛇编程python_初始化_02

python贪吃蛇写好了运行不了 贪吃蛇编程python_初始化_03

python贪吃蛇写好了运行不了 贪吃蛇编程python_初始化_04

python贪吃蛇写好了运行不了 贪吃蛇编程python_初始化_05

python贪吃蛇写好了运行不了 贪吃蛇编程python_python贪吃蛇程序_06

python贪吃蛇写好了运行不了 贪吃蛇编程python_python贪吃蛇写好了运行不了_07

python贪吃蛇写好了运行不了 贪吃蛇编程python_python贪吃蛇写好了运行不了_08

python贪吃蛇写好了运行不了 贪吃蛇编程python_python贪吃蛇写好了运行不了_09

python贪吃蛇写好了运行不了 贪吃蛇编程python_方向键_10

python贪吃蛇写好了运行不了 贪吃蛇编程python_python贪吃蛇写好了运行不了_11

python贪吃蛇写好了运行不了 贪吃蛇编程python_python贪吃蛇写好了运行不了_12

python贪吃蛇写好了运行不了 贪吃蛇编程python_python贪吃蛇写好了运行不了_13

python贪吃蛇写好了运行不了 贪吃蛇编程python_初始化_14

python贪吃蛇写好了运行不了 贪吃蛇编程python_初始化_15

# 4. 实现主体函数循环

def main(): # 4.01 使用全局变量 global snakeBody global infoList # 4.02 初始化窗口 init_playSurface() # 4.03 进入程序主循环 while True : init_span() # 4.03.01 初始化背景 init_snake() # 4.03.03 初始化蛇 init_apple() # 4.03.02 初始化苹果 display() # 4.03.04 更新界面显示(画的新图像需要重新显示) clear_score() # 4.03.05 清空成绩 # 4.03.06 循环以完成蛇不断地爬行 while True: # 每次循环,意味着蛇爬行一步,并且在每次循环中要读取键盘所按方向键,未按方向键则按原来方向继续爬行,如果改变了方向,则调整爬行方向 display() # 4.03.06.01 更新显示画面 exec_delay() # 4.03.06.02 爬行动作频次时钟控制,实现每一步之间的延时 getKeyboardDirection() # 4.03.06.03 读取蛇运动方向(当键盘按方向键后,direction 值会及时更新) nextSnakeHead = get_next_head_with_direction() # 4.03.06.04 得到下步蛇头要走的位置 if is_next_step_touch_the_wall(nextSnakeHead): break; # 4.03.06.05 遇到围墙,即将越界则结束 本局结束 if is_snake_next_head_cover_apple(nextSnakeHead): # 4.03.06.06 # 如果我们的贪吃蛇的位置和苹果重合了,说明吃到了苹果 add_snake_head(nextSnakeHead) # 4.03.06.06.01 新的蛇头数据放入蛇列表数据开头 draw_snake_head() # 4.03.06.06.02 画新的蛇头(身体不需要重新画) get_new_apple_position() # 4.03.06.06.03 # 获取新苹果位置 draw_apple() # 4.03.06.06.04 # 画新的苹果 increment_score() # 增加成绩 else : # 4.03.06.07 如果下一步没有遇到苹果 也没有遇到墙,那么可能是遇到了 空白区域 或者 遇到了自己的身体 clear_snake_tail() # 4.03.06.07.01 前行一步 意味着 自己原来的尾巴位置 应该 变成空白区域,所以删掉旧的尾巴 drop_snake_tail() # 4.03.06.07.02 if is_snake_next_head_cover_body(nextSnakeHead): break # 4.03.06.07.03 如果碰到了自己的身体则 本局结束 else :# 4.03.06.07.04 什么都没有碰到也没吃到苹果,则蛇头顺利前行一步,下一个位置变成蛇头 add_snake_head(nextSnakeHead) # 4.03.06.07.04.01 新的蛇头数据放入蛇列表数据开头 draw_snake_head() # 4.03.06.07.04.02 画新的蛇头(身体不需要重新画) # 4.03.07 打印游戏信息,包括分数 display_info(get_game_over_info(),"notosanscjkjp", 20, yellow, black)# 程序入口if __name__ == '__main__': main()

# 4.01 使用全局变量 global snakeBody global infoList # 4.02 初始化窗口 init_playSurface() # 4.03 进入程序主循环 while True : init_span() # 4.03.01 初始化背景 init_snake() # 4.03.03 初始化蛇 init_apple() # 4.03.02 初始化苹果 display() # 4.03.04 更新界面显示(画的新图像需要重新显示) clear_score() # 4.03.05 清空成绩 # 4.03.06 循环以完成蛇不断地爬行 while True: # 每次循环,意味着蛇爬行一步,并且在每次循环中要读取键盘所按方向键,未按方向键则按原来方向继续爬行,如果改变了方向,则调整爬行方向 display() # 4.03.06.01 更新显示画面 exec_delay() # 4.03.06.02 爬行动作频次时钟控制,实现每一步之间的延时 getKeyboardDirection() # 4.03.06.03 读取蛇运动方向(当键盘按方向键后,direction 值会及时更新) nextSnakeHead = get_next_head_with_direction() # 4.03.06.04 得到下步蛇头要走的位置 if is_next_step_touch_the_wall(nextSnakeHead): break; # 4.03.06.05 遇到围墙,即将越界则结束 本局结束 if is_snake_next_head_cover_apple(nextSnakeHead): # 4.03.06.06 # 如果我们的贪吃蛇的位置和苹果重合了,说明吃到了苹果 add_snake_head(nextSnakeHead) # 4.03.06.06.01 新的蛇头数据放入蛇列表数据开头 draw_snake_head() # 4.03.06.06.02 画新的蛇头(身体不需要重新画) get_new_apple_position() # 4.03.06.06.03 # 获取新苹果位置 draw_apple() # 4.03.06.06.04 # 画新的苹果 increment_score() # 增加成绩 else : # 4.03.06.07 如果下一步没有遇到苹果 也没有遇到墙,那么可能是遇到了 空白区域 或者 遇到了自己的身体 clear_snake_tail() # 4.03.06.07.01 前行一步 意味着 自己原来的尾巴位置 应该 变成空白区域,所以删掉旧的尾巴 drop_snake_tail() # 4.03.06.07.02 if is_snake_next_head_cover_body(nextSnakeHead): break # 4.03.06.07.03 如果碰到了自己的身体则 本局结束 else :# 4.03.06.07.04 什么都没有碰到也没吃到苹果,则蛇头顺利前行一步,下一个位置变成蛇头 add_snake_head(nextSnakeHead) # 4.03.06.07.04.01 新的蛇头数据放入蛇列表数据开头 draw_snake_head() # 4.03.06.07.04.02 画新的蛇头(身体不需要重新画) # 4.03.07 打印游戏信息,包括分数 display_info(get_game_over_info(),"notosanscjkjp", 20, yellow, black)# 程序入口if __name__ == '__main__': main()