话不多说!来看代码!

我:请你用python写一个贪吃蛇游戏

DeepSeek:以下是一个使用Python和Pygame库实现的贪吃蛇游戏示例代码:

import pygame
import random
import sys

# 初始化Pygame
pygame.init()

# 游戏窗口尺寸
WIDTH = 640
HEIGHT = 480

# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# 方块大小和移动速度
CELL_SIZE = 20
FPS = 3

# 初始化窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("贪吃蛇游戏")

clock = pygame.time.Clock()

# 蛇的初始设置
snake = [(WIDTH // 2, HEIGHT // 2)]
direction = (CELL_SIZE, 0)

# 食物初始位置
food = (random.randrange(0, WIDTH, CELL_SIZE),
        random.randrange(0, HEIGHT, CELL_SIZE))

# 得分
score = 0


def draw_snake():
    for index, pos in enumerate(snake):
        color = GREEN if index == 0 else WHITE  # 蛇头为绿色
        pygame.draw.rect(screen, color, (pos[0], pos[1], CELL_SIZE, CELL_SIZE))


def generate_food():
    while True:
        new_food = (random.randrange(0, WIDTH, CELL_SIZE),
                    random.randrange(0, HEIGHT, CELL_SIZE))
        if new_food not in snake:
            return new_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:
                continue
            if event.key == pygame.K_UP and direction != (0, CELL_SIZE):
                direction = (0, -CELL_SIZE)
            elif event.key == pygame.K_DOWN and direction != (0, -CELL_SIZE):
                direction = (0, CELL_SIZE)
            elif event.key == pygame.K_LEFT and direction != (CELL_SIZE, 0):
                direction = (-CELL_SIZE, 0)
            elif event.key == pygame.K_RIGHT and direction != (-CELL_SIZE, 0):
                direction = (CELL_SIZE, 0)

    if not game_over:
        # 移动蛇
        new_head = (snake[0][0] + direction[0], snake[0][1] + direction[1])

        # 碰撞检测
        if (new_head in snake or
                new_head[0] < 0 or new_head[0] >= WIDTH or
                new_head[1] < 0 or new_head[1] >= HEIGHT):
            game_over = True
        else:
            snake.insert(0, new_head)

            # 吃食物检测
            if snake[0] == food:
                score += 1
                food = generate_food()
                pygame.display.set_caption(f"贪吃蛇游戏 - 得分: {score}")
            else:
                snake.pop()

    # 绘制画面
    screen.fill(BLACK)

    # 绘制食物
    pygame.draw.rect(screen, RED, (food[0], food[1], CELL_SIZE, CELL_SIZE))

    # 绘制蛇
    if not game_over:
        draw_snake()
    else:
        # 游戏结束显示
        font = pygame.font.Font(None, 74)
        text = font.render("游戏结束!", True, WHITE)
        screen.blit(text, (WIDTH // 2 - text.get_width() // 2, HEIGHT // 2 - text.get_height() // 2))

        font = pygame.font.Font(None, 36)
        text = font.render(f"最终得分: {score} 按任意键退出", True, WHITE)
        screen.blit(text, (WIDTH // 2 - text.get_width() // 2, HEIGHT // 2 + 30))

    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()
sys.exit()

这个游戏包含以下功能:

  1. 基本贪吃蛇游戏机制

  2. 蛇的移动控制(使用方向键)

  3. 食物生成和自动位置检测

  4. 碰撞检测(墙壁和自身)

  5. 得分系统

  6. 游戏结束画面

  7. 简单的图形界面

游戏规则:

  • 使用方向键控制蛇的移动方向

  • 吃到红色食物可以增长身体并得分

  • 碰到墙壁或自己身体时游戏结束

  • 游戏结束时会显示最终得分

运行这个程序需要安装pygame库,可以使用以下命令安装:

pip install pygame

这个实现包含了贪吃蛇游戏的核心逻辑,你可以通过修改以下参数来自定义游戏:

  • 修改CELL_SIZE来改变蛇和食物的大小

  • 调整FPS来改变游戏速度

  • 修改颜色常量来改变游戏外观

  • 调整WIDTH和HEIGHT来改变游戏窗口大小

游戏结束后,按任意键可以退出游戏。

下面是代码运行后的效果:

得分为0的情况:

似乎没有显示出"游戏结束!""最终得分""按任意键退出"等文字。

游戏进行中:

游戏结束:

来看看DeepSeek对代码的部分解释:

我:

if game_over:
    continue
if event.key == pygame.K_UP and direction != (0, CELL_SIZE):
    direction = (0, -CELL_SIZE)
elif event.key == pygame.K_DOWN and direction != (0, -CELL_SIZE):
    direction = (0, CELL_SIZE)
elif event.key == pygame.K_LEFT and direction != (CELL_SIZE, 0):
    direction = (-CELL_SIZE, 0)
elif event.key == pygame.K_RIGHT and direction != (-CELL_SIZE, 0):
    direction = (CELL_SIZE, 0)

能解释一下这段代码吗?

DeepSeek:

这段代码是贪吃蛇游戏中的键盘事件处理逻辑,用于控制蛇的移动方向。它的作用是监听玩家的键盘输入,并根据输入改变蛇的移动方向。以下是对这段代码的详细解释:


代码结构

if game_over:
    continue
if event.key == pygame.K_UP and direction != (0, CELL_SIZE):
    direction = (0, -CELL_SIZE)
elif event.key == pygame.K_DOWN and direction != (0, -CELL_SIZE):
    direction = (0, CELL_SIZE)
elif event.key == pygame.K_LEFT and direction != (CELL_SIZE, 0):
    direction = (-CELL_SIZE, 0)
elif event.key == pygame.K_RIGHT and direction != (-CELL_SIZE, 0):
    direction = (CELL_SIZE, 0)

逐行解释

  1. if game_over: continue

    • 如果游戏已经结束(game_overTrue),则跳过后续的键盘事件处理。

    • 这意味着在游戏结束后,玩家按任何键都不会影响蛇的移动。

  2. if event.key == pygame.K_UP and direction != (0, CELL_SIZE):

    • 如果玩家按下了上方向键pygame.K_UP),并且蛇当前的方向不是向下(0, CELL_SIZE))。

    • 如果条件满足,将蛇的方向设置为向上(0, -CELL_SIZE))。

    • 为什么需要检查当前方向?

      • 这是为了防止蛇直接反向移动。例如,如果蛇正在向下移动,玩家按下上方向键,蛇会立即反向,这会导致蛇撞到自己,游戏结束。因此,需要禁止这种操作。

  3. elif event.key == pygame.K_DOWN and direction != (0, -CELL_SIZE):

    • 如果玩家按下了下方向键pygame.K_DOWN),并且蛇当前的方向不是向上(0, -CELL_SIZE))。

    • 如果条件满足,将蛇的方向设置为向下(0, CELL_SIZE))。

  4. elif event.key == pygame.K_LEFT and direction != (CELL_SIZE, 0):

    • 如果玩家按下了左方向键pygame.K_LEFT),并且蛇当前的方向不是向右(CELL_SIZE, 0))。

    • 如果条件满足,将蛇的方向设置为向左(-CELL_SIZE, 0))。

  5. elif event.key == pygame.K_RIGHT and direction != (-CELL_SIZE, 0):

    • 如果玩家按下了右方向键pygame.K_RIGHT),并且蛇当前的方向不是向左(-CELL_SIZE, 0))。

    • 如果条件满足,将蛇的方向设置为向右(CELL_SIZE, 0))。


