使用 Python 开发一个贪吃蛇小游戏。

发布于:2025-04-23 ⋅ 阅读:(35) ⋅ 点赞:(0)

我们将使用 Python 的 Pygame 库来实现图形界面。我会创建一个具有现代感的界面设计,包含分数显示、游戏结束提示等功能。

一个完整的贪吃蛇游戏,具有以下特点:

  1. 现代化界面:
  • 清晰的网格设计
  • 实时分数显示
  • 游戏结束提示
  • 平滑的动画效果
  1. 简单的操作:
  • 使用方向键控制蛇的移动
  • 空格键重新开始游戏
  1. 游戏特性:
  • 蛇身随长度变色(头部为亮绿色,身体为深绿色)
  • 食物显示为红色
  • 可以穿过边界
  • 碰到自己时游戏结束
  1. 性能优化:
  • 使用 Pygame 实现流畅的游戏体验
  • 合理的游戏速度设置

## 游戏特点

- 现代简约的界面设计
- 流畅的游戏体验
- 实时分数显示
- 游戏结束提示
- 简单的操作方式

环境配置:

pip install pygame

实现脚本snake_game.py:

import pygame
import random
import sys
from pygame import mixer

# 初始化Pygame
pygame.init()
mixer.init()

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 50, 50)
GREEN = (50, 255, 50)
BLUE = (50, 50, 255)
DARK_GREEN = (34, 139, 34)
GRAY = (169, 169, 169)

# 游戏设置
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
GRID_SIZE = 20
GRID_WIDTH = WINDOW_WIDTH // GRID_SIZE
GRID_HEIGHT = WINDOW_HEIGHT // GRID_SIZE
SNAKE_SPEED = 12

# 创建游戏窗口
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption('Modern Snake Game')
clock = pygame.time.Clock()

# 字体
font = pygame.font.Font(None, 36)
large_font = pygame.font.Font(None, 72)

class Snake:
    def __init__(self):
        self.reset()
    
    def reset(self):
        self.length = 1
        self.positions = [(GRID_WIDTH // 2, GRID_HEIGHT // 2)]
        self.direction = random.choice([UP, DOWN, LEFT, RIGHT])
        self.color = GREEN
        self.score = 0
        self.growing = False

    def get_head_position(self):
        return self.positions[0]

    def update(self):
        cur = self.get_head_position()
        x, y = self.direction
        new = ((cur[0] + x) % GRID_WIDTH, (cur[1] + y) % GRID_HEIGHT)
        
        if new in self.positions[2:]:
            return False
        
        self.positions.insert(0, new)
        if not self.growing:
            self.positions.pop()
        else:
            self.growing = False
        return True
    
    def render(self, surface):
        for i, p in enumerate(self.positions):
            color = GREEN if i == 0 else DARK_GREEN
            r = pygame.Rect((p[0] * GRID_SIZE, p[1] * GRID_SIZE),
                          (GRID_SIZE - 2, GRID_SIZE - 2))
            pygame.draw.rect(surface, color, r)
            pygame.draw.rect(surface, BLACK, r, 1)

class Food:
    def __init__(self):
        self.position = (0, 0)
        self.color = RED
        self.randomize_position()

    def randomize_position(self):
        self.position = (random.randint(0, GRID_WIDTH - 1),
                        random.randint(0, GRID_HEIGHT - 1))

    def render(self, surface):
        r = pygame.Rect((self.position[0] * GRID_SIZE, self.position[1] * GRID_SIZE),
                       (GRID_SIZE - 2, GRID_SIZE - 2))
        pygame.draw.rect(surface, self.color, r)
        pygame.draw.rect(surface, BLACK, r, 1)

def draw_grid(surface):
    for y in range(0, GRID_HEIGHT):
        for x in range(0, GRID_WIDTH):
            r = pygame.Rect((x * GRID_SIZE, y * GRID_SIZE),
                          (GRID_SIZE, GRID_SIZE))
            pygame.draw.rect(surface, GRAY, r, 1)

# 方向常量
UP = (0, -1)
DOWN = (0, 1)
LEFT = (-1, 0)
RIGHT = (1, 0)

def main():
    snake = Snake()
    food = Food()
    running = True
    game_over = False

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if game_over:
                    if event.key == pygame.K_SPACE:
                        snake.reset()
                        food.randomize_position()
                        game_over = False
                else:
                    if event.key == pygame.K_UP and snake.direction != DOWN:
                        snake.direction = UP
                    elif event.key == pygame.K_DOWN and snake.direction != UP:
                        snake.direction = DOWN
                    elif event.key == pygame.K_LEFT and snake.direction != RIGHT:
                        snake.direction = LEFT
                    elif event.key == pygame.K_RIGHT and snake.direction != LEFT:
                        snake.direction = RIGHT

        if not game_over:
            if not snake.update():
                game_over = True

            # 检测是否吃到食物
            if snake.get_head_position() == food.position:
                snake.growing = True
                snake.score += 10
                food.randomize_position()
                while food.position in snake.positions:
                    food.randomize_position()

        # 绘制
        screen.fill(WHITE)
        draw_grid(screen)
        snake.render(screen)
        food.render(screen)
        
        # 显示分数
        score_text = font.render(f'Score: {snake.score}', True, BLACK)
        screen.blit(score_text, (10, 10))

        if game_over:
            game_over_text = large_font.render('Game Over!', True, RED)
            restart_text = font.render('Press SPACE to restart', True, BLACK)
            screen.blit(game_over_text, 
                       (WINDOW_WIDTH // 2 - game_over_text.get_width() // 2,
                        WINDOW_HEIGHT // 2 - game_over_text.get_height() // 2))
            screen.blit(restart_text,
                       (WINDOW_WIDTH // 2 - restart_text.get_width() // 2,
                        WINDOW_HEIGHT // 2 + 50))

        pygame.display.update()
        clock.tick(SNAKE_SPEED)

    pygame.quit()
    sys.exit()

if __name__ == '__main__':
    main() 

## 运行游戏

在命令行中运行:
```
python snake_game.py
```

## 游戏控制

- 使用方向键(↑↓←→)控制蛇的移动
- 按空格键重新开始游戏
- 点击窗口的关闭按钮退出游戏

## 游戏规则

1. 控制蛇吃到红色食物
2. 每吃到一个食物得10分
3. 撞到自己身体时游戏结束
4. 可以穿过边界墙到达对面 


网站公告

今日签到

点亮在社区的每一天
去签到