1.引言
贪吃蛇应该是大家小学时期玩过的经典游戏之一,它可以培养我们的反应速度和眼手协调能力。现在我们可以用代码来实现这个游戏,本文将详细介绍如何实现这个游戏。我们将用到 Python 编程语言、pygame 游戏库以及一些经典的算法来完成游戏。同时我们将讨论如何使用模块、类和函数来组织程序。在完成游戏的过程中,我们还将学习如何调试 Python 代码以及如何使用 Git 保存我们的代码。
2.环境准备
2.1 安装 Python3
我们需要安装 Python3,可以从Python 官网下载安装,也可以使用 Anaconda Python,它是一个科学计算 Python 发行版,已经包含了大部分常用的科学计算工具。
2.2 安装 pygame
我们使用 Pygame 来实现我们的游戏,Pygame 是一种面向 Python 的开放源代码库,用于编写多媒体应用程序,特别是电子游戏。可以通过以下命令在终端安装:
pip install pygame
2.3 创建项目目录
打开命令终端,创建项目目录,并创建文件 game.py。
mkdir snakegame
cd snakegame
touch game.py
2.4 项目结构
我们需要创建以下文件和目录:
.
├── food.py
├── game.py
├── snake.py
└── util.py
我们的主程序文件 game.py 将根据需求导入其它文件,其中 food.py 和 snake.py 包含食物和贪吃蛇的类定义,util.py 包含通用函数和常量定义。
3.实现食物
贪吃蛇游戏中,蛇需要吃食物才能增长,我们先实现食物。在 food.py 文件中创建 Food 类,它具有 x 和 y 属性表示位置,draw 方法在屏幕上绘制食物:
# food.py
import random
import pygame as pg
import util
class Food:
def __init__(self, snake):
self.x, self.y = self.new_position(snake)
def new_position(self, snake):
while True:
x, y = random.randrange(util.WIDTH), random.randrange(util.HEIGHT)
if (x, y) not in snake.body:
return x, y
def draw(self, screen):
pg.draw.rect(screen, util.RED, (self.x * util.CELL_SIZE, self.y * util.CELL_SIZE,
util.CELL_SIZE, util.CELL_SIZE))
Food 类的构造方法需要一个 Snake 的实例作为参数,它使用 new_position 方法来获得随机位置,避免食物出现在蛇的身体上。draw 方法绘制一个红色的矩形,表示食物。
4.实现贪吃蛇
4.1 蛇的初始化
在 snake.py 文件中创建 Snake 类,它具有 body、direction 属性和 move 方法。body 属性是一个列表,用于存储蛇的所有身体部分的位置。构造方法来初始化蛇的起始位置,它的长度为 3。
# snake.py
import util
class Snake:
def __init__(self):
self.body = [(util.WIDTH // 2, util.HEIGHT // 2),
(util.WIDTH // 2, util.HEIGHT // 2 + 1),
(util.WIDTH // 2, util.HEIGHT // 2 + 2)]
self.direction = util.Direction.UP
def move(self, game):
head = self.body[0]
if self.direction == util.Direction.UP:
new_head = (head[0], head[1] - 1)
elif self.direction == util.Direction.DOWN:
new_head = (head[0], head[1] + 1)
elif self.direction == util.Direction.LEFT:
new_head = (head[0] - 1, head[1])
elif self.direction == util.Direction.RIGHT:
new_head = (head[0] + 1, head[1])
self.body.insert(0, new_head)
if not game.food:
game.new_food()
if new_head == game.food.position:
game.score += 1
game.food = None
else:
self.body.pop()
Snake 类的 move 方法更新蛇的身体位置,同时检查蛇是否吃到了食物,如果吃到了,蛇会变长一段,分数也会增加。
4.2 控制蛇的移动
我们需要一个方法来控制贪吃蛇的移动。这个方法将等待用户的输入来改变方向。我们可以在 game.py 中实现它。
# game.py
import pygame as pg
import food
import snake
import util
class Game:
def __init__(self):
pg.init()
self.screen = pg.display.set_mode((util.WIDTH * util.CELL_SIZE, util.HEIGHT * util.CELL_SIZE))
pg.display.set_caption('贪吃蛇')
self.clock = pg.time.Clock()
self.snake = snake.Snake()
self.food = None
self.score = 0
self.new_food()
def event_loop(self):
for event in pg.event.get():
if event.type == pg.QUIT:
self.quit()
elif event.type == pg.KEYDOWN:
if event.key == pg.K_UP:
self.snake.direction = util.Direction.UP
elif event.key == pg.K_DOWN:
self.snake.direction = util.Direction.DOWN
elif event.key == pg.K_LEFT:
self.snake.direction = util.Direction.LEFT
elif event.key == pg.K_RIGHT:
self.snake.direction = util.Direction.RIGHT
def update(self):
self.snake.move(self)
if self.is_over():
self.quit()
def draw(self):
self.screen.fill(util.BLACK)
pg.draw.rect(self.screen, util.WHITE, (0, 0, util.WIDTH * util.CELL_SIZE, util.HEIGHT * util.CELL_SIZE), 1)
self.snake.draw(self.screen)
if self.food:
self.food.draw(self.screen)
self.draw_score()
pg.display.update()
def draw_score(self):
font = pg.font.SysFont('arial', 18)
text = font.render('得分: %d' % self.score, True, util.WHITE)
self.screen.blit(text, (10, util.HEIGHT * util.CELL_SIZE - 20))
def new_food(self):
self.food = food.Food(self.snake)
def is_over(self):
return (self.snake.body[0][0] < 0 or self.snake.body[0][0] >= util.WIDTH or
self.snake.body[0][1] < 0 or self.snake.body[0][1] >= util.HEIGHT or
self.snake.body[0] in self.snake.body[1:])
def quit(self):
pg.quit()
quit()
def main():
game = Game()
while True:
game.event_loop()
game.update()
game.draw()
game.clock.tick(util.FPS)
if __name__ == '__main__':
main()
event_loop 方法等待用户的输入,并改变蛇的方向。update 方法更新蛇的位置和食物,同时检查游戏是否结束。draw 方法绘制游戏场景和得分。
5.结束
在这篇文章中,我们学习了如何使用 Python 以及 pygame 库来实现贪吃蛇游戏。我们还讨论了如何使用 Git 来管理我们的代码。在此基础上,我们可以扩展这个游戏,例如增加难度和级别、增加游戏声音和更好的图形界面等等。希望你可以继续探索和学习 Python 编程语言。