今天我们将一起使用Python和Pygame库制作一个经典的贪吃蛇游戏。通过这个项目,你不仅能学习游戏开发的基本知识,还能提升编程技能。让我们开始吧!
1. 环境准备与基础设置
我们需要安装Pygame库:
pip install pygame
现在让我们创建游戏的基础框架:
import pygame import random import sys # 初始化Pygame pygame.init() # 定义颜色 WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) BLACK = (0, 0, 0) # 游戏设置 WINDOW_WIDTH = 800 WINDOW_HEIGHT = 600 GRID_SIZE = 20 GRID_WIDTH = WINDOW_WIDTH // GRID_SIZE GRID_HEIGHT = WINDOW_HEIGHT // GRID_SIZE # 创建游戏窗口 screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption('贪吃蛇') # 设置游戏时钟 clock = pygame.time.Clock()
2. 蛇的类设计
我们创建一个Snake类来管理蛇的行为:
class Snake: def __init__(self): self.positions = [(GRID_WIDTH//2, GRID_HEIGHT//2)] # 蛇的初始位置 self.direction = (1, 0) # 初始方向向右 self.length = 1 self.score = 0 def get_head_position(self): return self.positions[0] def update(self): current = self.get_head_position() x, y = self.direction new = ((current[0] + x) % GRID_WIDTH, (current[1] + y) % GRID_HEIGHT) # 检查是否撞到自己 if new in self.positions[2:]: return False # 游戏结束 self.positions.insert(0, new) if len(self.positions) > self.length: self.positions.pop() return True def reset(self): self.positions = [(GRID_WIDTH//2, GRID_HEIGHT//2)] self.direction = (1, 0) self.length = 1 self.score = 0 def handle_keys(self): 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 self.direction != (0, 1): self.direction = (0, -1) elif event.key == pygame.K_DOWN and self.direction != (0, -1): self.direction = (0, 1) elif event.key == pygame.K_LEFT and self.direction != (1, 0): self.direction = (-1, 0) elif event.key == pygame.K_RIGHT and self.direction != (-1, 0): self.direction = (1, 0)
3. 食物类设计
class Food: def __init__(self): self.position = (0, 0) self.spawn() def spawn(self): self.position = (random.randint(0, GRID_WIDTH-1), random.randint(0, GRID_HEIGHT-1))
4. 主游戏循环
让我们将所有部分组合在一起:
def main(): snake = Snake() food = Food() while True: snake.handle_keys() # 更新蛇的位置 if not snake.update(): print(f"游戏结束!得分:{snake.score}") snake.reset() food.spawn() continue # 检查是否吃到食物 if snake.get_head_position() == food.position: snake.length += 1 snake.score += 10 food.spawn() # 绘制游戏画面 screen.fill(BLACK) # 绘制蛇 for pos in snake.positions: pygame.draw.rect(screen, GREEN, (pos[0]*GRID_SIZE, pos[1]*GRID_SIZE, GRID_SIZE-2, GRID_SIZE-2)) # 绘制食物 pygame.draw.rect(screen, RED, (food.position[0]*GRID_SIZE, food.position[1]*GRID_SIZE, GRID_SIZE-2, GRID_SIZE-2)) # 显示分数 font = pygame.font.Font(None, 36) score_text = font.render(f'Score: {snake.score}', True, WHITE) screen.blit(score_text, (10, 10)) pygame.display.update() clock.tick(10) # 控制游戏速度 if __name__ == '__main__': main()
小贴士:
-
游戏速度通过
clock.tick()
控制,数值越大蛇移动越快 -
穿墙效果是通过取模运算实现的
-
碰撞检测包括边界检查和自身碰撞检查
5. 游戏优化建议
- 添加难度等级:
def adjust_speed(score): base_speed = 10 return min(base_speed + score // 50, 20) # 随分数提升速度,最快20帧
- 添加音效:
# 加载音效 eat_sound = pygame.mixer.Sound('eat.wav') crash_sound = pygame.mixer.Sound('crash.wav') # 在相应位置播放 eat_sound.play() # 吃到食物时 crash_sound.play() # 撞到自己时
实现要点总结:
-
使用网格系统简化移动和碰撞检测
-
合理的类设计让代码更清晰
-
通过事件处理实现键盘控制
-
使用循环更新游戏状态
-
注意游戏性能优化
最后,这里免费分享给大家一套免费的学习资料,包含视频、源码/电子书,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以加我微信一起来学习交流。
① Python方向的学习路线图
,清楚各个方向要学什么东西
② 100多节Python课程视频
,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例
,学习不再是只会理论
④ Python漫画教程
,手机也能学习
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
**学习资源已打包,需要的小伙伴可以戳这里【学习资源】