打造你自己的贪吃蛇游戏:Python 初学者教程
如果你对经典贪吃蛇游戏情有独钟,那么这篇文章绝对值得你一看。
本文将一步步指导你设计一个简单的贪吃蛇游戏,即使你是一名 Python 新手,也能轻松上手。
创建这个游戏有很多方法,其中一种是使用 Python 的 PyGame 库。PyGame 是一个专门用于开发游戏的 Python 库。
另一种方法是利用海龟库。这个模块预装在 Python 中,它提供了一个虚拟画布,供用户绘制各种形状和图像。
因此,本文选择使用海龟库来实现我们的简易贪吃蛇游戏。这个库对初学者非常友好,尤其适合刚入门 Python 开发的朋友。
除了海龟库,我们还将用到另外两个模块:
- time 模块:用于跟踪自上次操作以来经过的时间,这对于控制游戏速度至关重要。
- random 模块:用于在 Python 中生成随机数,例如食物的位置。
你还需要一个趁手的文本编辑器。本文将使用 VSCode。 当然,如果你的电脑上还没有安装 Python 3,你需要先安装它。你也可以使用在线的 techblik.com 编译器。
准备好了吗?让我们开始吧!
游戏机制详解
贪吃蛇游戏的目标很简单:玩家控制一条蛇,通过吞食屏幕上随机出现的食物来尽可能获得高分。
玩家通过四个方向键来控制蛇的移动方向。如果蛇撞到边界或者自己的身体,游戏就结束了。
我们将按照以下步骤来实现这个游戏:
- 导入必要的模块(turtle, time, random)。
- 使用 turtle 模块创建一个游戏窗口,包括蛇、食物和得分显示。
- 设置键盘按键来控制蛇的移动。
- 实现游戏逻辑,例如蛇的移动、吃食物、碰撞检测等等。
创建一个名为 snakegame.py 的文件,所有的代码都将写在这个文件中。
导入模块
首先,我们需要导入 Python 默认自带的海龟、时间和随机模块。 此外,我们还要设置一些初始值,比如玩家的初始得分、最高得分和蛇的移动速度。其中,时间模块会用来控制移动速度。
将以下代码添加到你的 snakegame.py 文件中:
import turtle import random import time player_score = 0 highest_score = 0 delay_time = 0.1
创建游戏窗口
我们导入的海龟模块可以帮助我们创建一个虚拟画布,它将作为游戏的窗口。在这个窗口中,我们将绘制蛇的身体和蛇需要吃掉的食物。屏幕上还会实时显示玩家的分数。
将以下代码添加到你的 Python 文件中:
# 创建窗口 wind = turtle.Screen() wind.title("贪吃蛇迷宫🐍") wind.bgcolor("red") # 设置窗口大小 wind.setup(width=600, height=600) # 创建蛇 snake = turtle.Turtle() snake.shape("square") snake.color("black") snake.penup() snake.goto(0, 0) snake.direction = "Stop" # 创建食物 snake_food = turtle.Turtle() shapes = random.choice(['triangle','circle']) snake_food.shape(shapes) snake_food.color("blue") snake_food.speed(0) snake_food.penup() snake_food.goto(0, 100) # 创建得分显示 pen = turtle.Turtle() pen.speed(0) pen.shape('square') pen.color('white') pen.penup() pen.hideturtle() pen.goto(0, 250) pen.write("当前得分: 0 最高得分 : 0", align="center", font=("Arial", 24, "normal")) turtle.mainloop()
上面的代码首先初始化了海龟屏幕,并设置了标题和背景颜色。 设置好窗口大小后,我们在虚拟画布上绘制了蛇的形状。
penup()
方法的作用是抬起海龟的笔,这样海龟移动时就不会留下轨迹。 goto(x,y)
方法则是将海龟移动到指定的绝对坐标。
接着,我们创建了蛇需要吃掉的食物。 此外,我们还需要实时显示玩家的得分和最高得分。为此,我们使用了 pen.write()
方法。 hideturtle()
则将海龟图标从屏幕上隐藏起来。
最后,代码结尾的 turtle.mainloop()
非常重要,它可以保持屏幕显示,并允许用户在屏幕上进行操作。
运行你的代码,你将看到一个这样的窗口:
设置蛇的移动方向键
接下来,我们需要设置键盘按键来控制蛇的移动方向。 我们将使用 “L” 代表左, “R” 代表右, “U” 代表上, “D” 代表下。 我们将使用海龟的内置方向函数来控制蛇的移动。
将以下代码片段添加到你的代码中:
# 定义方向控制 def moveleft(): if snake.direction != "right": snake.direction = "left" def moveright(): if snake.direction != "left": snake.direction = "right" def moveup(): if snake.direction != "down": snake.direction = "up" def movedown(): if snake.direction != "up": snake.direction = "down" def move(): if snake.direction == "up": coord_y = snake.ycor() snake.sety(coord_y+20) if snake.direction == "down": coord_y = snake.ycor() snake.sety(coord_y-20) if snake.direction == "right": coord_x = snake.xcor() snake.setx(coord_x+20) if snake.direction == "left": coord_x = snake.xcor() snake.setx(coord_x-20) wind.listen() wind.onkeypress(moveleft, 'L') wind.onkeypress(moveright, 'R') wind.onkeypress(moveup, 'U') wind.onkeypress(movedown, 'D')
上面的 move()
函数设置了蛇在坐标值内的移动。
listen()
函数是一个事件监听器,它会在玩家按下按键时,调用相应的函数来移动蛇。
实现游戏核心逻辑
在构建了游戏的基本外观之后,我们需要让游戏真正运行起来。
这包括以下几个方面:
- 每次蛇吃掉食物,身体都会变长,并且颜色应该有所不同。
- 每次蛇吃掉食物,玩家的得分都会增加,并且会记录最高分。
- 玩家控制的蛇会与墙壁或自己的身体发生碰撞。
- 当蛇发生碰撞时,游戏会重新开始。
- 当游戏重新开始时,玩家的得分会重置为零,但屏幕上会保留最高得分记录。
将以下代码添加到你的 Python 文件中:
segments = [] # 实现游戏逻辑 while True: wind.update() if snake.xcor() > 290 or snake.xcor() < -290 or snake.ycor() > 290 or snake.ycor() < -290: time.sleep(1) snake.goto(0, 0) snake.direction = "Stop" snake.shape("square") snake.color("green") for segment in segments: segment.goto(1000, 1000) segments.clear() player_score = 0 delay_time = 0.1 pen.clear() pen.write("当前得分: {} 最高得分: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal")) if snake.distance(snake_food) < 20: coord_x = random.randint(-270, 270) coord_y = random.randint(-270, 270) snake_food.goto(coord_x, coord_y) # 增加蛇的身体节数 added_segment = turtle.Turtle() added_segment.speed(0) added_segment.shape("square") added_segment.color("white") added_segment.penup() segments.append(added_segment) delay_time -= 0.001 player_score += 5 if player_score > highest_score: highest_score = player_score pen.clear() pen.write("当前得分: {} 最高得分: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal")) # 检测碰撞 for i in range(len(segments)-1, 0, -1): coord_x = segments[i-1].xcor() coord_y = segments[i-1].ycor() segments[i].goto(coord_x, coord_y) if len(segments) > 0: coord_x = snake.xcor() coord_y = snake.ycor() segments[0].goto(coord_x, coord_y) move() for segment in segments: if segment.distance(snake) < 20: time.sleep(1) snake.goto(0, 0) snake.direction = "stop" snake.color('white') snake.shape('square') for segment in segments: segment.goto(1000, 1000) segment.clear() player_score = 0 delay_time = 0.1 pen.clear() pen.write("当前得分: {} 最高得分: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal")) time.sleep(delay_time) turtle.mainloop()
在上面的代码中,我们首先设置了食物在屏幕内的随机位置。每次蛇吃掉食物后,它的身体就会增加一节,颜色为白色,以便区分。
当蛇在没有碰撞的情况下吃掉食物后,食物会出现在屏幕的随机位置。每次蛇吃掉食物,玩家的得分都会增加5分。当蛇碰撞时,玩家的得分会被重置为0,但屏幕会保留最高分。
现在,再次运行 Python 文件,你将看到你创建的贪吃蛇游戏窗口:
结语🐍
正如我们在本文中所看到的,使用海龟库可以轻松愉快地创建一个贪吃蛇游戏。 当然,你也可以使用 PyGame 库来实现相同的游戏。 你可以点击 PyGame 教程 查看如何用不同的方式实现这个游戏。
此外,你还可以尝试使用 Python 创建数字猜谜游戏,或者学习如何在 Python 中获取 JSON 数据。
祝你编码愉快!