扫雷游戏实现(Python)
·
以下是一个基于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()
代码说明
-
游戏初始化
- 使用10x10的网格,15个地雷
- 每个单元格大小为40像素
- 使用Pygame创建图形界面
-
游戏逻辑
create_board()函数创建游戏板并随机放置地雷- 计算每个非地雷单元格周围的地雷数量
reveal_cell()函数递归揭示空白区域
-
游戏操作
- 左键点击:揭示单元格
- 右键点击:标记/取消标记可能的地雷位置
- 点击地雷时游戏结束
-
运行要求
- 需要安装Python和Pygame库
- 可通过
pip install pygame安装依赖
扩展建议
- 添加游戏难度选择(改变网格大小和地雷数量)
- 实现计时器和剩余地雷计数器
- 添加重新开始按钮
- 实现胜利条件判断(所有非地雷单元格被揭示)
- 添加游戏开始和结束界面
这段代码提供了扫雷游戏的核心功能,可以进一步扩展和完善界面与功能。
更多推荐


所有评论(0)