go-ai/go_player/namedGame.py
2025-05-17 15:36:19 +02:00

111 lines
2.9 KiB
Python

"""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")