欢迎访问宙启技术站
智能推送

Python实现一个简单的扫雷游戏

发布时间:2023-12-04 22:57:44

以下是一个简单的扫雷游戏的Python实现。游戏使用一个二维列表来表示扫雷的棋盘,每个方格代表一个地雷或者一个数字(代表周围地雷的数量),玩家需要根据数字判断哪些方格是安全的,以及哪些方格可能是地雷。

import random

class Minesweeper:
    def __init__(self, rows, cols, mines):
        self.rows = rows
        self.cols = cols
        self.mines = mines
        self.board = [[0] * cols for _ in range(rows)]
        self.is_open = [[False] * cols for _ in range(rows)]

    def place_mines(self):
        mines_placed = 0
        while mines_placed < self.mines:
            row = random.randint(0, self.rows - 1)
            col = random.randint(0, self.cols - 1)
            if self.board[row][col] != -1:
                self.board[row][col] = -1
                mines_placed += 1

    def calculate_numbers(self):
        for row in range(self.rows):
            for col in range(self.cols):
                if self.board[row][col] != -1:
                    count = 0
                    neighbors = self.get_neighbors(row, col)
                    for neighbor in neighbors:
                        if self.board[neighbor[0]][neighbor[1]] == -1:
                            count += 1
                    self.board[row][col] = count

    def get_neighbors(self, row, col):
        neighbors = []
        for i in range(max(row - 1, 0), min(row + 1, self.rows - 1) + 1):
            for j in range(max(col - 1, 0), min(col + 1, self.cols - 1) + 1):
                if i != row or j != col:
                    neighbors.append((i, j))
        return neighbors

    def open_square(self, row, col):
        if self.board[row][col] == -1:
            return False
        self.is_open[row][col] = True
        if self.board[row][col] == 0:
            neighbors = self.get_neighbors(row, col)
            for neighbor in neighbors:
                if not self.is_open[neighbor[0]][neighbor[1]]:
                    self.open_square(neighbor[0], neighbor[1])
        return True

    def print_board(self):
        for row in range(self.rows):
            for col in range(self.cols):
                if self.is_open[row][col]:
                    if self.board[row][col] == -1:
                        print("*", end=" ")
                    else:
                        print(self.board[row][col], end=" ")
                else:
                    print(".", end=" ")
            print()

# 使用例子
game = Minesweeper(8, 8, 10)
game.place_mines()
game.calculate_numbers()
game.print_board()

while True:
    row = int(input("请输入要揭开方格的行号(0-7):"))
    col = int(input("请输入要揭开方格的列号(0-7):"))

    if not game.open_square(row, col):
        print("你踩到了地雷,游戏结束!")
        break

    game.print_board()

这个程序使用Minesweeper类来表示扫雷游戏。在初始化的时候,需要指定棋盘的行数、列数和地雷数量。place_mines方法用于随机放置地雷,calculate_numbers方法计算每个方格周围的地雷数量。open_square方法用于打开指定行和列的方格,如果踩到地雷返回False,否则返回True

在使用例子中,首先创建一个8x8的扫雷游戏,并放置了10个地雷。然后循环询问玩家要打开的方格的位置,直到踩到地雷,游戏结束。每次打开方格后,游戏会打印当前棋盘的状态。