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()