游戏窗口和初始化
首先,我们通过Pygame库初始化游戏,设置游戏窗口大小为600x600,并定义了一些基本的颜色常量。
绘制蛇和食物
代码中的draw_snake
函数负责绘制蛇的每个方块,draw_food
函数用于绘制食物。这些函数通过调用Pygame的绘制函数来实现。
游戏逻辑和控制
游戏循环中的事件处理部分负责捕捉用户输入,根据按键来控制蛇的移动方向。蛇头的位置不断更新,同时也判断了游戏失败的条件,如蛇头撞墙或碰到自己的身体。同时,代码还处理了蛇吃到食物的情况,更新食物的位置,并根据得分调整食物的颜色。
游戏结束和重新开始
当游戏失败时,代码进入游戏结束状态,显示得分和相关提示信息。在游戏结束状态下,玩家可以选择重新开始游戏或退出游戏。
控制游戏速度
通过调整clock.tick(10)
中的数字,可以控制蛇的移动速度。加深了游戏的挑战性和娱乐性。
代码:
import pygame
import random
import pygame.mixer
# 游戏窗口大小
WINDOW_WIDTH = 600
WINDOW_HEIGHT = 600
# 蛇身和食物大小
BLOCK_SIZE = 20
# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
pygame.init()
# 创建游戏窗口
window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("贪吃蛇")
clock = pygame.time.Clock()
# 绘制蛇
def draw_snake(snake):
for block in snake:
pygame.draw.rect(window, GREEN, (block[0], block[1], BLOCK_SIZE, BLOCK_SIZE))
# 绘制食物
def draw_food(food, color):
pygame.draw.rect(window, color, (food[0], food[1], BLOCK_SIZE, BLOCK_SIZE))
# 显示得分
def show_score(score):
font = pygame.font.SysFont(None, 20)
text = font.render("Score: " + str(score), True, WHITE)
window.blit(text, (10, 10))
# 主游戏循环
def game_loop():
game_over = False
game_exit = False
# 蛇头初始位置
x = WINDOW_WIDTH / 2
y = WINDOW_HEIGHT / 2
# 蛇身初始长度
snake = [[x, y]]
# 随机生成初始食物位置
food = [
random.randrange(0, WINDOW_WIDTH - BLOCK_SIZE, BLOCK_SIZE),
random.randrange(0, WINDOW_HEIGHT - BLOCK_SIZE, BLOCK_SIZE),
]
score = 0
# 初始化蛇移动的方向
direction_x = 0
direction_y = 0
while not game_exit:
while game_over:
# 游戏结束后,显示游戏得分,并等待重新开始或退出游戏
window.fill(BLACK)
font = pygame.font.SysFont(None, 30)
text = font.render("Game Over! Your score: " + str(score), True, WHITE)
window.blit(
text,
(
WINDOW_WIDTH / 2 - text.get_width() / 2,
WINDOW_HEIGHT / 2 - text.get_height() / 2,
),
)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_exit = True
game_over = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_exit = True
game_over = False
if event.key == pygame.K_r:
game_loop()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_exit = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT and direction_x != BLOCK_SIZE:
direction_x = -BLOCK_SIZE
direction_y = 0
elif event.key == pygame.K_RIGHT and direction_x != -BLOCK_SIZE:
direction_x = BLOCK_SIZE
direction_y = 0
elif event.key == pygame.K_UP and direction_y != BLOCK_SIZE:
direction_x = 0
direction_y = -BLOCK_SIZE
elif event.key == pygame.K_DOWN and direction_y != -BLOCK_SIZE:
direction_x = 0
direction_y = BLOCK_SIZE
# 更新蛇头位置
x += direction_x
y += direction_y
# 判断蛇头是否碰到边界
if x < 0 or x >= WINDOW_WIDTH or y < 0 or y >= WINDOW_HEIGHT:
game_over = True
# 判断蛇头是否碰到自己
if [x, y] in snake[1:]:
game_over = True
# 判断蛇头是否吃到食物
if x == food[0] and y == food[1]:
# 生成新的食物位置
if random.random() < 0.8:
food = [
random.randrange(0, WINDOW_WIDTH - BLOCK_SIZE, BLOCK_SIZE),
random.randrange(0, WINDOW_HEIGHT - BLOCK_SIZE, BLOCK_SIZE),
]
score += 1
else:
food = [
random.randrange(0, WINDOW_WIDTH - BLOCK_SIZE, BLOCK_SIZE),
random.randrange(0, WINDOW_HEIGHT - BLOCK_SIZE, BLOCK_SIZE),
]
score += 2
snake.append([x, y])
else:
# 若没吃到食物,则删除蛇尾
snake.pop()
# 更新蛇身
snake.insert(0, [x, y])
# 清屏
window.fill(BLACK)
# 绘制蛇和食物
draw_snake(snake)
if score % 2 == 0:
draw_food(food, RED)
else:
draw_food(food, GREEN)
# 显示得分
show_score(score)
# 刷新屏幕
pygame.display.update()
# 控制游戏速度
clock.tick(10) # 蛇移动的速度,可调整
pygame.quit()
quit()
# 运行游戏
game_loop()