方向表示

  • 蛇的移动方向用一个二维元组 (x, y) 表示:

    • (0, -CELL_SIZE):向上移动(y 坐标减少)

    • (0, CELL_SIZE):向下移动(y 坐标增加)

    • (-CELL_SIZE, 0):向左移动(x 坐标减少)

    • (CELL_SIZE, 0):向右移动(x 坐标增加)


防止反向移动的逻辑

  • 在每次按键事件中,代码会检查当前方向是否与按键方向相反。如果是相反方向,则忽略该按键。

  • 例如:

    • 如果蛇当前正在向右移动((CELL_SIZE, 0)),玩家按下左方向键(pygame.K_LEFT),代码会检查当前方向是否是 (CELL_SIZE, 0)。如果是,则忽略左方向键的输入,防止蛇反向移动。


总结

这段代码的作用是:

  1. 监听玩家的键盘输入。

  2. 根据输入改变蛇的移动方向。

  3. 防止蛇反向移动(避免直接撞到自己)。

  4. 在游戏结束后,忽略所有键盘输入。

通过这段代码,玩家可以控制蛇的移动方向,而游戏逻辑会确保蛇不会做出无效的反向移动。

真的很厉害呢! 

DeepSeek表示“文字无法正常显示通常与字体设置或渲染方式有关。”下面是修改后的代码:

