managerPath = baseDirectory+"manager/stratego" #Path to the manager program
-scores = {"WIN":3, "DRAW":2, "LOSS":1, "NONE":0} #Score dictionary
-#NONE occurs if both programs crash. If only one program crashes the result is reported as a win-loss
+scores = {"VICTORY":(3,1), "DEFEAT":(1,3), "SURRENDER":(0,3), "DRAW":(2,2), "DRAW_DEFAULT":(1,1), "ILLEGAL":(-1,2), "DEFAULT":(2,-1), "BOTH_ILLEGAL":(-1,-1), "INTERNAL_ERROR":(0,0)} #Score dictionary
+verbose = True
#Make necessary directories
agents = []
for name in agentNames:
#sys.stdout.write("\nLooking at Agent: \""+ str(name)+"\"... ")
- sys.stdout.write("Scan \""+name+"\"... ")
+ if verbose:
+ sys.stdout.write("Scan \""+name+"\"... ")
if os.path.isdir(agentsDirectory+name) == False: #Remove non-directories
- sys.stdout.write(" Invalid! (Not a directory)\n")
+ if verbose:
+ sys.stdout.write(" Invalid! (Not a directory)\n")
continue
if os.path.exists(agentsDirectory+name+"/info") == False: #Try and find the special "info" file in each directory; ignore if it doesn't exist
- sys.stdout.write(" Invalid! (No \"info\" file found)\n")
+ if verbose:
+ sys.stdout.write(" Invalid! (No \"info\" file found)\n")
continue
- sys.stdout.write(" Valid!")
+ if verbose:
+ sys.stdout.write(" Valid!")
#sys.stdout.write("OK")
#Convert the array of names to an array of triples
#agents[0] - The name of the agent (its directory)
#agents[2] - The score the agent achieved in _this_ round. Begins at zero
agentExecutable = agentsDirectory+name+"/"+(open(agentsDirectory+name+"/info").readline().strip())
agents.append([name, agentExecutable, 0])
- sys.stdout.write(" (Run program \""+agentExecutable+"\")\n")
+ if verbose:
+ sys.stdout.write(" (Run program \""+agentExecutable+"\")\n")
if len(agents) == 0:
print "Couldn't find any agents! Check paths (Edit this script) or generate \"info\" files for agents."
sys.exit(0)
+if verbose:
+ print "Total: " + str(len(agents)) + " valid agents found (From "+str(len(agentNames))+" possibilities)"
+ print ""
+ print "Commencing ROUND " + str(roundNumber) + " combat! ("+str(nGames)+" games per pairing)"
-print "Total: " + str(len(agents)) + " valid agents found (From "+str(len(agentNames))+" possibilities)"
-
-print ""
-
-print "Commencing ROUND " + str(roundNumber) + " combat! ("+str(nGames)+" games per pairing)"
-print "Points values are: "+str(scores)
-print ""
normalGames = 0
draws = 0
continue #Exclude battles against self
for i in range(1, nGames/2 + 1):
#Play a game and read the result. Note the game is logged to a file based on the agent's names
- sys.stdout.write("Agents: \""+red[0]+"\" and \""+blue[0]+"\" playing game " + str(i) + "/"+str(nGames/2) + "... ")
+ if verbose:
+ sys.stdout.write("Agents: \""+red[0]+"\" and \""+blue[0]+"\" playing game " + str(i) + "/"+str(nGames/2) + "... ")
logFile = logDirectory + "round"+str(roundNumber) + "/"+red[0]+"_vs_"+blue[0]+"_"+str(i)
outline = os.popen(managerPath + " -o " + logFile + " " + red[1] + " " + blue[1], "r").read()
results = outline.split(' ')
- #Look at who won, and adjust scores based on that
- if results[0] == "NONE":
- red[2] += scores["NONE"]
- blue[2] += scores["NONE"]
- sys.stdout.write(" No contest. (Check AI for errors).\n")
- aiErrors += 1
- elif results[0] == "DRAW":
- red[2] += scores["DRAW"]
- blue[2] += scores["DRAW"]
- sys.stdout.write(" Draw.\n")
- draws += 1
- elif results[0] == red[1]:
- red[2] += scores["WIN"]
- blue[2] += scores["LOSS"]
- sys.stdout.write(" \""+red[0]+"\"\n")
- normalGames += 1
- elif results[0] == blue[1]:
- red[2] += scores["LOSS"]
- blue[2] += scores["WIN"]
- sys.stdout.write(" \""+blue[0]+"\"\n")
- normalGames += 1
+
+ if len(results) != 6:
+ if verbose:
+ sys.stdout.write("Garbage output! " + outline)
else:
- sys.stdout.write(" Garbage output! \""+outline+"\" (log file \""+logFile+"\")\n")
- managerErrors += 1
-
+ if results[1] == "RED":
+ red[2] += scores[results[2]][0]
+ blue[2] += scores[results[2]][1]
+ elif results[1] == "BLUE":
+ red[2] += scores[results[2]][1]
+ blue[2] += scores[results[2]][0]
+ elif results[1] == "BOTH":
+ red[2] += scores[results[2]][0]
+ blue[2] += scores[results[2]][1]
+ red[2] += scores[results[2]][1]
+ blue[2] += scores[results[2]][0]
+
+ if verbose:
+ sys.stdout.write(" " + outline)
+
+
+
+
-print "Completed combat. Total of " + str(normalGames + draws + aiErrors + managerErrors) + " games played. "
+
+if verbose:
+ print "Completed combat. Total of " + str(normalGames + draws + aiErrors + managerErrors) + " games played. "
if managerErrors != 0:
- print " WARNING: Recieved "+str(managerErrors)+" garbage outputs. Check the manager program."
+ print "WARNING: Recieved "+str(managerErrors)+" garbage outputs. Check the manager program."
-print ""
+if verbose:
+ print ""
#We should now have complete score values.
-
-sys.stdout.write("Creating results files for ROUND " + str(roundNumber) + "... ")
+if verbose:
+ sys.stdout.write("Creating results files for ROUND " + str(roundNumber) + "... ")
agents.sort(key = lambda e : e[2], reverse=True) #Sort the agents based on score
for agent in agents:
resultsFile.write(agent[0] + " " + str(agent[2]) +"\n") #Write the agent names and scores into the file, in descending order
-sys.stdout.write(" Complete!\n")
-
-sys.stdout.write("Updating total scores... ");
+if verbose:
+ sys.stdout.write(" Complete!\n")
+ sys.stdout.write("Updating total scores... ");
#Now update the total scores
if os.path.exists(resultsDirectory+"total.scores"):
- sys.stdout.write(" Reading from \""+resultsDirectory+"total.scores\" to update scores... ")
+ if verbose:
+ sys.stdout.write(" Reading from \""+resultsDirectory+"total.scores\" to update scores... ")
totalFile = open(resultsDirectory+"total.scores", "r") #Try to open the total.scores file
for line in totalFile: #For all entries,
data = line.split(' ')
agents.sort(key = lambda e : e[2], reverse=True)
else:
- sys.stdout.write(" First round - creating \""+resultsDirectory+"total.scores\"... ")
-sys.stdout.write(" Complete!\n")
+ if verbose:
+ sys.stdout.write(" First round - creating \""+resultsDirectory+"total.scores\"... ")
+if verbose:
+ sys.stdout.write(" Complete!\n")
+ print "Finished writing results for ROUND " + str(roundNumber)
+ print ""
-print "Finished writing results for ROUND " + str(roundNumber)
-print ""
print "RESULTS FOR ROUND " + str(roundNumber)
print "Agent: [name, path, total_score, recent_score]"