add minesweeper.py
This commit is contained in:
parent
51a10a656c
commit
733812c5bb
73
minesweeper.py
Normal file
73
minesweeper.py
Normal file
@ -0,0 +1,73 @@
|
||||
""" Игра Сапер
|
||||
|
||||
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()
|
Loading…
Reference in New Issue
Block a user