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
|
""" bots/dssp.py - päättelee kahden vierekkäisen laatan perusteella """
from random import sample
from .simple import SimpleBot
class DSSPBot(SimpleBot):
""" Kahta pistettä tutkiva tekoäly. Käyttää pohjana SipleBot tekoälyä """
def get_pairs(self):
""" Etsii kiinnostavien laattojen joukosta vierekkäiset """
tiles = list(self.get_interesting_tiles())
pairs = []
for i, tile1 in enumerate(tiles):
for _, tile2 in enumerate(tiles, i+1):
if self.are_neighbours(tile1,tile2):
pairs.append((tile1,tile2))
pairs.append((tile2,tile1))
return pairs
def search(self):
""" Etsitään voiko viereisen numerolaatan osoittamat miinat ja
epävarmat poistamalla päätellä onko jokin nykyisen laatan tuntematon
vapaa. """
if super().search():
return True
for tile1, tile2 in self.get_pairs():
c1 = self.get_value(tile1)
c2 = self.get_value(tile2)
n1 = self.get_neighbours(tile1)
n2 = self.get_neighbours(tile2)
self.remove_known_safe_tiles(n1)
self.remove_known_safe_tiles(n2)
c1 -= self.remove_mine_tiles(n1)
c2 -= self.remove_mine_tiles(n2)
# otetaan vain alue1:n laatat pois vähennetään se pommeista
# näin tiedetään montako pommia on jäätävä yhteiselle alueelle
nc = n1 & n2
n1 = n1 - nc
n2 = n2 - nc
cc = c1 - len(n1)
# jos yhteiselle alueelle ei jääkkään pommeja
if cc < 1:
continue
# vähennetään yhteinen alue ja sen pommit alueesta 2
# jos jäljelle ei jää miinoja merkataan alueet seiffeiks
c2 -= cc
if c2 == 0:
self.safe_tiles |= n2
return self.saved_hints()
def lucky_guess(self):
heatmap = dict.fromkeys(self.get_unknown_tiles(), float(0))
tiles = self.get_border_tiles()
for tile in tiles:
n = self.get_neighbours(tile)
c = self.get_value(tile) - self.remove_mine_tiles(n)
self.remove_known_safe_tiles(n)
for ntile in n:
heatmap[ntile] += c/len(n)
for tile in heatmap:
if tile[0] in range(1,self.w-1):
heatmap[tile]+=0.005
if tile[1] in range(1,self.h-1):
heatmap[tile]+=0.005
best = min((x for _, x in heatmap.items()))
best_tiles = [x for x,y in heatmap.items() if y == best]
if best_tiles:
self.safe_tiles.add(sample(best_tiles,1)[0])
return True
return False
|