-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchesster.py
91 lines (71 loc) · 2.62 KB
/
chesster.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
import chess
import random
from monte import GameState, ISMCTS
from mcts import MCTSController
class ChessState(GameState):
def __init__(self, board=None):
if board:
self.board = board
else:
self.board = chess.Board()
self.numberOfPlayers = 2
self.playerToMove = 1
def Clone(self):
st = ChessState(self.board.copy())
return st
def CloneAndRandomize(self, observer):
st = self.Clone()
return st
def GetNextPlayer(self, p):
next = (p % self.numberOfPlayers) + 1
return next
def DoMove(self, move):
self.board.push_san(move)
self.playerToMove = self.GetNextPlayer(self.playerToMove)
def UndoMove(self):
self.board.pop()
def GetMoves(self):
if self.board.is_checkmate() or self.board.is_insufficient_material() or self.board.is_game_over():
return []
moves = []
for move in self.board.legal_moves:
moves.append(move.uci())
#print(f"{len(moves)} moves")
return moves
def GetResult(self, player):
if self.board.is_checkmate() and player != self.playerToMove:
return 1
else:
return 0
def __repr__(self):
""" Return a human-readable representation of the state
"""
return str(self.board)
def strrep(self):
return str(self.board).replace("\n", "line").replace(" ", "")
def __hash__(self):
return hash(str(self.board))
if __name__ == "__main__":
state = ChessState()
mcts = MCTSController()
while state.GetMoves() != []:
prev_turn = state.playerToMove
print(str(state))
# Use different numbers of iterations (simulations, tree nodes) for different players
if state.playerToMove == 1:
# m = mcts.best_move(state, playouts=5)
#print(f"\Best Move: {m}\n")
m, node = ISMCTS(rootstate = state, itermax = 1000, verbose = False)
print(f"Best Move: {m} ({(node.wins/node.visits)*100:.1f}%)\n")
else:
m = random.choice(state.GetMoves())
print(f"\nRandom Move: {m}\n")
#print(f"Best Move: {m} ({(node.wins/node.visits)*100:.1f}%)\n")
state.DoMove(m)
print(state)
if state.board.is_insufficient_material():
print("Nobody wins!")
elif state.board.is_checkmate():
print(f"Somebody got checkmated. Ending turn: {state.playerToMove}. <--- Is that the loser?")
else:
print("i don't know.")