以下是一个基于Python和Pygame库的简单扫雷游戏实现代码:

import pygame
import random
import sys

# 初始化游戏参数
GRID_SIZE = 10
CELL_SIZE = 40
MINE_COUNT = 15

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (200, 200, 200)
RED = (255, 0, 0)
COLORS = [None, (0, 0, 255), (0, 128, 0), (255, 0, 0), (0, 0, 128), 
          (128, 0, 0), (0, 128, 128), (0, 0, 0), (128, 128, 128)]

# 初始化pygame
pygame.init()
screen = pygame.display.set_mode((GRID_SIZE * CELL_SIZE, GRID_SIZE * CELL_SIZE))
pygame.display.set_caption("扫雷游戏")
font = pygame.font.SysFont('Arial', 25)

def create_board():
    board = [[0 for _ in range(GRID_SIZE)] for _ in range(GRID_SIZE)]
    
    # 放置地雷
    mines_placed = 0
    while mines_placed < MINE_COUNT:
        x, y = random.randint(0, GRID_SIZE-1), random.randint(0, GRID_SIZE-1)
        if board[y][x] != -1:
            board[y][x] = -1
            mines_placed += 1
    
    # 计算周围地雷数
    for y in range(GRID_SIZE):
        for x in range(GRID_SIZE):
            if board[y][x] != -1:
                count = 0
                for dy in [-1, 0, 1]:
                    for dx in [-1, 0, 1]:
                        if (0 <= y+dy < GRID_SIZE and 0 <= x+dx < GRID_SIZE 
                            and board[y+dy][x+dx] == -1):
                            count += 1
                board[y][x] = count
    return board

def draw_board(board, revealed, flags):
    for y in range(GRID_SIZE):
        for x in range(GRID_SIZE):
            rect = pygame.Rect(x*CELL_SIZE, y*CELL_SIZE, CELL_SIZE, CELL_SIZE)
            
            if revealed[y][x]:
                if board[y][x] == -1:
                    pygame.draw.rect(screen, RED, rect)
                else:
                    pygame.draw.rect(screen, WHITE, rect)
                    if board[y][x] > 0:
                        text = font.render(str(board[y][x]), True, COLORS[board[y][x]])
                        screen.blit(text, (x*CELL_SIZE+10, y*CELL_SIZE+5))
            else:
                pygame.draw.rect(screen, GRAY, rect)
                if flags[y][x]:
                    pygame.draw.circle(screen, BLACK, (x*CELL_SIZE+20, y*CELL_SIZE+20), 10)
            
            pygame.draw.rect(screen, BLACK, rect, 1)

def reveal_cell(board, revealed, x, y):
    if not (0 <= x < GRID_SIZE and 0 <= y < GRID_SIZE) or revealed[y][x]:
        return
    
    revealed[y][x] = True
    
    if board[y][x] == 0:
        for dy in [-1, 0, 1]:
            for dx in [-1, 0, 1]:
                reveal_cell(board, revealed, x+dx, y+dy)

def main():
    board = create_board()
    revealed = [[False for _ in range(GRID_SIZE)] for _ in range(GRID_SIZE)]
    flags = [[False for _ in range(GRID_SIZE)] for _ in range(GRID_SIZE)]
    game_over = False
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            
            if not game_over:
                if event.type == pygame.MOUSEBUTTONDOWN:
                    x, y = event.pos[0] // CELL_SIZE, event.pos[1] // CELL_SIZE
                    
                    if event.button == 1:  # 左键点击
                        if board[y][x] == -1:
                            game_over = True
                            revealed = [[True for _ in range(GRID_SIZE)] for _ in range(GRID_SIZE)]
                        else:
                            reveal_cell(board, revealed, x, y)
                    
                    elif event.button == 3:  # 右键点击
                        if not revealed[y][x]:
                            flags[y][x] = not flags[y][x]
        
        screen.fill(WHITE)
        draw_board(board, revealed, flags)
        pygame.display.flip()

if __name__ == "__main__":
    main()

代码说明

  1. 游戏初始化

    • 使用10x10的网格,15个地雷
    • 每个单元格大小为40像素
    • 使用Pygame创建图形界面
  2. 游戏逻辑

    • create_board()函数创建游戏板并随机放置地雷
    • 计算每个非地雷单元格周围的地雷数量
    • reveal_cell()函数递归揭示空白区域
  3. 游戏操作

    • 左键点击:揭示单元格
    • 右键点击:标记/取消标记可能的地雷位置
    • 点击地雷时游戏结束
  4. 运行要求

    • 需要安装Python和Pygame库
    • 可通过pip install pygame安装依赖

扩展建议

  1. 添加游戏难度选择(改变网格大小和地雷数量)
  2. 实现计时器和剩余地雷计数器
  3. 添加重新开始按钮
  4. 实现胜利条件判断(所有非地雷单元格被揭示)
  5. 添加游戏开始和结束界面

这段代码提供了扫雷游戏的核心功能,可以进一步扩展和完善界面与功能。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