Python小游戏时间!手把手教你写个贪吃蛇(附源码详解)
嘿,朋友们!今天我们来搞点好玩的!
还记得当年在诺基亚上玩贪吃蛇的日子吗?那可是经典中的经典啊!简直是打发时间的利器!!!
我刚学编程那会儿,觉得能自己写个游戏出来简直酷毙了。第一个磕磕绊绊搞出来的小项目,好像就是这个贪吃蛇。虽然简陋,但当时那个成就感啊,现在还记得!(满满的回忆)
所以今天,咱就用Python,这个现在超火的语言,来复刻一下这个经典小游戏。别担心,不会太复杂,主要就是用一个叫做 Pygame 的库。这个库对新手挺友好的,用来做2D小游戏再合适不过了。
咱们的目标是做一个基础版的贪吃蛇:能用方向键控制蛇移动,吃到食物会变长,撞到墙或者自己就游戏结束。听起来是不是还挺像那么回事儿的?
Let's Go!
准备工作(超简单!)
首先,你电脑上得有Python环境哈。(这个应该不用我多说了吧?没有的话赶紧去官网下一个装上!)
然后,就是安装我们今天的主角——Pygame库。
打开你的命令行(Windows用户可能是cmd或者PowerShell,Mac/Linux用户是终端),然后敲下面这行命令:
pip install pygame
看到类似 "Successfully installed pygame-..." 的提示就说明OK了!搞定!就这么简单!!!
核心思路拆解
在开始敲代码之前,我们先捋一捋思路。一个游戏跑起来,大概是这么个流程:
- 初始化游戏:把游戏窗口创建好,设置一些基本参数,比如窗口大小啊,标题啊之类的。
- 开始游戏循环(Game Loop):这是游戏的核心!一个死循环,游戏不停地在这个循环里跑,直到玩家选择退出或者游戏结束。
- 处理玩家输入:在循环里,要不断检查玩家有没有做什么操作,比如按键盘啊,点鼠标啊。对于贪吃蛇,我们主要关心方向键。
- 更新游戏状态:根据玩家的输入或者游戏自身的逻辑(比如蛇自己往前走),更新游戏里各个元素的状态。比如蛇的位置变了,分数加了等等。
- 绘制游戏画面:把更新后的游戏状态显示到屏幕上。比如把蛇画出来,把食物画出来,把分数显示出来。
- 控制游戏速度:不能让游戏跑得飞快,也不能太慢,得有个东西控制一下节奏。
这个游戏循环的概念(处理输入 -> 更新状态 -> 绘制画面 -> 再循环)简直是所有游戏的基础!(超级重要!)理解了这个,很多游戏的基本原理就通了。
对于贪吃蛇,具体点说:
- 蛇怎么表示?可以用一串坐标点来表示蛇的身体,列表最合适了!列表第一个元素是蛇头。
- 蛇怎么动?每次循环,根据当前方向,在列表前面插入一个新的蛇头坐标,同时(如果没吃到食物)把列表最后一个坐标(蛇尾)删掉。这就实现了移动的效果!
- 食物怎么搞?随机生成一个坐标点,注意别生成在蛇身上就行。
- 怎么判断吃到食物?看蛇头的坐标是不是和食物的坐标重合了。
- 怎么判断游戏结束?看蛇头是不是撞到边界了,或者是不是撞到自己身体的某一部分了(坐标重合)。
思路清晰了,代码就好写了!
上代码!(注释超详细)
好了好了,我知道你们等不及了。下面是Python代码,我加了很多注释,尽量让大家看明白每一步是干啥的。
```python
import pygame
import sys
import random
import time
检查 Pygame 初始化是否成功
check_errors = pygame.init()
if check_errors[1] > 0:
print(f"(!) Had {check_errors[1]} errors initializing pygame, exiting...")
sys.exit(-1)
else:
print("(+) Pygame initialized successfully!")
屏幕大小
frame_size_x = 720
frame_size_y = 480
创建游戏窗口
pygame.display.set_caption('贪吃蛇小游戏 by Python')
game_window = pygame.display.set_mode((frame_size_x, frame_size_y))
定义颜色 (RGB)
black = pygame.Color(0, 0, 0)
white = pygame.Color(255, 255, 255)
red = pygame.Color(255, 0, 0)
green = pygame.Color(0, 255, 0)
blue = pygame.Color(0, 0, 255)
游戏参数
fps_controller = pygame.time.Clock()
snake_pos = [100, 50] # 蛇头初始位置
蛇身体,初始只有一个方块(蛇头)
注意!这里用列表的列表,每个内部列表代表一个身体块的 [x, y] 坐标
snake_body = [[100, 50], [90, 50], [80, 50]]
食物位置 - 随机生成
食物的坐标必须是10的倍数,因为蛇的移动单位和身体块大小都是10
food_pos = [random.randrange(1, (frame_size_x//10)) * 10,
random.randrange(1, (frame_size_y//10)) * 10]
food_spawn = True # 是否生成新食物的标志
初始方向
direction = 'RIGHT'
change_to = direction # 记录将要改变的方向
初始分数
score = 0
游戏结束标志
game_over = False
游戏结束函数
def show_game_over():
my_font = pygame.font.SysFont('simhei', 90) # 使用中文字体 'simhei' (宋体也可以 'simsun')
game_over_surface = my_font.render('你挂了!', True, red)
game_over_rect = game_over_surface.get_rect()
game_over_rect.midtop = (frame_size_x/2, frame_size_y/4)
game_window.blit(game_over_surface, game_over_rect)
show_score(0, red, 'times', 20) # 显示最终分数
pygame.display.flip() # 刷新屏幕显示 Game Over 信息
time.sleep(3) # 暂停3秒
pygame.quit() # 退出 Pygame
sys.exit() # 退出程序
显示分数函数
def show_score(choice, color, font, size):
score_font = pygame.font.SysFont(font, size)
score_surface = score_font.render('分数 : ' + str(score), True, color)
score_rect = score_surface.get_rect()
if choice == 1: # choice 1 代表显示在游戏进行中的左上角
score_rect.midtop = (frame_size_x/10, 15)
else: # 其他情况(比如游戏结束后)显示在中间下方
score_rect.midtop = (frame_size_x/2, frame_size_y/1.25)
game_window.blit(score_surface, score_rect)
# pygame.display.flip() # 注意:这里一般不在独立函数里刷新,由主循环统一刷新
--- 游戏主循环开始! ---
while not game_over:
# 处理玩家输入事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果点击了关闭按钮
pygame.quit()
sys.exit()
# 如果按下了键盘按键
elif event.type == pygame.KEYDOWN:
# W/上箭头 -> 向上
if (event.key == pygame.K_UP or event.key == pygame.K_w) and direction != 'DOWN':
change_to = 'UP'
# S/下箭头 -> 向下
if (event.key == pygame.K_DOWN or event.key == pygame.K_s) and direction != 'UP':
change_to = 'DOWN'
# A/左箭头 -> 向左
if (event.key == pygame.K_LEFT or event.key == pygame.K_a) and direction != 'RIGHT':
change_to = 'LEFT'
# D/右箭头 -> 向右
if (event.key == pygame.K_RIGHT or event.key == pygame.K_d) and direction != 'LEFT':
change_to = 'RIGHT'
# Esc键 -> 退出游戏
if event.key == pygame.K_ESCAPE:
pygame.event.post(pygame.event.Event(pygame.QUIT))
--- 游戏主循环结束 ---
(理论上正常退出是通过sys.exit(),所以这里几乎不会执行到)
```
把上面这段代码保存成一个 .py 文件(比如 snake_game.py),然后在命令行里运行 python snake_game.py,就可以看到效果啦!
还能怎么玩?(进阶想法)
这个只是个超级基础的版本哈!如果你觉得不过瘾,完全可以自己动手加点东西:
- 加点音效:吃到食物给个"叮"声,撞墙给个"砰"声,游戏体验立马不一样!Pygame 支持加载和播放声音文件。
- 难度递增:让蛇越吃越快!比如每吃到5个食物,就把 fps_controller.tick() 的值调高一点。
- 美化一下:现在的蛇和食物都是方块,有点单调。可以试试用图片来代替,或者给蛇头加个不同的颜色。
- 计分板/最高分记录:把最高分存到文件里,每次游戏结束后显示出来,更有挑战性!
- 障碍物:在地图上随机生成一些障碍物,撞到也算输。
你看,一个小小的贪吃蛇,也能玩出很多花样来!
结语
好啦,一个简单的Python贪吃蛇游戏就这么诞生了!从想法到代码实现,是不是感觉没那么遥不可及?
编程这东西,尤其是做游戏,看着可能挺唬人,但拆解开来,一步一步来,你会发现很多原理其实并不复杂。关键是要动手去敲!去尝试!光看不练是学不会游泳的,编程也是一个道理。(老生常谈但确实是真理!)
希望这篇有点啰嗦但应该还算详细的文章能帮到你,无论你是编程新手,还是想找点乐子,或者只是对游戏开发有点好奇。
自己动手写出来的第一个小游戏,那种感觉真的很棒!快去试试吧!玩得开心!!!

浙公网安备 33010602011771号