“打造经典贪吃蛇游戏:挑战你的反应和策略!“

游戏窗口和初始化

首先,我们通过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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值