📜  如何制作蛇游戏 (1)

📅  最后修改于: 2023-12-03 15:24:04.825000             🧑  作者: Mango

如何制作蛇游戏

简介

蛇游戏是一种经典的小游戏,它的核心玩法是通过控制一条蛇在屏幕上不断地移动来吃食物,蛇的身体会不断地变长,直到碰到墙壁或自己的身体为止。本文将介绍如何用 Python 语言制作一个简单的蛇游戏。

准备工作

在开始编写代码之前,我们需要安装 pygame 这个 Python 游戏开发库。可以通过以下命令来安装:

pip install pygame
编写代码
Step 1:导入库

在代码的开头,我们需要导入 pygame 和一些常量:

import pygame
from pygame.locals import *
import random

# 游戏界面的宽度和高度
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480

# 蛇的尺寸和速度
SNAKE_SIZE = 20
SNAKE_SPEED = 20
Step 2:初始化游戏

在开始游戏前,我们需要初始化 Pygame,并创建一个窗口:

# 初始化 Pygame
pygame.init()

# 创建游戏窗口
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('Snake Game')
Step 3:创建蛇类

我们创建一个 Snake 类来代表蛇,并在其构造函数中初始化蛇的位置和方向:

class Snake:
    # 蛇的构造函数
    def __init__(self):
        self.length = 1
        self.positions = [(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)]
        self.direction = random.choice([UP, DOWN, LEFT, RIGHT])
Step 4:更新蛇的位置

我们在 Snake 类中添加一个 update 方法来更新蛇的位置:

class Snake:
    # 省略 __init__ 方法

    # 更新蛇的位置
    def update(self):
        # 计算蛇头的位置
        x, y = self.positions[0]
        if self.direction == UP:
            y -= SNAKE_SPEED
        elif self.direction == DOWN:
            y += SNAKE_SPEED
        elif self.direction == LEFT:
            x -= SNAKE_SPEED
        elif self.direction == RIGHT:
            x += SNAKE_SPEED

        self.positions = [(x, y)] + self.positions[:-1]
Step 5:绘制蛇

我们在 Snake 类中添加一个 draw 方法来绘制蛇:

class Snake:
    # 省略 __init__ 和 update 方法

    # 绘制蛇
    def draw(self, surface):
        for position in self.positions:
            draw_rect(surface, WHITE, (position[0], position[1], SNAKE_SIZE, SNAKE_SIZE))
Step 6:创建食物类

我们创建一个 Food 类来代表食物,并在其构造函数中初始化食物的位置:

class Food:
    # 食物的构造函数
    def __init__(self):
        self.position = (0, 0)
        self.color = RED
        self.randomize_position()

    # 随机生成食物的位置
    def randomize_position(self):
        self.position = (random.randint(0, SCREEN_WIDTH - SNAKE_SIZE) // SNAKE_SIZE * SNAKE_SIZE,
                          random.randint(0, SCREEN_HEIGHT - SNAKE_SIZE) // SNAKE_SIZE * SNAKE_SIZE)
Step 7:绘制食物

我们在 Food 类中添加一个 draw 方法来绘制食物:

class Food:
    # 省略 __init__ 和 randomize_position 方法

    # 绘制食物
    def draw(self, surface):
        draw_rect(surface, self.color, (self.position[0], self.position[1], SNAKE_SIZE, SNAKE_SIZE))
Step 8:游戏循环

最后,我们在主函数中添加游戏循环:

def main():
    # 创建蛇和食物
    snake = Snake()
    food = Food()

    clock = pygame.time.Clock()

    # 游戏循环
    while True:
        clock.tick(10)

        # 处理事件
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_UP and snake.direction != DOWN:
                    snake.direction = UP
                elif event.key == K_DOWN and snake.direction != UP:
                    snake.direction = DOWN
                elif event.key == K_LEFT and snake.direction != RIGHT:
                    snake.direction = LEFT
                elif event.key == K_RIGHT and snake.direction != LEFT:
                    snake.direction = RIGHT

        # 更新蛇的位置
        snake.update()

        # 检测是否吃到食物
        if snake.positions[0] == food.position:
            snake.length += 1
            food.randomize_position()

        # 绘制界面
        draw_rect(screen, BLACK, (0, 0, SCREEN_WIDTH, SCREEN_HEIGHT))
        snake.draw(screen)
        food.draw(screen)
        pygame.display.update()
完整代码

完整的 Python 代码如下,包括导入库、常量、Snake 类、Food 类以及游戏循环等部分:

import pygame
from pygame.locals import *
import random

# 游戏界面的宽度和高度
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480

# 蛇的尺寸和速度
SNAKE_SIZE = 20
SNAKE_SPEED = 20

# 定义颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)


# 绘制矩形
def draw_rect(surface, color, rect):
    pygame.draw.rect(surface, color, rect)


class Snake:
    # 蛇的构造函数
    def __init__(self):
        self.length = 1
        self.positions = [(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)]
        self.direction = random.choice([UP, DOWN, LEFT, RIGHT])

    # 更新蛇的位置
    def update(self):
        # 计算蛇头的位置
        x, y = self.positions[0]
        if self.direction == UP:
            y -= SNAKE_SPEED
        elif self.direction == DOWN:
            y += SNAKE_SPEED
        elif self.direction == LEFT:
            x -= SNAKE_SPEED
        elif self.direction == RIGHT:
            x += SNAKE_SPEED

        self.positions = [(x, y)] + self.positions[:-1]

    # 绘制蛇
    def draw(self, surface):
        for position in self.positions:
            draw_rect(surface, WHITE, (position[0], position[1], SNAKE_SIZE, SNAKE_SIZE))


class Food:
    # 食物的构造函数
    def __init__(self):
        self.position = (0, 0)
        self.color = RED
        self.randomize_position()

    # 随机生成食物的位置
    def randomize_position(self):
        self.position = (random.randint(0, SCREEN_WIDTH - SNAKE_SIZE) // SNAKE_SIZE * SNAKE_SIZE,
                          random.randint(0, SCREEN_HEIGHT - SNAKE_SIZE) // SNAKE_SIZE * SNAKE_SIZE)

    # 绘制食物
    def draw(self, surface):
        draw_rect(surface, self.color, (self.position[0], self.position[1], SNAKE_SIZE, SNAKE_SIZE))


def main():
    # 初始化 Pygame
    pygame.init()

    # 创建游戏窗口
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption('Snake Game')

    # 创建蛇和食物
    snake = Snake()
    food = Food()

    clock = pygame.time.Clock()

    # 游戏循环
    while True:
        clock.tick(10)

        # 处理事件
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_UP and snake.direction != DOWN:
                    snake.direction = UP
                elif event.key == K_DOWN and snake.direction != UP:
                    snake.direction = DOWN
                elif event.key == K_LEFT and snake.direction != RIGHT:
                    snake.direction = LEFT
                elif event.key == K_RIGHT and snake.direction != LEFT:
                    snake.direction = RIGHT

        # 更新蛇的位置
        snake.update()

        # 检测是否吃到食物
        if snake.positions[0] == food.position:
            snake.length += 1
            food.randomize_position()

        # 绘制界面
        draw_rect(screen, BLACK, (0, 0, SCREEN_WIDTH, SCREEN_HEIGHT))
        snake.draw(screen)
        food.draw(screen)
        pygame.display.update()


if __name__ == '__main__':
    main()
总结

通过本文的介绍,你学习了如何制作一个简单的蛇游戏。当然,这只是一个基础版的蛇游戏,你可以根据自己的需求和兴趣进一步扩展它。