Python贪吃蛇小游戏源码?其实没那么难!

嘿,朋友们!今天想跟大家聊聊一个经典得不能再经典的游戏——贪吃蛇!

是不是瞬间回到了那个只有黑白屏幕,或者顶多带点绿色的诺基亚时代?(暴露年龄了喂!)

那个简单的、一条线扭来扭去吃豆豆的游戏,简直是魔性上瘾!

那么,你想不想知道,用现在流行的Python语言,怎么把这个小游戏给“复刻”出来呢?

别担心,今天不是那种让你头大的、一行行跟着敲代码的硬核教程。咱们主要是轻松地扒一扒它的核心源码思路,让你大概明白:“哦!原来是这么回事儿!”

相信我,看完这篇,你也能跟别人吹牛说:“贪吃蛇?我懂它的代码逻辑!”(是不是很酷!)

一、 准备工作:我们的“画板”和“画笔”

首先,做游戏得有工具,对吧?

在Python世界里,搞这种小游戏,我们通常会请出一位大神——pygame库!

你可以把它想象成一个超级方便的工具箱,里面有画图、处理键盘鼠标事件、播放声音等各种我们需要的工具。(简直是懒人福音!)

怎么拥有它?

很简单,打开你的命令行(就是那个黑框框或者终端),输入:

pip install pygame

回车,等它跑完,搞定!是不是比想象中简单?(真的超简单!)

有了pygame,我们就有了画布(游戏窗口)和画笔(绘图函数),可以开始创作了!

二、 搭个舞台:创建游戏窗口

光有工具不行,我们得有个地方来展示我们的游戏吧?

这就是游戏窗口!

用pygame创建窗口非常直接:

```python
import pygame
import sys # 导入sys模块,方便退出

初始化pygame(这是必须的步骤!)

pygame.init()

设置窗口大小(比如600像素宽,400像素高)

screen_width = 600
screen_height = 400
screen = pygame.display.set_mode((screen_width, screen_height))

给窗口起个名字

pygame.display.set_caption('我的贪吃蛇大冒险!')

设置一个背景色(比如黑色)

black = pygame.Color(0, 0, 0)

这里是游戏主循环,后面会讲,现在先让窗口能展示出来并能关闭

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit() # 安全退出

```

看,就这么几行代码,一个黑色的、标题为“我的贪吃蛇大冒险!”的窗口就出来了!你可以运行试试!(虽然现在里面空空如也)

三、 主角登场:蛇与食物

舞台搭好了,该请主角上场了!

1. 贪吃蛇

蛇是什么?在最简单的版本里,它就是一连串的小方块。

我们怎么表示这一串方块呢?用列表(List)最合适不过了!列表里的每个元素,可以代表蛇身体一个方块的坐标(x, y)。

```python

蛇的初始位置和身体(假设每个方块10x10像素)

初始让它有三节,在屏幕左上角附近

snake_pos = [100, 50] # 蛇头的位置
snake_body = [[100, 50], [90, 50], [80, 50]] # 蛇身列表,第一个是头
snake_color = pygame.Color(0, 255, 0) # 给蛇一个绿色的颜色
direction = 'RIGHT' # 初始方向向右
change_to = direction # 记录将要改变的方向
```

看到了吗?snake_body这个列表就存储了蛇的所有部分的坐标。蛇头是列表的第一个元素 [100, 50]。

2. 食物

食物就更简单了,通常就是一个单独的小方块。

关键在于,它需要随机出现在屏幕的不同位置。

```python
import random # 需要用到随机数

食物的位置(也用坐标表示)

确保食物出现在10x10的网格上

food_pos = [random.randrange(1, (screen_width//10)) * 10,
random.randrange(1, (screen_height//10)) * 10]
food_color = pygame.Color(255, 0, 0) # 给食物一个红色的颜色
food_spawn = True # 标记是否需要生成食物
```

这里用random.randrange来生成随机的x和y坐标,//10再*10是为了让它出现在我们假定的10x10网格上,这样蛇头正好能对齐它。

四、 游戏动起来:核心逻辑

