如何用 Python 制作蛇游戏

打造你自己的贪吃蛇游戏: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 数据。
祝你编码愉快!