|
发表于 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 = [[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 小助理,如未能正确解答您的问题,请继续追问。 |
|