欢迎访问宙启技术站
智能推送

用Python编写一个简单的贪吃蛇游戏

发布时间:2023-12-04 21:45:59

贪吃蛇游戏是一种经典的游戏,在此我将使用Python编写一个简单的贪吃蛇游戏。以下是该游戏的代码及使用例子。

首先,我们需要导入一些模块,包括randompygame,前者用于随机生成食物,后者用于创建游戏窗口和处理用户输入。

import random
import pygame

接下来,我们定义游戏所需的一些常量,包括窗口大小、蛇头和食物的颜色、蛇身的初始长度、蛇每次移动的步长等等。

# 窗口大小
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600

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

# 蛇头和食物的颜色
HEAD_COLOR = RED
FOOD_COLOR = WHITE

# 初始蛇身长度
INITIAL_LENGTH = 5

# 蛇每次移动的步长
STEP_SIZE = 20

然后,我们定义一个Snake类来表示贪吃蛇,在该类中包含蛇的长度、位置、移动方向以及相关的方法,如移动、吃食物等等。

class Snake:
    def __init__(self, x, y):
        self.length = INITIAL_LENGTH
        self.positions = [(x, y)]
        self.direction = random.choice([pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT])

    def move(self):
        cur_x, cur_y = self.positions[0]
        if self.direction == pygame.K_UP:
            new_pos = (cur_x, cur_y - STEP_SIZE)
        elif self.direction == pygame.K_DOWN:
            new_pos = (cur_x, cur_y + STEP_SIZE)
        elif self.direction == pygame.K_LEFT:
            new_pos = (cur_x - STEP_SIZE, cur_y)
        elif self.direction == pygame.K_RIGHT:
            new_pos = (cur_x + STEP_SIZE, cur_y)
        self.positions.insert(0, new_pos)  # 插入新的蛇头位置
        if len(self.positions) > self.length:
            self.positions.pop()  # 删除尾部位置

    def change_direction(self, new_direction):
        if new_direction == pygame.K_UP and self.direction != pygame.K_DOWN:
            self.direction = new_direction
        elif new_direction == pygame.K_DOWN and self.direction != pygame.K_UP:
            self.direction = new_direction
        elif new_direction == pygame.K_LEFT and self.direction != pygame.K_RIGHT:
            self.direction = new_direction
        elif new_direction == pygame.K_RIGHT and self.direction != pygame.K_LEFT:
            self.direction = new_direction

    def eat_food(self):
        self.length += 1

    def draw(self, surface):
        for pos in self.positions:
            pygame.draw.rect(surface, HEAD_COLOR, (pos[0], pos[1], STEP_SIZE, STEP_SIZE))

接着,我们定义一个Food类来表示食物,在该类中包含食物的位置和相关的方法,如随机生成位置等。

class Food:
    def __init__(self):
        self.position = (0, 0)
        self.is_eaten = False

    def generate_position(self):
        x = random.randrange(0, WINDOW_WIDTH, STEP_SIZE)
        y = random.randrange(0, WINDOW_HEIGHT, STEP_SIZE)
        self.position = (x, y)

    def draw(self, surface):
        pygame.draw.rect(surface, FOOD_COLOR, (self.position[0], self.position[1], STEP_SIZE, STEP_SIZE))

最后,我们定义一个Game类来表示游戏本身,在该类中包含游戏流程的各个部分,如初始化、处理用户输入、游戏循环等。

class Game:
    def __init__(self):
        self.game_over = False
        self.score = 0
        self.snake = Snake(200, 200)
        self.food = Food()
        self.food.generate_position()

    def handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.game_over = True
            elif event.type == pygame.KEYDOWN:
                self.snake.change_direction(event.key)

    def update(self):
        self.snake.move()
        if self.snake.positions[0] == self.food.position:
            self.snake.eat_food()
            self.score += 1
            self.food.is_eaten = True
        if self.snake.positions[0][0] < 0 or self.snake.positions[0][0] >= WINDOW_WIDTH or \
                self.snake.positions[0][1] < 0 or self.snake.positions[0][1] >= WINDOW_HEIGHT:
            self.game_over = True
        for pos in self.snake.positions[1:]:
            if pos == self.snake.positions[0]:
                self.game_over = True

    def draw(self, surface):
        surface.fill(BLACK)
        self.snake.draw(surface)
        self.food.draw(surface)
        pygame.display.flip()

    def run(self):
        pygame.init()
        window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
        pygame.display.set_caption("Snake Game")

        while not self.game_over:
            self.handle_input()
            self.update()
            self.draw(window)

        pygame.quit()

以上就是贪吃蛇游戏的代码。以下是一个使用例子,示意如何创建游戏对象并运行游戏。

if __name__ == "__main__":
    game = Game()
    game.run()

在此示例中,我们创建了一个Game对象,并调用run方法来启动游戏。游戏窗口会打开并显示贪吃蛇以及食物,用户可以通过方向键来控制蛇的移动方向。当蛇吃到食物时,长度增加并重新生成食物。如果蛇撞到边界或者自己的身体,游戏结束。

总结:通过以上代码的编写,我们实现了一个简单的贪吃蛇游戏。这个游戏不仅可以让玩家体验到经典的游戏乐趣,同时也展示了如何使用Python编写简单的游戏。希望这个例子对你有所帮助!