好了,演员就位,现在要让戏演起来!这就是游戏的核心逻辑。

1. 响应操作:让蛇听话

我们得让玩家能控制蛇的方向吧?通常用键盘的上下左右箭头。

pygame可以轻松捕捉键盘按键事件:

```python

在游戏主循环里,处理事件的部分:

for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 检测按键事件
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP and direction != 'DOWN': # 按下上箭头,且当前不是向下
change_to = 'UP'
if event.key == pygame.K_DOWN and direction != 'UP': # 按下下箭头,且当前不是向上
change_to = 'DOWN'
if event.key == pygame.K_LEFT and direction != 'RIGHT': # 按下左箭头,且当前不是向右
change_to = 'LEFT'
if event.key == pygame.K_RIGHT and direction != 'LEFT': # 按下右箭头,且当前不是向左
change_to = 'RIGHT'
# 这里加了个小判断,防止蛇直接180度掉头(比如正在向右,不能立刻向左)
```

这段代码的意思是:如果检测到按键被按下,就判断是哪个方向键,然后更新change_to变量。

2. 蛇的移动:蠕动前进

蛇怎么动?其实就是更新坐标!

根据当前的方向(direction),计算出蛇头下一个位置的坐标。

然后,把这个新坐标插入到snake_body列表的最前面(成为新的蛇头),同时,如果蛇没有吃到食物,就把列表的最后一个元素(蛇尾)删掉。这样看起来就像蛇前进了!

```python

在主循环里,更新游戏状态的部分(通常在处理完事件之后):

更新方向(防止在一个循环内多次改变方向导致混乱)

direction = change_to

根据方向更新蛇头坐标

if direction == 'UP':
snake_pos[1] -= 10 # y坐标减小
elif direction == 'DOWN':
snake_pos[1] += 10 # y坐标增大
elif direction == 'LEFT':
snake_pos[0] -= 10 # x坐标减小
elif direction == 'RIGHT':
snake_pos[0] += 10 # x坐标增大

把新的蛇头位置插入列表开头

snake_body.insert(0, list(snake_pos)) # 注意要用list()复制一份,不然会有问题

检查是否吃到食物

if snake_pos[0] == food_pos[0] and snake_pos[1] == food_pos[1]:
# 吃到了!
food_spawn = False # 食物被吃了,标记需要重新生成
# 蛇身体变长,所以这次不删除蛇尾
else:
# 没吃到,删除蛇尾
snake_body.pop()

如果食物被吃了,重新生成一个

if not food_spawn:
food_pos = [random.randrange(1, (screen_width//10)) * 10,
random.randrange(1, (screen_height//10)) * 10]
food_spawn = True # 标记新食物已生成
```

这段逻辑有点绕?多看几遍!核心就是:更新蛇头 -> 插入新头 -> 判断是否吃食物 ->(没吃)删除蛇尾 / (吃了)不删蛇尾并生成新食物。

3. 碰撞检测:游戏结束的条件

什么时候游戏结束?

  • 撞到墙壁(超出屏幕边界)
  • 撞到自己的身体

```python

在更新完蛇的位置之后,进行碰撞检测:

检查撞墙

if snake_pos[0] < 0 or snake_pos[0] > screen_width-10: # 撞左右墙
game_over() # 调用游戏结束处理函数
if snake_pos[1] < 0 or snake_pos[1] > screen_height-10: # 撞上下墙
game_over()

检查撞自己身体

从列表第二个元素开始检查(索引为1),因为第一个是刚加进去的头

for block in snake_body[1:]:
if snake_pos[0] == block[0] and snake_pos[1] == block[1]:
game_over() # 撞到自己了

game_over() 函数大概是这样的:

def game_over():
# 这里可以显示"Game Over"文字,然后退出游戏
my_font = pygame.font.SysFont('times new roman', 50) # 创建字体对象
game_over_surface = my_font.render('Game Over!', True, pygame.Color(255, 255, 255)) # 渲染文字
game_over_rect = game_over_surface.get_rect()
game_over_rect.midtop = (screen_width/2, screen_height/4) # 设置显示位置
screen.blit(game_over_surface, game_over_rect) # 画到屏幕上
pygame.display.flip() # 刷新显示
time.sleep(2) # 暂停2秒
pygame.quit()
sys.exit()

(别忘了导入 time 模块:import time)

```

