鱼C论坛

 找回密码
 立即注册
查看: 52|回复: 1

[已解决]求一个代码

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求一个扫雷游戏的代码(只能使用pygame)
最佳答案
4 天前
使用 Pygame 实现的扫雷游戏代码

以下是一个使用 pygame 编写的简易扫雷游戏的完整代码,包含了基本的游戏逻辑、界面绘制和鼠标交互功能。
import pygame
import random
import sys

# 初始化
pygame.init()

# 游戏设置
WIDTH, HEIGHT = 400, 400
ROWS, COLS = 10, 10
MINES_COUNT = 10
TILE_SIZE = WIDTH // COLS

# 颜色
WHITE = (255, 255, 255)
GRAY = (192, 192, 192)
DARK_GRAY = (128, 128, 128)
BLACK = (0, 0, 0)
RED = (255, 0, 0)

# 创建窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("扫雷")

# 字体
font = pygame.font.SysFont(None, 24)

# 初始化网格
grid = [[0 for _ in range(COLS)] for _ in range(ROWS)]
revealed = [[False for _ in range(COLS)] for _ in range(ROWS)]
flags = [[False for _ in range(COLS)] for _ in range(ROWS)]

# 随机放置地雷
mines = set()
while len(mines) < MINES_COUNT:
    r = random.randint(0, ROWS - 1)
    c = random.randint(0, COLS - 1)
    if (r, c) not in mines:
        mines.add((r, c))
        grid[r][c] = -1

# 计算每个格子周围的地雷数
for r in range(ROWS):
    for c in range(COLS):
        if grid[r][c] == -1:
            continue
        count = 0
        for dr in [-1, 0, 1]:
            for dc in [-1, 0, 1]:
                nr, nc = r + dr, c + dc
                if 0 <= nr < ROWS and 0 <= nc < COLS and grid[nr][nc] == -1:
                    count += 1
        grid[r][c] = count

# 递归揭示空白区域
def reveal(r, c):
    if not (0 <= r < ROWS and 0 <= c < COLS):
        return
    if revealed[r][c] or flags[r][c]:
        return
    revealed[r][c] = True
    if grid[r][c] == 0:
        for dr in [-1, 0, 1]:
            for dc in [-1, 0, 1]:
                if dr != 0 or dc != 0:
                    reveal(r + dr, c + dc)

