fixed stockfish probs

This commit is contained in:
Rudis Muiznieks 2022-04-26 10:09:44 -05:00
parent 0396644151
commit 08bd3e835c
Signed by: rudism
GPG Key ID: CABF2F86EF7884F9
2 changed files with 25 additions and 21 deletions

View File

@ -1,6 +1,6 @@
from icecream import ic from icecream import ic
from graphics import Graphics from graphics import Graphics
from chess import Board, Color, WHITE, BLACK from chess import Board, Color, WHITE
class Draw: class Draw:
BOARD_SIZE = 64 BOARD_SIZE = 64
@ -80,10 +80,10 @@ class Draw:
self.BOARD_SIZE, 0, self.BOARD_SIZE, self.BOARD_SIZE, 0) self.BOARD_SIZE, 0, self.BOARD_SIZE, self.BOARD_SIZE, 0)
def draw_board(self, board: Board, player_color: Color): def draw_board(self, board: Board, player_color: Color):
ic(board)
self._graphics.fill_rect(0, 0, self.BOARD_SIZE, self.BOARD_SIZE, 0) self._graphics.fill_rect(0, 0, self.BOARD_SIZE, self.BOARD_SIZE, 0)
nb = "".join(str(board).split()).replace(" ", "") nb = "".join(str(board).split()).replace(" ", "")
nb = nb if player_color == WHITE else nb[::-1] nb = nb if player_color == WHITE else nb[::-1]
ic(player_color, nb)
c = True c = True
for row in range(8): for row in range(8):
for col in range(8): for col in range(8):

View File

@ -17,7 +17,7 @@ class GameState(Enum):
class ChessGame: class ChessGame:
SAVE_FILE = path.join("data", "chess_state.fen") SAVE_FILE = path.join("data", "chess_state.fen")
MAX_THINKING_SECONDS = 3 STOCKFISH_MOVE_TIME = 3
def __init__(self, cinput: ControlInput, graphics: Graphics): def __init__(self, cinput: ControlInput, graphics: Graphics):
self._sf = Stockfish(shutil.which("stockfish") or "stockfish") self._sf = Stockfish(shutil.which("stockfish") or "stockfish")
@ -26,13 +26,13 @@ class ChessGame:
self._state = GameState.MAIN_MENU self._state = GameState.MAIN_MENU
self._menu_index = 0 self._menu_index = 0
def _init_new_game(self, fen = None): def _init_new_game(self, fen = None, player_color = None):
self._board = Board() if fen == None else Board(fen) self._board = Board() if fen == None else Board(fen)
self._last_move = "Begin!" self._move = "Begin!"
self._all_moves = dict() self._all_moves = dict()
self._src_idx = 0 self._src_idx = 0
self._dst_idx = 0 self._dst_idx = 0
self._player_color = self._board.turn self._player_color = player_color if player_color != None else self._board.turn
self._sf.set_fen_position(self._board.fen()) self._sf.set_fen_position(self._board.fen())
self._draw.draw_board(self._board, self._player_color) self._draw.draw_board(self._board, self._player_color)
@ -48,6 +48,12 @@ class ChessGame:
with open(self.SAVE_FILE, "w") as fen: with open(self.SAVE_FILE, "w") as fen:
fen.write(self._board.fen()) fen.write(self._board.fen())
def _make_move(self, move: str):
self._move = move
self._board.push(Move.from_uci(move))
self._sf.make_moves_from_current_position([move])
self._draw.draw_board(self._board, self._player_color)
def run(self): def run(self):
# either load the save game or start a new one # either load the save game or start a new one
self._load_saved_or_init() self._load_saved_or_init()
@ -67,11 +73,11 @@ class ChessGame:
# computer makes a move # computer makes a move
elif self._state == GameState.THINKING: elif self._state == GameState.THINKING:
self._draw.draw_thinking(self._last_move) self._draw.draw_thinking(self._move)
# TODO: check game over # TODO: check game over
self._move = self._sf.get_best_move() move = self._sf.get_best_move_time(self.STOCKFISH_MOVE_TIME * 1000)
if self._move != None: if move != None:
self._board.push(Move.from_uci(self._move)) self._make_move(move)
# reset user moves and move state to user's turn # reset user moves and move state to user's turn
self._all_moves = dict() self._all_moves = dict()
self._src_idx = 0 self._src_idx = 0
@ -79,16 +85,17 @@ class ChessGame:
self._state = GameState.CHOOSE_SRC self._state = GameState.CHOOSE_SRC
else: else:
self._state = GameState.GAME_OVER self._state = GameState.GAME_OVER
self._draw.draw_board(self._board, self._player_color)
# user picks source piece # user picks source piece
elif self._state == GameState.CHOOSE_SRC: elif self._state == GameState.CHOOSE_SRC:
if len(list(self._all_moves)) == 0: if len(list(self._all_moves)) == 0:
for src, dst in map(lambda m: [Move.uci(m)[0:2], Move.uci(m)[2:4]], self._board.legal_moves): moves = self._board.generate_legal_moves()
mvarray = map(lambda m: [Move.uci(m)[0:2], Move.uci(m)[2:4]], moves)
for src, dst in list(mvarray):
self._all_moves.setdefault(src, []).append(dst) self._all_moves.setdefault(src, []).append(dst)
if len(list(self._all_moves > 0)): if len(list(self._all_moves)) > 0:
src = list(self._all_moves)[self._src_idx] src = list(self._all_moves)[self._src_idx]
self._draw.draw_select(self._last_move, src) self._draw.draw_select(self._move, src)
key = self._cinput.get_one_shot() key = self._cinput.get_one_shot()
else: else:
self._state = GameState.GAME_OVER self._state = GameState.GAME_OVER
@ -97,7 +104,7 @@ class ChessGame:
elif self._state == GameState.CHOOSE_DST: elif self._state == GameState.CHOOSE_DST:
src = list(self._all_moves)[self._src_idx] src = list(self._all_moves)[self._src_idx]
dst = self._all_moves[src][self._dst_idx] dst = self._all_moves[src][self._dst_idx]
self._draw.draw_select(self._last_move, src, dst) self._draw.draw_select(self._move, src, dst)
key = self._cinput.get_one_shot() key = self._cinput.get_one_shot()
# game has ended # game has ended
@ -129,12 +136,11 @@ class ChessGame:
self._save_game() self._save_game()
return return
elif self._menu_index == 2 or self._menu_index == 3: # new game elif self._menu_index == 2 or self._menu_index == 3: # new game
self._init_new_game()
if self._menu_index == 2: if self._menu_index == 2:
self._player_color = WHITE self._init_new_game(player_color=WHITE)
self._state = GameState.CHOOSE_SRC self._state = GameState.CHOOSE_SRC
else: else:
self._player_color = BLACK self._init_new_game(player_color=BLACK)
self._state = GameState.THINKING self._state = GameState.THINKING
# handle user input when selecting source piece # handle user input when selecting source piece
@ -178,9 +184,7 @@ class ChessGame:
# make the move # make the move
elif key == Button.BTN_B: elif key == Button.BTN_B:
dst = self._all_moves[src][self._dst_idx] dst = self._all_moves[src][self._dst_idx]
self._move = src + dst self._make_move(src + dst)
self._board.append(Move.from_uci(self._move))
self._draw.draw_board(self._board, self._player_color)
# TODO: check game over # TODO: check game over
self._state = GameState.THINKING self._state = GameState.THINKING