[Python] 纯文本查看 复制代码
import pygame
import random
import time
# 初始化pygame
pygame.init()
# 定义颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
# 游戏窗口尺寸
width, height = 1200, 800
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('贪吃蛇游戏')
# 蛇的参数
snake_radius = 10
snake_speed = 10 # 蛇的初始速度
snake_length = 1
snake_body = []
# 食物参数(增大食物半径)
food_radius = 15
food_x = round(random.randrange(0, width - food_radius * 2) / 10.0) * 10.0
food_y = round(random.randrange(0, height - food_radius * 2) / 10.0) * 10.0
# 敌人参数
enemy_radius = 10
enemies = [(random.randrange(1, width - enemy_radius * 2),
random.randrange(1, height - enemy_radius * 2)) for _ in range(5)]
enemy_directions = [(random.choice([-snake_speed, 0, snake_speed]),
random.choice([-snake_speed, 0, snake_speed])) for _ in range(len(enemies))]
enemy_idle_times = [0 for _ in enemies] # 记录每个敌人停留的时间
# 游戏主循环
def game_loop():
global food_x, food_y, snake_length, enemies, snake_speed, enemy_directions, enemy_idle_times # 声明使用全局变量
x, y = width // 2, height // 2
x_change, y_change = 0, 0
# 游戏结束标志
game_over = False
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x_change = -snake_speed
y_change = 0
elif event.key == pygame.K_RIGHT:
x_change = snake_speed
y_change = 0
elif event.key == pygame.K_UP:
y_change = -snake_speed
x_change = 0
elif event.key == pygame.K_DOWN:
y_change = snake_speed
x_change = 0
elif event.key == pygame.K_PLUS or event.key == pygame.K_EQUALS: # 增加速度
snake_speed += 2 # 增加速度
elif event.key == pygame.K_MINUS: # 减少速度
if snake_speed > 2: # 确保速度不会降低到负值
snake_speed -= 2 # 减少速度
# 边界碰撞检测
if x >= width or x < 0 or y >= height or y < 0:
game_over = True
# 更新蛇的位置
x += x_change
y += y_change
# 蛇的身体
head = (x, y)
snake_body.append(head)
if len(snake_body) > snake_length:
del snake_body[0]
# 检测是否碰到敌人
for enemy in enemies:
if abs(x - enemy[0]) < enemy_radius and abs(y - enemy[1]) < enemy_radius:
game_over = True
# 更新敌人的位置
new_enemies = []
new_enemy_directions = []
new_enemy_idle_times = [] # 初始化新敌人静止时间列表
for i in range(len(enemies)):
enemy_x_change, enemy_y_change = enemy_directions[i]
new_x = enemies[i][0] + enemy_x_change
new_y = enemies[i][1] + enemy_y_change
# 检测敌人是否碰到边界并反弹
if new_x <= 0 or new_x >= width - enemy_radius * 2:
enemy_x_change = -enemy_x_change # 反转水平移动方向
if new_y <= 0 or new_y >= height - enemy_radius * 2:
enemy_y_change = -enemy_y_change # 反转垂直移动方向
# 更新敌人坐标
new_enemies.append((new_x, new_y))
new_enemy_directions.append(
(enemy_x_change, enemy_y_change)) # 更新敌人方向
# 记录敌人是否移动并更新静止计时器
if (enemy_x_change == 0 and enemy_y_change == 0):
new_enemy_idle_times.append(1) # 如果敌人不移动,增加静止计时
else:
new_enemy_idle_times.append(0) # 恢复计时器
# 更新敌人状态
enemies = new_enemies
enemy_directions = new_enemy_directions
enemy_idle_times = [prev + new for prev,
new in zip(enemy_idle_times, new_enemy_idle_times)]
# 清屏
screen.fill(WHITE)
# 绘制食物
pygame.draw.circle(
screen, RED, (int(food_x), int(food_y)), food_radius)
# 绘制敌人
for enemy in enemies:
pygame.draw.circle(
screen, BLUE, (int(enemy[0]), int(enemy[1])), enemy_radius)
# 绘制蛇
for segment in snake_body:
pygame.draw.circle(
screen, GREEN, (segment[0], segment[1]), snake_radius)
# 进食逻辑
if abs(x - food_x) < food_radius and abs(y - food_y) < food_radius:
food_x = round(random.randrange(
0, width - food_radius * 2) / 10.0) * 10.0
food_y = round(random.randrange(
0, height - food_radius * 2) / 10.0) * 10.0
snake_length += 1
pygame.display.update()
# 控制游戏速度
time.sleep(0.1)
pygame.quit()
# 运行游戏
if __name__ == "__main__":
game_loop()