# 绘制网格
def draw():
    screen.fill(WHITE)
    for r in range(ROWS):
        for c in range(COLS):
            rect = pygame.Rect(c * TILE_SIZE, r * TILE_SIZE, TILE_SIZE, TILE_SIZE)
            if revealed[r][c]:
                pygame.draw.rect(screen, GRAY, rect)
                if grid[r][c] > 0:
                    text = font.render(str(grid[r][c]), True, BLACK)
                    screen.blit(text, (c * TILE_SIZE + 10, r * TILE_SIZE + 10))
                elif grid[r][c] == -1:
                    pygame.draw.circle(screen, RED, rect.center, TILE_SIZE // 4)
            else:
                pygame.draw.rect(screen, DARK_GRAY, rect)
                if flags[r][c]:
                    text = font.render("F", True, RED)
                    screen.blit(text, (c * TILE_SIZE + 10, r * TILE_SIZE + 10))
            pygame.draw.rect(screen, BLACK, rect, 1)
    pygame.display.flip()

# 主循环
running = True
game_over = False
while running:
    draw()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN and not game_over:
            x, y = pygame.mouse.get_pos()
            r, c = y // TILE_SIZE, x // TILE_SIZE
            if event.button == 1:  # 左键
                if (r, c) in mines:
                    revealed[r][c] = True
                    game_over = True
                else:
                    reveal(r, c)
            elif event.button == 3:  # 右键
                flags[r][c] = not flags[r][c]

pygame.quit()
sys.exit()

说明
  • 左键点击格子进行翻开
  • 右键点击格子插旗
  • 游戏结束后不能继续操作


如果你想要添加更多功能,比如计时器、胜利判断、重新开始按钮等,可以在此基础上继续扩展。需要我帮你扩展功能也可以继续提问哦~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层    本楼为最佳答案   
使用 Pygame 实现的扫雷游戏代码

以下是一个使用 pygame 编写的简易扫雷游戏的完整代码,包含了基本的游戏逻辑、界面绘制和鼠标交互功能。
import pygame
import random
import sys

# 初始化
pygame.init()

# 游戏设置
WIDTH, HEIGHT = 400, 400
ROWS, COLS = 10, 10
MINES_COUNT = 10
TILE_SIZE = WIDTH // COLS

# 颜色
WHITE = (255, 255, 255)
GRAY = (192, 192, 192)
DARK_GRAY = (128, 128, 128)
BLACK = (0, 0, 0)
RED = (255, 0, 0)

# 创建窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("扫雷")

# 字体
font = pygame.font.SysFont(None, 24)

# 初始化网格
grid = [[0 for _ in range(COLS)] for _ in range(ROWS)]
revealed = [[False for _ in range(COLS)] for _ in range(ROWS)]
flags = [[False for _ in range(COLS)] for _ in range(ROWS)]

# 随机放置地雷
mines = set()
while len(mines) < MINES_COUNT:
    r = random.randint(0, ROWS - 1)
    c = random.randint(0, COLS - 1)
    if (r, c) not in mines:
        mines.add((r, c))
        grid[r][c] = -1

# 计算每个格子周围的地雷数
for r in range(ROWS):
    for c in range(COLS):
        if grid[r][c] == -1:
            continue
        count = 0
        for dr in [-1, 0, 1]:
            for dc in [-1, 0, 1]:
                nr, nc = r + dr, c + dc
                if 0 <= nr < ROWS and 0 <= nc < COLS and grid[nr][nc] == -1:
                    count += 1
        grid[r][c] = count

# 递归揭示空白区域
def reveal(r, c):
    if not (0 <= r < ROWS and 0 <= c < COLS):
        return
    if revealed[r][c] or flags[r][c]:
        return
    revealed[r][c] = True
    if grid[r][c] == 0:
        for dr in [-1, 0, 1]:
            for dc in [-1, 0, 1]:
                if dr != 0 or dc != 0:
                    reveal(r + dr, c + dc)

# 绘制网格
def draw():
    screen.fill(WHITE)
    for r in range(ROWS):
        for c in range(COLS):
            rect = pygame.Rect(c * TILE_SIZE, r * TILE_SIZE, TILE_SIZE, TILE_SIZE)
            if revealed[r][c]:
                pygame.draw.rect(screen, GRAY, rect)
                if grid[r][c] > 0:
                    text = font.render(str(grid[r][c]), True, BLACK)
                    screen.blit(text, (c * TILE_SIZE + 10, r * TILE_SIZE + 10))
                elif grid[r][c] == -1:
                    pygame.draw.circle(screen, RED, rect.center, TILE_SIZE // 4)
            else:
                pygame.draw.rect(screen, DARK_GRAY, rect)
                if flags[r][c]:
                    text = font.render("F", True, RED)
                    screen.blit(text, (c * TILE_SIZE + 10, r * TILE_SIZE + 10))
            pygame.draw.rect(screen, BLACK, rect, 1)
    pygame.display.flip()

# 主循环
running = True
game_over = False
while running:
    draw()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN and not game_over:
            x, y = pygame.mouse.get_pos()
            r, c = y // TILE_SIZE, x // TILE_SIZE
            if event.button == 1:  # 左键
                if (r, c) in mines:
                    revealed[r][c] = True
                    game_over = True
                else:
                    reveal(r, c)
            elif event.button == 3:  # 右键
                flags[r][c] = not flags[r][c]

pygame.quit()
sys.exit()

说明
  • 左键点击格子进行翻开
  • 右键点击格子插旗
  • 游戏结束后不能继续操作


如果你想要添加更多功能,比如计时器、胜利判断、重新开始按钮等,可以在此基础上继续扩展。需要我帮你扩展功能也可以继续提问哦~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-2 02:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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