1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
from random import randrange
from sys import stderr
from copy import deepcopy
class Board():
def __init__(self, size = 10):
self.size = size
self.tiles = []
self.masked = []
self.initialize_tiles( size )
self.randomize_bombs( size )
self.calculate_neighbours()
def initialize_tiles(self, size):
self.tiles = [[0 for _ in range(size)] for _ in range(size)]
self.masked = [[10 for _ in range(size)] for _ in range(size)]
def randomize_bombs(self, bomb_count):
for _ in range(bomb_count):
while True:
x, y = randrange(0,self.size), randrange(0,self.size)
if self.tiles[x][y] != 0:
continue
self.tiles[x][y]=9
break
def invalid_coordinates(self, x, y):
return x < 0 or x >= self.size or y < 0 or y >= self.size
def calculate_neighbours(self):
neighbours = ( (-1,-1), (0,-1), (1,-1),
(-1, 0), (1, 0),
(-1, 1), (0, 1), (1, 1) )
for y in range(self.size):
for x in range(self.size):
if self.tiles[x][y] == 9:
continue
neighbouring_bombs = 0
for dx,dy in neighbours:
if self.invalid_coordinates(x+dx, y+dy):
continue
if self.tiles[x+dx][y+dy] == 9:
neighbouring_bombs += 1
self.tiles[x][y] = neighbouring_bombs
def get_view(self):
view = deepcopy(self.masked)
for y in range(self.size):
for x in range(self.size):
if not view[x][y]:
view[x][y]=self.tiles[x][y]
return view
def is_winning(self):
for y in range(self.size):
for x in range(self.size):
if self.tiles[x][y] != 9 and self.masked[x][y]:
return False
return True
def collect_area(self, x, y, area=set()):
to_test = []
for dx, dy in ( (0,-1), (-1,0), (1,0), (0,1) ):
if self.invalid_coordinates(x+dx, y+dy):
continue
if self.tiles[x+dx][y+dy] == 0 and (x+dx,y+dy) not in area:
to_test.append((x+dx, y+dy))
area.add((x+dx, y+dy))
for tx, ty in to_test:
area.add((x,y))
area=area.union(self.collect_area(tx, ty, area))
return area
def make_guess(self, x, y):
if self.invalid_coordinates(x, y):
print("Koordinaatit on pelilaudan ulkopuolella", file=stderr)
return False
if self.masked[x][y] == 0:
print("Ruutu on jo avattu", file=stderr)
return False
if self.tiles[x][y] == 9:
self.masked[x][y] = 0
return False
if self.tiles[x][y] == 0:
for cx, cy in self.collect_area( x, y ):
for dx, dy in ( (0,-1), (-1,0), (0,0), (1,0), (0,1) ):
if not self.invalid_coordinates(cx+dx, cy+dy):
self.masked[cx+dx][cy+dy] = 0
else:
self.masked[x][y] = 0
return True
if __name__ == "__main__":
def print_matrix(m):
for y in range(len(m)):
for x in range(len(m[0])):
print(end=f"[{m[x][y]:x}]")
print()
b = Board()
b.make_guess(5,5)
print_matrix(b.get_view())
|