我们将使用 Python 的 Pygame 库来实现图形界面。我会创建一个具有现代感的界面设计,包含分数显示、游戏结束提示等功能。
一个完整的贪吃蛇游戏,具有以下特点:
- 现代化界面:
- 清晰的网格设计
- 实时分数显示
- 游戏结束提示
- 平滑的动画效果
- 简单的操作:
- 使用方向键控制蛇的移动
- 空格键重新开始游戏
- 游戏特性:
- 蛇身随长度变色(头部为亮绿色,身体为深绿色)
- 食物显示为红色
- 可以穿过边界
- 碰到自己时游戏结束
- 性能优化:
- 使用 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. 可以穿过边界墙到达对面