-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnamedGame.py
96 lines (83 loc) · 2.78 KB
/
namedGame.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
''' Sorry no comments :).
'''
import Goban
import importlib
import time
from io import StringIO
import sys
def fileorpackage(name):
if name.endswith(".py"):
return name[:-3]
return name
if len(sys.argv) > 2:
classNames = [fileorpackage(sys.argv[1]), fileorpackage(sys.argv[2])]
elif len(sys.argv) > 1:
classNames = [fileorpackage(sys.argv[1]), 'myPlayer']
else:
classNames = ['myPlayer', 'myPlayer']
b = Goban.Board()
players = []
player1class = importlib.import_module(classNames[0])
player1 = player1class.myPlayer()
player1.newGame(Goban.Board._BLACK)
players.append(player1)
player2class = importlib.import_module(classNames[1])
player2 = player2class.myPlayer()
player2.newGame(Goban.Board._WHITE)
players.append(player2)
totalTime = [0,0] # total real time for each player
nextplayer = 0
nextplayercolor = Goban.Board._BLACK
nbmoves = 1
outputs = ["",""]
sysstdout= sys.stdout
stringio = StringIO()
wrongmovefrom = 0
while not b.is_game_over():
print("Referee Board:")
b.prettyPrint()
print("Before move", nbmoves)
legals = b.legal_moves() # legal moves are given as internal (flat) coordinates, not A1, A2, ...
print("Legal Moves: ", [b.move_to_str(m) for m in legals]) # I have to use this wrapper if I want to print them
nbmoves += 1
otherplayer = (nextplayer + 1) % 2
othercolor = Goban.Board.flip(nextplayercolor)
currentTime = time.time()
sys.stdout = stringio
move = players[nextplayer].getPlayerMove() # The move must be given by "A1", ... "J8" string coordinates (not as an internal move)
sys.stdout = sysstdout
playeroutput = stringio.getvalue()
stringio.truncate(0)
stringio.seek(0)
print(("[Player "+str(nextplayer) + "] ").join(playeroutput.splitlines(True)))
outputs[nextplayer] += playeroutput
totalTime[nextplayer] += time.time() - currentTime
print("Player ", nextplayercolor, players[nextplayer].getPlayerName(), "plays: " + move) #changed
if not Goban.Board.name_to_flat(move) in legals:
print(otherplayer, nextplayer, nextplayercolor)
print("Problem: illegal move")
wrongmovefrom = nextplayercolor
break
b.push(Goban.Board.name_to_flat(move)) # Here I have to internally flatten the move to be able to check it.
players[otherplayer].playOpponentMove(move)
nextplayer = otherplayer
nextplayercolor = othercolor
print("The game is over")
b.prettyPrint()
result = b.result()
print("Time:", totalTime)
print("GO Score:", b.final_go_score())
print("Winner: ", end="")
if wrongmovefrom > 0:
if wrongmovefrom == b._WHITE:
print("BLACK")
elif wrongmovefrom == b._BLACK:
print("WHITE")
else:
print("ERROR")
elif result == "1-0":
print("WHITE")
elif result == "0-1":
print("BLACK")
else:
print("DEUCE")