找回密码
 中文实名注册
查看: 108|回复: 2

恐怖贪吃蛇---周佳成

[复制链接]

2

主题

9

帖子

879

积分

高级会员

Rank: 4

积分
879
发表于 2025-1-11 12:12:43 | 显示全部楼层 |阅读模式
[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()

回复

使用道具 举报

2

主题

9

帖子

879

积分

高级会员

Rank: 4

积分
879
 楼主| 发表于 2025-1-11 12:16:52 | 显示全部楼层
width, height =         【****】,【————      】可更改窗口大小*****:X值;————:y值
回复

使用道具 举报

2

主题

9

帖子

879

积分

高级会员

Rank: 4

积分
879
 楼主| 发表于 2025-1-11 12:18:07 | 显示全部楼层
谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

小黑屋|东台市机器人学会 ( 苏ICP备2021035350号-1;苏ICP备2021035350号-2;苏ICP备2021035350号-3 )

GMT+8, 2025-3-14 23:41 , Processed in 0.041305 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表