-
Notifications
You must be signed in to change notification settings - Fork 0
/
FoxAndSheeps.py
193 lines (164 loc) · 6.31 KB
/
FoxAndSheeps.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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
"""
This is the main python file for running the whole project, of course, it has
all available options to manipulate the game and results.
It also should be able to connect with all other associated python files.
Written by Ali Zandian (alizandian@outlook.com) for University project, researching a better way to gauge unlimited trees.
A project at the university of Ashrafi Esfahani.
"""
import entities as Entities
import graphics as Graphics
import bot as Bot
import profiler as Profiler
import statistics as Statistics
import game as Game
import player as Player
import threading as Threading
import statistics
# Global instances
Display = Graphics.Display("Fox and Sheeps!", '#ccb684')
Board = Entities.Board()
Gameplay = None
GameplayThread = None
def Initialization():
""" Each time we are refreshing the page, we're doing this """
Display.Initialization(Board)
def Start():
""" Equivalent to the action of the 'Start' button. Roughly making a new game play """
global GameplayThread
global DefaultFox
global oncePressed
global Gameplay
global Display
#region Figuring out the fox controller
foxController = None
foxControllerType = Display.GetFoxControllerType()
if(foxControllerType == Entities.ControllerType.Bot):
strategy = Display.GetFoxStrategy()
if(strategy != None):
foxController = Bot.Agent(strategy)
depth = Display.GetFoxDepth()
if(depth != None):
foxController.depth = depth
if(strategy == Entities.Strategy.Deepimax):
roa = Display.GetFoxROA()
if(roa != None):
foxController.roa = roa
doa = Display.GetFoxDOA()
if(doa != None):
foxController.doa = doa
elif(foxControllerType == Entities.ControllerType.Player):
name = Display.GetFoxName()
if(name != None):
foxController = Player.Player(name, Display)
# Default controller for Fox
if(foxController == None):
foxController = Bot.Agent(Entities.Strategy.Minimax)
foxController.depth = 1
#endregion
#region Figuring out the sheeps controller
sheepsController = None
sheepsControllerType = Display.GetSheepControllerType()
if(sheepsControllerType == Entities.ControllerType.Bot):
strategy = Display.GetSheepsStrategy()
if(strategy != None):
sheepsController = Bot.Agent(strategy)
depth = Display.GetSheepsDepth()
if(depth != None):
sheepsController.depth = depth
if(strategy == Entities.Strategy.Deepimax):
roa = Display.GetSheepsROA()
if(roa != None):
sheepsController.roa = roa
doa = Display.GetSheepsDOA()
if(doa != None):
sheepsController.doa = doa
elif(sheepsControllerType == Entities.ControllerType.Player):
name = Display.GetSheepsName()
if(name != None):
foxController = Player.Player(name, Display)
# Default controller for Fox
if(sheepsController == None):
sheepsController = Bot.Agent(Entities.Strategy.Minimax)
sheepsController.depth = 1
#endregion
# Other options of the board
maxMoves = Display.GetMaxMoves()
if(maxMoves == None):
maxMoves = 0
time = Display.GetTime()
if(time == None):
time = 0
turn = Display.GetTurn()
if(turn == None):
turn = 0
Gameplay = Game.Gameplay(board = Board,
display = Display,
foxController = foxController,
sheepsController = sheepsController,
maxMoveCount = maxMoves,
time = time,
turn = turn,
actionUpdate = ActionUpdate,
startCallFunc = GameplayStarts,
endCallFunc = GameplayEnds)
#===================================================================
# The Game-play thread Starts here (A new thread deviates from here)
#===================================================================
GameplayThread = Threading.Thread(target = Gameplay.Go)
GameplayThread.start()
# GAME PLAY THREAD
def GameplayStarts():
""" For startups of everything by the gameplay """
Profiler.Start()
pass
# GAME PLAY THREAD
def ActionUpdate(topNode, controller):
""" Each time any action is being taken, here we call the update """
controllerTitle = controller.title
if(Bot.Agent == type(controller)):
controllerTitle += " " + str(controller.depth)
if(controller.strategy == Entities.Strategy.Deepimax):
controllerTitle += " (" + str(controller.doa) + "," + str(controller.roa) + ")"
if(Display.drawTreeCheckVar.get() == 1):
Statistics.DrawTree(topNode, controllerTitle)
if(Display.compareVar.get() == 1):
if(Profiler.previousProfileData != None):
print ("previous Data is not null, ready to draw")
previouseData = Profiler.previousProfileData
Statistics.DrawComparison(previouseData, Profiler.Print(True, controllerTitle), int(Display.compareTypeRadioVar.get()))
else:
Profiler.Print(True, controllerTitle)
Profiler.DumpProfilerInfo()
pass
# GAME PLAY THREAD
def GameplayEnds():
""" For warping of everything by the gameplay """
# Do things when the gameplay thread finishes
Profiler.End()
if(Display.compareVar.get() == 0):
Profiler.Print(False, "")
def Reset():
"""
Refresh the whole window for other experiments, it also
terminate the current thread of the gameplay, in the other hand,
terminate the current running game.
"""
global Display
global Gameplay
global Board
global GameplayThread
if(Gameplay != None):
if(Gameplay.isGameTerminated == False):
Gameplay.End()
Gameplay = None
Board = Entities.Board()
Initialization()
#========================
# Application Starts here
#========================
Initialization()
# Linking graphics inputs
Display.SetStartHandler(func = Start)
Display.SetResetHandler(func = Reset)
# Main loop
Display.mainFrame.mainloop()