74 lines
1.8 KiB
Python
74 lines
1.8 KiB
Python
|
""" Игра Сапер
|
||
|
|
||
|
https://stepik.org/lesson/701975/step/12?unit=702076
|
||
|
"""
|
||
|
|
||
|
import random
|
||
|
|
||
|
|
||
|
class Cell:
|
||
|
def __init__(self, around_mines, mine):
|
||
|
self.around_mines, self.mine = around_mines, mine
|
||
|
self.fl_open = False
|
||
|
|
||
|
|
||
|
class GamePole:
|
||
|
around_offsets = (
|
||
|
(-1, -1),
|
||
|
(-1, 0),
|
||
|
(-1, 1),
|
||
|
(0, -1),
|
||
|
(0, 1),
|
||
|
(1, -1),
|
||
|
(1, 0),
|
||
|
(1, 1),
|
||
|
)
|
||
|
|
||
|
def __init__(self, N, M):
|
||
|
self.N, self.M = N, M
|
||
|
self.init()
|
||
|
|
||
|
def init(self):
|
||
|
gen = iter(range(1, self.M + 1))
|
||
|
flat_pole = [
|
||
|
Cell(0, bool(next(gen, 0))) for _ in range(self.N) for _ in range(self.N)
|
||
|
]
|
||
|
random.shuffle(flat_pole)
|
||
|
self.pole = [flat_pole[i : i + self.N] for i in range(0, self.N**2, self.N)]
|
||
|
self.fill_around()
|
||
|
|
||
|
def fill_around(self):
|
||
|
for i in range(self.N):
|
||
|
for j in range(self.N):
|
||
|
self.pole[i][j].around_mines = self.count_around(i, j)
|
||
|
|
||
|
def count_around(self, x, y):
|
||
|
return sum(
|
||
|
(
|
||
|
self.pole[x + i][y + j].mine
|
||
|
for i, j in GamePole.around_offsets
|
||
|
if 0 <= x + i < self.N and 0 <= y + j < self.N
|
||
|
)
|
||
|
)
|
||
|
|
||
|
def open(self):
|
||
|
for i in range(self.N):
|
||
|
for j in range(self.N):
|
||
|
self.pole[i][j].fl_open = True
|
||
|
|
||
|
def show(self):
|
||
|
for row in self.pole:
|
||
|
print(
|
||
|
*map(
|
||
|
lambda x: (
|
||
|
"#" if not x.fl_open else x.around_mines if not x.mine else "*"
|
||
|
),
|
||
|
row,
|
||
|
)
|
||
|
)
|
||
|
|
||
|
|
||
|
pole_game = GamePole(10, 12)
|
||
|
pole_game.open()
|
||
|
pole_game.show()
|