判断逻辑很直接:检查蛇头坐标是否超出了 0 到 screen_width-10(或 screen_height-10)的范围,或者蛇头坐标是否和身体列表(除头之外)中的某个坐标完全一样。

4. 绘制一切:眼见为实

逻辑都处理完了,最后一步就是把蛇和食物画到我们之前创建的那个黑色窗口上!

```python

在主循环的最后,刷新屏幕之前:

先用背景色填充整个屏幕(否则会有重影)

screen.fill(black)

画蛇(遍历蛇身列表,每个坐标画一个方块)

for pos in snake_body:
# pygame.Rect(x, y, width, height) 定义一个矩形区域
pygame.draw.rect(screen, snake_color, pygame.Rect(pos[0], pos[1], 10, 10))

画食物

pygame.draw.rect(screen, food_color, pygame.Rect(food_pos[0], food_pos[1], 10, 10))

(这里还可以加上画分数、画边界线等等)

最后,刷新屏幕!!!(再次强调)

pygame.display.flip()
```

pygame.draw.rect() 是我们的主力画笔,告诉它在哪画(screen)、用什么颜色(snake_color 或 food_color)、画一个什么样的矩形(pygame.Rect(...))。

5. 控制游戏速度

如果直接运行,你会发现蛇跑得飞快!我们需要控制一下游戏节奏。

pygame提供了一个时钟对象来控制帧率(FPS - Frames Per Second)。

```python

在初始化pygame之后,创建时钟对象

fps_controller = pygame.time.Clock()

在主循环的最后,刷新屏幕之后,加上:

控制游戏速度(比如每秒15帧)

fps_controller.tick(15)
```

fps_controller.tick(15) 会让游戏循环每秒最多执行15次,这样速度就可控了。

五、 整合:游戏主循环

现在,把上面所有的逻辑(事件处理、状态更新、碰撞检测、绘制)都放进一个大大的 while True: 循环里,这就是我们的游戏主循环!

```python

... (前面的初始化代码) ...

while True:
# 1. 处理玩家输入事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
# ... (处理方向键的代码) ...

```

这个循环会一直跑下去,直到玩家关闭窗口或者游戏结束。

六、 一点感想(纯属个人瞎聊)

怎么样?把贪吃蛇拆解开来看,是不是感觉也还好?(并没有想象中那么遥不可及!)

当然啦,上面给出的只是最核心、最骨架的代码片段和思路。一个完整的游戏还需要处理更多细节,比如:

  • 显示得分。
  • 游戏开始界面、结束界面做得更友好。
  • 增加难度(比如速度随得分增加而变快)。
  • 甚至可以加点音效!

但万变不离其宗,核心的移动、吃食物、碰撞检测逻辑就是这些。

说实话,第一次写这种游戏代码,肯定会遇到各种奇奇怪怪的问题。(比如坐标算错、蛇莫名其妙消失、碰撞逻辑不生效等等,别问我怎么知道的,都是泪啊!)

但这就是编程的乐趣所在,不是吗?

遇到问题,解决问题,然后看着自己写的小蛇在屏幕上灵活地跑起来,那种成就感,啧啧!(谁懂!)

所以,如果你对编程感兴趣,或者只是想找点乐子,不妨真的动手试试看。把这些代码片段拼凑起来,运行一下,然后尝试去修改它、扩展它。

比如,能不能让蛇换个颜色?能不能让食物变成圆形?能不能加个暂停功能?

玩起来!代码这东西,就是要动手敲,动手改,才能真正掌握它!

好了,今天就跟大家“扒”到这里。希望这篇不那么“技术”、有点“话痨”的分享,能让你对Python写小游戏这件事,有那么一点点感觉!

记住,编程不是什么高深莫测的东西,它也可以很有趣!加油,未来的大神们!

posted @ 2025-05-14 11:03  developerdream  阅读(67)  评论(0)    收藏  举报