【扫雷】Python实现扫雷游戏,玩家可自定义雷区大小和地雷数量

import random

# 扫雷游戏
class Minesweeper:
    def __init__(self, rows, cols, mines):
        self.rows = rows
        self.cols = cols
        self.mines = mines
        self.game_over = False
        self.board = [[0 for _ in range(cols)] for _ in range(rows)]
        self.visible = [[False for _ in range(cols)] for _ in range(rows)]
        self.place_mines(mines)
    
    # 显示当前游戏状态
    def display(self):
        for i in range(self.rows):
            for j in range(self.cols):
                if self.visible[i][j]:
                    print(self.board[i][j], end=' ')
                else:
                    print('-', end=' ')
            print()
    
    # 放置指定数量的地雷
    def place_mines(self, mines):
        count = 0
        while count < mines:
            row = random.randint(0, self.rows-1)
            col = random.randint(0, self.cols-1)
            if self.board[row][col] == 0:
                self.board[row][col] = '*'
                count += 1
        self.calculate_counts()
    
    # 计算每个方格周围地雷的数量
    def calculate_counts(self):
        for i in range(self.rows):
            for j in range(self.cols):
                if self.board[i][j] == '*':
                    continue
                count = 0
                if i > 0 and self.board[i-1][j] == '*': # 上
                    count += 1
                if i < self.rows-1 and self.board[i+1][j] == '*': # 下
                    count += 1
                if j > 0 and self.board[i][j-1] == '*': # 左
                    count += 1
                if j < self.cols-1 and self.board[i][j+1] == '*': # 右
                    count += 1
                if i > 0 and j > 0 and self.board[i-1][j-1] == '*': # 左上
                    count += 1
                if i > 0 and j < self.cols-1 and self.board[i-1][j+1] == '*': # 右上
                    count += 1
                if i < self.rows-1 and j > 0 and self.board[i+1][j-1] == '*': # 左下
                    count += 1
                if i < self.rows-1 and j < self.cols-1 and self.board[i+1][j+1] == '*': # 右下
                    count += 1
                self.board[i][j] = count
    
    # 点击指定方格
    def click(self, row, col):
        if self.game_over:
            return
        if self.board[row][col] == '*':
            self.game_over = True
            print('你输了,地雷爆炸了!')
        elif self.visible[row][col]:
            print('这个位置已经被翻开了。')
        else:
            self.visible[row][col] = True
            if self.board[row][col] == 0:
                self.clear_zeros(row, col)
            if self.check_win():
                self.game_over = True
                print('你赢了,所有地雷都被找到了!')
                
    # 翻开周围所有空白方格
    def clear_zeros(self, row, col):
        if self.board[row][col] != 0:
            return
        if self.visible[row][col]:
            return
        self.visible[row][col] = True
        if row > 0:
            self.clear_zeros(row-1, col) # 上
        if row < self.rows-1:
            self.clear_zeros(row+1, col) # 下
        if col > 0:
            self.clear_zeros(row, col-1) # 左
        if col < self.cols-1:
            self.clear_zeros(row, col+1) # 右
    
    # 检查是否已经找到所有地雷
    def check_win(self):
        for i in range(self.rows):
            for j in range(self.cols):
                if self.board[i][j] == '*' and not self.visible[i][j]:
                    return False
        return True

# 开始游戏
def play_game():
    rows = int(input("请输入行数:"))
    cols = int(input("请输入列数:"))
    mines = int(input("请输入地雷数量:"))
    
    game = Minesweeper(rows, cols, mines)
    
    while not game.game_over:
        game.display()
        row = int(input("请输入行号:"))
        col = int(input("请输入列号:"))
        game.click(row, col)
        
    play_again = input("再来一局?(y/n)")
    if play_again == 'y':
        play_game()
    else:
        print("游戏结束")
    
# 启动游戏
play_game()
 

在这个游戏中,玩家可以自定义行数、列数和地雷数量,然后输入方格的横纵坐标,并尝试找到所有的地雷。如果玩家点击到地雷,游戏将结束。如果玩家找到了所有地雷,游戏也将结束。游戏结束后,程序会询问玩家是否再玩一局游戏。

Python实现扫雷游戏,我们可以使用内置的数据结构和模块来模拟游戏面板和逻辑。这里是一个基础版本的扫雷游戏实现步骤概述: 1. 导入必要的模块:`random`用于生成随机的雷区布局,`numpy`或者列表可以用于创建二维数组表示游戏面板。 ```python import random ``` 2. 创建游戏面板:定义一个二维数组,其中0代表空地,数字代表埋藏的地雷数量。 ```python # 示例大小为10x10 board = [[0 for _ in range(10)] for _ in range(10)] mines = random.randint(10, 90) # 设定地雷数量 for _ in range(mines): x, y = random.randint(0, 9), random.randint(0, 9) board[x][y] = -1 表示地雷 ``` 3. 游戏界面:可以使用`input`函数接收玩家的操作,显示当前的面板状态。 ```python def display_board(board): print("\n".join([" ".join(str(cell) for cell in row) for row in board])) ``` 4. 点击操作:检查点击位置是否是地雷,如果是则游戏结束,如果不是,则递归搜索周围是否有地雷。 ```python def click(x, y, board): if board[x][y] == -1: return False else: board[x][y] = 'M' # 标记已探明 if all(board[i][j] != -1 for i in range(x-1, x+2) for j in range(y-1, y+2)): for i, j in [(i, j) for i in range(x-1, x+2) for j in range(y-1, y+2) if board[i][j] == 0]: click(i, j, board) return True ``` 5. 主循环:游戏开始,不断接收玩家的点击直到游戏结束。 ```python while True: display_board(board) move_x, move_y = map(int, input("请输入坐标 (行, 列): ").split()) if click(move_x, move_y, board): print("恭喜,游戏胜利!") break elif board[move_x][move_y] == -1: print("哎呀,踩到雷了,游戏结束。") break ``` 这个是一个非常基础的实现,实际游戏中还需要添加计数器、标记未探索区域等功能,以及更好的用户交互设计。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QuantumStack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值