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个地雷。然后循环询问玩家要打开的方格的位置,直到踩到地雷,游戏结束。每次打开方格后,游戏会打印当前棋盘的状态。
