|
|
|
from strutils import parseInt
|
|
|
|
import rdstdin
|
|
|
|
|
|
|
|
import ./chess
|
|
|
|
|
|
|
|
proc notation_to_move(notation: string, color: Color): Move =
|
|
|
|
## Convert simplified algebraic chess `notation` to a move object, color of player is `color`.
|
|
|
|
try:
|
|
|
|
var move: Move
|
|
|
|
var start = field_to_ind(notation[0..1])
|
|
|
|
var dest = field_to_ind(notation[2..3])
|
|
|
|
move = get_move(start, dest, color)
|
|
|
|
if (len(notation) > 4):
|
|
|
|
var prom_str = $notation[4]
|
|
|
|
var prom: int
|
|
|
|
case prom_str:
|
|
|
|
of "Q":
|
|
|
|
prom = QueenID * ord(color)
|
|
|
|
of "R":
|
|
|
|
prom = RookID * ord(color)
|
|
|
|
of "B":
|
|
|
|
prom = BishopID * ord(color)
|
|
|
|
of "N":
|
|
|
|
prom = KnightID * ord(color)
|
|
|
|
move = get_move(start, dest, prom, color)
|
|
|
|
return move
|
|
|
|
except IndexError:
|
|
|
|
var move: Move
|
|
|
|
return move
|
|
|
|
|
|
|
|
proc run_game(): void =
|
|
|
|
var game = init_game()
|
|
|
|
game.echo_board(game.to_move)
|
|
|
|
while not game.is_checkmate(game.to_move):
|
|
|
|
echo "Make a move"
|
|
|
|
echo game.to_move
|
|
|
|
var move = readLine(stdin)
|
|
|
|
while not game.checked_move(notation_to_move(move, game.to_move)):
|
|
|
|
move = readLine(stdin)
|
|
|
|
game.echo_board(game.to_move)
|
|
|
|
if game.is_checkmate(game.to_move):
|
|
|
|
echo $game.to_move & " was checkmated"
|
|
|
|
if game.is_stalemate(game.to_move):
|
|
|
|
echo "Stalemate"
|
|
|
|
|
|
|
|
run_game()
|