简单的面向对象之扫雷小游戏代码
时间: 2023-09-05 10:08:52 浏览: 170
好的,以下是一个简单的面向对象的扫雷小游戏代码示例:
```python
import random
class Minesweeper:
def __init__(self, width, height, num_mines):
self.width = width
self.height = height
self.num_mines = num_mines
self.board = [[0 for _ in range(width)] for _ in range(height)]
self.mines = []
self.hidden = [[True for _ in range(width)] for _ in range(height)]
self.game_over = False
# randomly place mines on the board
while len(self.mines) < num_mines:
x = random.randint(0, width - 1)
y = random.randint(0, height - 1)
if (x, y) not in self.mines:
self.mines.append((x, y))
self.board[y][x] = "X"
# calculate the number of mines adjacent to each square
for y in range(height):
for x in range(width):
if self.board[y][x] == "X":
continue
count = 0
for dy in [-1, 0, 1]:
for dx in [-1, 0, 1]:
if dy == 0 and dx == 0:
continue
if 0 <= y + dy < height and 0 <= x + dx < width and self.board[y + dy][x + dx] == "X":
count += 1
self.board[y][x] = count
def __str__(self):
result = ""
for y in range(self.height):
for x in range(self.width):
if self.hidden[y][x]:
result += "#"
else:
if self.board[y][x] == "X":
result += "X"
else:
result += str(self.board[y][x])
result += "\n"
return result
def reveal(self, x, y):
if self.hidden[y][x]:
self.hidden[y][x] = False
if self.board[y][x] == "X":
self.game_over = True
elif self.board[y][x] == 0:
for dy in [-1, 0, 1]:
for dx in [-1, 0, 1]:
if dy == 0 and dx == 0:
continue
if 0 <= y + dy < self.height and 0 <= x + dx < self.width:
self.reveal(x + dx, y + dy)
def is_win(self):
for y in range(self.height):
for x in range(self.width):
if self.board[y][x] != "X" and self.hidden[y][x]:
return False
return True
# example usage
game = Minesweeper(10, 10, 10)
while not game.game_over and not game.is_win():
print(game)
x = int(input("Enter x coordinate: "))
y = int(input("Enter y coordinate: "))
game.reveal(x, y)
if game.game_over:
print("Game over!")
else:
print("You win!")
```
在这个示例代码中,我们定义了一个 `Minesweeper` 类来表示扫雷游戏。我们使用一个二维列表来表示游戏板,每个方块可以是一个数字(表示周围的地雷数量)或 "X"(表示这个方块是地雷)。我们还使用一个二维列表来表示哪些方块是隐藏的,哪些是已经被揭示的。我们使用一个列表来存储地雷的位置。
在 `__init__` 方法中,我们随机放置了一些地雷,并计算了每个方块周围的地雷数量。在 `__str__` 方法中,我们将游戏板和隐藏状态转换成一个字符串来展示给玩家。在 `reveal` 方法中,我们揭示了一个方块并递归揭示周围的方块,直到没有更多的空白方块为止。在 `is_win` 方法中,我们检查是否还有未揭示的非地雷方块,如果没有就说明玩家获胜了。
在示例代码的最后,我们创建了一个 `Minesweeper` 实例,并开始一个游戏循环,直到游戏结束或者玩家获胜。在每个循环中,我们展示当前游戏状态,等待玩家输入要揭示的方块的坐标,然后调用 `reveal` 方法来揭示方块。最后,我们检查游戏是否结束,并输出相应的提示信息。
阅读全文