艺小卤 发表于 2025-3-29 15:33:15

FishC 发表于 2025-3-29 15:34:35

使用 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 = [ for _ in range(ROWS)]
revealed = [ for _ in range(ROWS)]
flags = [ 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 = -1

# 计算每个格子周围的地雷数
for r in range(ROWS):
    for c in range(COLS):
      if grid == -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 == -1:
                  count += 1
      grid = count

# 递归揭示空白区域
def reveal(r, c):
    if not (0 <= r < ROWS and 0 <= c < COLS):
      return
    if revealed or flags:
      return
    revealed = True
    if grid == 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:
                pygame.draw.rect(screen, GRAY, rect)
                if grid > 0:
                  text = font.render(str(grid), True, BLACK)
                  screen.blit(text, (c * TILE_SIZE + 10, r * TILE_SIZE + 10))
                elif grid == -1:
                  pygame.draw.circle(screen, RED, rect.center, TILE_SIZE // 4)
            else:
                pygame.draw.rect(screen, DARK_GRAY, rect)
                if flags:
                  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 = True
                  game_over = True
                else:
                  reveal(r, c)
            elif event.button == 3:# 右键
                flags = not flags

pygame.quit()
sys.exit()


说明

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


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求一个代码