import pygame
import random
import sys

# 初始化Pygame
pygame.init()

# 游戏窗口尺寸
WIDTH = 640
HEIGHT = 480

# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# 方块大小和移动速度
CELL_SIZE = 20
FPS = 3

# 初始化窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("贪吃蛇游戏")

clock = pygame.time.Clock()

# 蛇的初始设置
snake = [(WIDTH // 2, HEIGHT // 2)]
direction = (CELL_SIZE, 0)

# 食物初始位置
food = (random.randrange(0, WIDTH, CELL_SIZE),
        random.randrange(0, HEIGHT, CELL_SIZE))

# 得分
score = 0


def draw_snake():
    for index, pos in enumerate(snake):
        color = GREEN if index == 0 else WHITE  # 蛇头为绿色
        pygame.draw.rect(screen, color, (pos[0], pos[1], CELL_SIZE, CELL_SIZE))


def generate_food():
    while True:
        new_food = (random.randrange(0, WIDTH, CELL_SIZE),
                    random.randrange(0, HEIGHT, CELL_SIZE))
        if new_food not in snake:
            return new_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:
                continue
            if event.key == pygame.K_UP and direction != (0, CELL_SIZE):
                direction = (0, -CELL_SIZE)
            elif event.key == pygame.K_DOWN and direction != (0, -CELL_SIZE):
                direction = (0, CELL_SIZE)
            elif event.key == pygame.K_LEFT and direction != (CELL_SIZE, 0):
                direction = (-CELL_SIZE, 0)
            elif event.key == pygame.K_RIGHT and direction != (-CELL_SIZE, 0):
                direction = (CELL_SIZE, 0)

    if not game_over:
        # 移动蛇
        new_head = (snake[0][0] + direction[0], snake[0][1] + direction[1])

        # 碰撞检测
        if (new_head in snake or
                new_head[0] < 0 or new_head[0] >= WIDTH or
                new_head[1] < 0 or new_head[1] >= HEIGHT):
            game_over = True
        else:
            snake.insert(0, new_head)

            # 吃食物检测
            if snake[0] == food:
                score += 1
                food = generate_food()
                pygame.display.set_caption(f"贪吃蛇游戏 - 得分: {score}")
            else:
                snake.pop()

    # 绘制画面
    screen.fill(BLACK)

    # 绘制食物
    pygame.draw.rect(screen, RED, (food[0], food[1], CELL_SIZE, CELL_SIZE))

    # 绘制蛇
    if not game_over:
        draw_snake()
    else:
        # 游戏结束显示
        # font = pygame.font.Font(None, 74)
        # Windows系统常用中文字体
        font_large = pygame.font.SysFont("simhei", 74)  # 黑体
        # font_large = pygame.font.SysFont("msyh", 74)   # 微软雅黑
        # font_large = pygame.font.SysFont("simsun", 74) # 宋体
        text = font_large.render("游戏结束!", True, WHITE)
        screen.blit(text, (WIDTH // 2 - text.get_width() // 2, HEIGHT // 2 - text.get_height() // 2))

        # font_small = pygame.font.Font(None, 36)
        font_small = pygame.font.SysFont("simhei", 36)  # 黑体
        # font_small = pygame.font.SysFont("msyh", 36)   # 微软雅黑
        # font_small = pygame.font.SysFont("simsun", 36) # 宋体
        text = font_small.render(f"最终得分: {score} 按任意键退出", True, WHITE)
        screen.blit(text, (WIDTH // 2 - text.get_width() // 2, HEIGHT // 2 + 30))

    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()
sys.exit()

这下可以正常显示中文字体了!

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