-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
178 lines (133 loc) · 5.53 KB
/
main.py
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
from zuege import ausfuehren
import feld
import gui.events as evnt
import gui.draw as draw
import zuege.berechnen as zuege
import zuege.minimax as mm
import copy
class Hauptklasse:
feld = []
SPIELFELDGROESSE = 8
moegZuege = None
bereitsBerechnet = False
miniMaxOnBlau = False
miniMaxOnGruen = False
besterZug = None
startspieler = True
vorherigeZuege = []
def __init__(self):
self.momSpieler = True # Momentaner Spieler => gruen = True; blau = False
# Erzeugen des Ausgangszustandes des Spielfeldes
def startFeld(self):
spielfeld = []
# Fuer jedes Feld ein Objekt von feld erstellen
for y in range(self.SPIELFELDGROESSE):
spielfeld.append([])
for x in range(self.SPIELFELDGROESSE):
spielfeld[y].append(feld.Feld(y, x))
# Farbe des Feldes
if (y + x) % 2 == 0:
spielfeld[y][x].makeBlack(True)
# Steine belegung
if y < 3:
spielfeld[y][x].makeComputer(True)
elif y > 4:
spielfeld[y][x].makePlayer(True)
else:
spielfeld[y][x].makeWhite(True)
return spielfeld
# Einen Zug zurueck gehen
def zugZurueck(self):
# Neues Feld = letztes gespeichertes Feld
if self.vorherigeZuege != []:
self.feld = self.vorherigeZuege[-1]
self.vorherigeZuege.pop()
self.momSpieler = not self.momSpieler
self.bereitsBerechnet = False
self.miniMaxOnBlau = False
self.miniMaxOnGruen = False
# Zug zu vorherigen Zuegen hinzufuegen
def addZugZurueck(self):
altesFeld = copy.deepcopy(self.feld)
# Alle felder entmarkieren um Grafikfehler zu vermeiden
for y in range(self.SPIELFELDGROESSE):
for x in range(self.SPIELFELDGROESSE):
altesFeld[y][x].makeClicked(False)
altesFeld[y][x].makeMoeglicherZug(False)
self.vorherigeZuege.append(altesFeld)
# aktuellen Spieler wechseln
def wechselSpieler(self):
self.momSpieler = not self.momSpieler
# Feld zuruecksetzen
def resetFeld(self):
self.feld = self.startFeld()
self.gewonnen = False
self.bereitsBerechnet = False
self.startspieler = not self.startspieler
self.momSpieler = self.startspieler
self.vorherigeZuege = []
# bereitsBerechnet zuruecksetzen
def resetBereitsBerechnet(self):
self.bereitsBerechnet = False
# Zwischen Minimax und Manuell wechseln Blau
def wechselMiniMaxOnBlau(self):
# Checken ob bereits ein bester Zug ermittelt wurde und ggf. entfernen
if self.miniMaxOnBlau and self.besterZug != None:
self.besterZug[3].makeClicked(False)
self.besterZug[0].makeMoeglicherZug(False)
self.miniMaxOnBlau = not self.miniMaxOnBlau
# Stand des Buttons aufrufen
def getMiniMaxOnBlau(self):
return self.miniMaxOnBlau
# Zwischen Minimax und Manuell wechseln Gruen
def wechselMiniMaxOnGruen(self):
# Checken ob bereits ein bester Zug ermittelt wurde und ggf. entfernen
if self.miniMaxOnGruen and self.besterZug != None:
self.besterZug[3].makeClicked(False)
self.besterZug[0].makeMoeglicherZug(False)
self.miniMaxOnGruen = not self.miniMaxOnGruen
# Stand des Buttons aufrufen
def getMiniMaxOnGruen(self):
return self.miniMaxOnGruen
# Hauptklasse
def main(self, h):
# Startfeld erzeugen
self.feld = self.startFeld()
# Dauerschleife
while True:
# Alle moeglichen Zuege fuer den aktuellen Spieler berechnen
zuege.moeglicheZuege(self.feld, self.momSpieler)
# Manuell ziehen
if not self.miniMaxOnBlau and not self.momSpieler or not self.miniMaxOnGruen and self.momSpieler:
evnt.mausGedrueckt(
self.feld, self.SPIELFELDGROESSE, self.momSpieler, h)
# Minimax
else:
# Gezeichnete Punkte und Wege rueckgängig machen
letzteMarkiert = ausfuehren.getLetzteMarkiert()
if letzteMarkiert != None:
letzteMarkiert.makeClicked(False)
for nachbar in ausfuehren.getLetzteNachbarn():
nachbar.makeMoeglicherZug(False)
# Berechnet den besten Zug
if not self.bereitsBerechnet:
self.besteBewertung, self.besterZug = mm.minimax(
self.feld, self.momSpieler)
self.bereitsBerechnet = True
continue
# Setzt den besten Zug
else:
# Wenn bereits ein bester Zug berechnet wurde diesen anzeigen
if self.besterZug != None:
self.besterZug[3].makeClicked(True)
ausfuehren.setLetzteMarkiert(self.besterZug[3])
self.besterZug[0].makeMoeglicherZug(True)
ausfuehren.setLetzteNachbarn([self.besterZug[0]])
zuege.setzeBestenZug(self.feld, self.besterZug)
evnt.mausGedrueckt(
self.feld, self.SPIELFELDGROESSE, self.momSpieler, h)
# Das aktuelle Spielfeld zeichnen
draw.draw(self.feld, self.SPIELFELDGROESSE, self.momSpieler, h)
if __name__ == "__main__":
h = Hauptklasse()
h.main(h)