mirror of
https://github.com/tiyn/yeschess.git
synced 2026-02-22 02:34:46 +01:00
Compare commits
3 Commits
8e918aebb7
...
75e804ef6f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
75e804ef6f | ||
|
|
9ed8b886db | ||
|
|
7caa4db120 |
@@ -5,12 +5,6 @@
|
|||||||
ychess is a chess implementation written in nim.
|
ychess is a chess implementation written in nim.
|
||||||
A chess engine is planned.
|
A chess engine is planned.
|
||||||
|
|
||||||
## Todo
|
|
||||||
|
|
||||||
- draw by
|
|
||||||
- 3-fold repitition
|
|
||||||
- 50-move rule
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Simply download the code and run `nim c -r game.nim`.
|
Simply download the code and run `nim c -r game.nim`.
|
||||||
|
|||||||
73
chess.nim
73
chess.nim
@@ -1,5 +1,6 @@
|
|||||||
import tables
|
import tables
|
||||||
from strutils import parseInt
|
from strutils import parseInt
|
||||||
|
import algorithm
|
||||||
|
|
||||||
type
|
type
|
||||||
Color* = enum
|
Color* = enum
|
||||||
@@ -8,18 +9,27 @@ type
|
|||||||
Board* = array[0..119, int]
|
Board* = array[0..119, int]
|
||||||
## Board that checks if pieces moved
|
## Board that checks if pieces moved
|
||||||
Moved* = array[0..119, bool]
|
Moved* = array[0..119, bool]
|
||||||
|
## Castle rights for each player
|
||||||
|
CastleRights = tuple
|
||||||
|
wk: bool
|
||||||
|
wq: bool
|
||||||
|
bk: bool
|
||||||
|
bq: bool
|
||||||
## Game as object of different values
|
## Game as object of different values
|
||||||
Game* = object
|
Game* = object
|
||||||
board*: Board
|
board*: Board
|
||||||
moved: Moved
|
moved: Moved
|
||||||
toMove*: Color
|
toMove*: Color
|
||||||
|
previousBoard*: seq[Board]
|
||||||
|
previousCastleRights*: seq[CastleRights]
|
||||||
|
fiftyMoveCounter: int
|
||||||
## Move as object
|
## Move as object
|
||||||
Move* = object
|
Move* = object
|
||||||
start: int
|
start: int
|
||||||
dest: int
|
dest: int
|
||||||
color: Color
|
color: Color
|
||||||
prom: int
|
prom: int
|
||||||
## Amount of pieces
|
## Amount of pieces of a player
|
||||||
Pieces = tuple
|
Pieces = tuple
|
||||||
p: int
|
p: int
|
||||||
k: int
|
k: int
|
||||||
@@ -222,7 +232,7 @@ proc initMoved(): Moved =
|
|||||||
proc initGame*(): Game =
|
proc initGame*(): Game =
|
||||||
## Create and return a Game object.
|
## Create and return a Game object.
|
||||||
let game = Game(board: initBoard(), moved: initMoved(),
|
let game = Game(board: initBoard(), moved: initMoved(),
|
||||||
to_move: Color.White)
|
to_move: Color.White, previousBoard: @[], previousCastleRights: @[], fiftyMoveCounter: 0)
|
||||||
return game
|
return game
|
||||||
|
|
||||||
proc initGame*(board: array[0..63, int], color: Color): Game =
|
proc initGame*(board: array[0..63, int], color: Color): Game =
|
||||||
@@ -235,7 +245,7 @@ proc initGame*(board: array[0..63, int], color: Color): Game =
|
|||||||
same_piece = (board[ind] != compare[ind])
|
same_piece = (board[ind] != compare[ind])
|
||||||
moved.setField(ind, same_piece)
|
moved.setField(ind, same_piece)
|
||||||
let game = Game(board: board, moved: moved,
|
let game = Game(board: board, moved: moved,
|
||||||
to_move: color)
|
to_move: color, previousBoard: @[], previousCastleRights: @[], fiftyMoveCounter: 0)
|
||||||
return game
|
return game
|
||||||
|
|
||||||
proc getMove*(start: int, dest: int, prom: int, color: Color): Move =
|
proc getMove*(start: int, dest: int, prom: int, color: Color): Move =
|
||||||
@@ -294,6 +304,18 @@ proc indToField*(ind: int): string =
|
|||||||
if FileChar[file] == file_ind:
|
if FileChar[file] == file_ind:
|
||||||
return $file & $line
|
return $file & $line
|
||||||
|
|
||||||
|
proc genCastleRights(moved: Moved): CastleRights =
|
||||||
|
## Generate rights to castle from given `moved`
|
||||||
|
let wk = not moved.getField(fieldToInd("e1")) and not moved.getField(
|
||||||
|
fieldToInd("h1"))
|
||||||
|
let wq = not moved.getField(fieldToInd("e1")) and not moved.getField(
|
||||||
|
fieldToInd("a1"))
|
||||||
|
let bk = not moved.getField(fieldToInd("e8")) and not moved.getField(
|
||||||
|
fieldToInd("h8"))
|
||||||
|
let bq = not moved.getField(fieldToInd("e8")) and not moved.getField(
|
||||||
|
fieldToInd("a8"))
|
||||||
|
return (wk, wq, bk, bq)
|
||||||
|
|
||||||
proc notationToMove*(notation: string, color: Color): Move =
|
proc notationToMove*(notation: string, color: Color): Move =
|
||||||
## Convert simplified algebraic chess `notation` to a move object, color of player is `color`.
|
## Convert simplified algebraic chess `notation` to a move object, color of player is `color`.
|
||||||
try:
|
try:
|
||||||
@@ -709,6 +731,9 @@ proc castling(game: var Game, kstart: int, dest_kingside: bool,
|
|||||||
except IndexDefect, ValueError:
|
except IndexDefect, ValueError:
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
proc getPrevBoard*(game: Game): seq[Board] =
|
||||||
|
return game.previousBoard
|
||||||
|
|
||||||
proc checkedMove*(game: var Game, move: Move): bool {.discardable.} =
|
proc checkedMove*(game: var Game, move: Move): bool {.discardable.} =
|
||||||
## Tries to make a move in a given `game` with the piece of a given `color` from `start` to `dest`.
|
## Tries to make a move in a given `game` with the piece of a given `color` from `start` to `dest`.
|
||||||
## This process checks for the legality of the move and performs the switch of `game.to_move`
|
## This process checks for the legality of the move and performs the switch of `game.to_move`
|
||||||
@@ -721,13 +746,17 @@ proc checkedMove*(game: var Game, move: Move): bool {.discardable.} =
|
|||||||
return false
|
return false
|
||||||
var sequence = newSeq[Move]()
|
var sequence = newSeq[Move]()
|
||||||
let piece = game.board.getField(start)
|
let piece = game.board.getField(start)
|
||||||
var create_en_passant = false
|
var createEnPassant = false
|
||||||
var captured_en_passant = false
|
var capturedEnPassant = false
|
||||||
|
var fiftyMoveRuleReset = false
|
||||||
var move: Move
|
var move: Move
|
||||||
move = getMove(start, dest, color)
|
move = getMove(start, dest, color)
|
||||||
if (piece == PawnID * ord(color)):
|
if (piece == PawnID * ord(color)):
|
||||||
create_en_passant = dest in game.genPawnDoubleDests(start, color)
|
createEnPassant = dest in game.genPawnDoubleDests(start, color)
|
||||||
captured_en_passant = (game.board.getField(dest) == -1 * ord(color) * EnPassantID)
|
capturedEnPassant = (game.board.getField(dest) == -1 * ord(color) * EnPassantID)
|
||||||
|
fiftyMoveRuleReset = true
|
||||||
|
if (game.board.getField(move.dest) != 0):
|
||||||
|
fiftyMoveRuleReset = true
|
||||||
sequence.add(game.genLegalMoves(start, color))
|
sequence.add(game.genLegalMoves(start, color))
|
||||||
if (move in sequence):
|
if (move in sequence):
|
||||||
game.board.removeEnPassant(color)
|
game.board.removeEnPassant(color)
|
||||||
@@ -738,13 +767,20 @@ proc checkedMove*(game: var Game, move: Move): bool {.discardable.} =
|
|||||||
else:
|
else:
|
||||||
game.uncheckedMove(start, dest)
|
game.uncheckedMove(start, dest)
|
||||||
game.toMove = Color(ord(game.toMove)*(-1))
|
game.toMove = Color(ord(game.toMove)*(-1))
|
||||||
if create_en_passant:
|
if createEnPassant:
|
||||||
game.board.setField(dest-(N*ord(color)), EnPassantID * ord(color))
|
game.board.setField(dest-(N*ord(color)), EnPassantID * ord(color))
|
||||||
if captured_en_passant:
|
if capturedEnPassant:
|
||||||
game.board.setField(dest-(N*ord(color)), 0)
|
game.board.setField(dest-(N*ord(color)), 0)
|
||||||
if ((90 < dest and dest < 99) or (20 < dest and dest < 29)) and
|
if ((90 < dest and dest < 99) or (20 < dest and dest < 29)) and
|
||||||
game.board.getField(dest) == PawnID * ord(color):
|
game.board.getField(dest) == PawnID * ord(color):
|
||||||
game.board.setField(dest, prom)
|
game.board.setField(dest, prom)
|
||||||
|
var prevBoard = game.previousBoard
|
||||||
|
var prevCastle = game.previousCastleRights
|
||||||
|
game.previousBoard.add(game.board)
|
||||||
|
game.previousCastleRights.add(game.moved.genCastleRights())
|
||||||
|
game.fiftyMoveCounter = game.fiftyMoveCounter + 1
|
||||||
|
if fiftyMoveRuleReset:
|
||||||
|
game.fiftyMoveCounter = 0
|
||||||
return true
|
return true
|
||||||
except IndexDefect, ValueError:
|
except IndexDefect, ValueError:
|
||||||
return false
|
return false
|
||||||
@@ -757,6 +793,25 @@ proc isCheckmate*(game: Game, color: Color): bool =
|
|||||||
## Checks if a player of a given `color` in a `game` is checkmate.
|
## Checks if a player of a given `color` in a `game` is checkmate.
|
||||||
return game.hasNoMoves(color) and game.isInCheck(color)
|
return game.hasNoMoves(color) and game.isInCheck(color)
|
||||||
|
|
||||||
|
proc threeMoveRep(game: Game): bool =
|
||||||
|
## Checks if a `rep`-times repitition happened on the last move of the `game`.
|
||||||
|
var lastState = game.previousBoard[game.previousBoard.high]
|
||||||
|
var lastCastleRights = game.previousCastleRights[game.previousBoard.high]
|
||||||
|
var reps = 0
|
||||||
|
for stateInd in (game.previousBoard.low)..(game.previousBoard.high):
|
||||||
|
if (game.previousBoard[stateInd] == lastState and game.previousCastleRights[
|
||||||
|
stateInd] == lastCastleRights):
|
||||||
|
reps = reps + 1
|
||||||
|
return reps >= 3
|
||||||
|
|
||||||
|
proc fiftyMoveRule(game: Game): bool =
|
||||||
|
## Checks if a draw with the fifty move rule is available in a `game`.
|
||||||
|
return game.fiftyMoveCounter >= 100
|
||||||
|
|
||||||
|
proc isDrawClaimable*(game: Game): bool =
|
||||||
|
## Checks if a draw is claimable by either player.
|
||||||
|
return game.threeMoveRep() or game.fiftyMoveRule()
|
||||||
|
|
||||||
proc isStalemate*(game: Game, color: Color): bool =
|
proc isStalemate*(game: Game, color: Color): bool =
|
||||||
## Checks if a player of a given `color` in a `game` is stalemate.
|
## Checks if a player of a given `color` in a `game` is stalemate.
|
||||||
return (game.hasNoMoves(color) and not game.isInCheck(color)) or
|
return (game.hasNoMoves(color) and not game.isInCheck(color)) or
|
||||||
|
|||||||
9
game.nim
9
game.nim
@@ -5,14 +5,21 @@ import ./chess
|
|||||||
|
|
||||||
proc runGame(): void =
|
proc runGame(): void =
|
||||||
var game = initGame()
|
var game = initGame()
|
||||||
|
var draw: string
|
||||||
game.echoBoard(game.toMove)
|
game.echoBoard(game.toMove)
|
||||||
while not game.isCheckmate(game.toMove):
|
while not game.isCheckmate(game.toMove) and not game.isStalemate(game.toMove):
|
||||||
echo "Make a move"
|
echo "Make a move"
|
||||||
echo game.toMove
|
echo game.toMove
|
||||||
var move = readLine(stdin)
|
var move = readLine(stdin)
|
||||||
while not game.checkedMove(notationToMove(move, game.toMove)):
|
while not game.checkedMove(notationToMove(move, game.toMove)):
|
||||||
move = readLine(stdin)
|
move = readLine(stdin)
|
||||||
game.echoBoard(game.toMove)
|
game.echoBoard(game.toMove)
|
||||||
|
if (game.isDrawClaimable):
|
||||||
|
echo "Do you want to claim a draw? (y/N)"
|
||||||
|
draw = readLine(stdin)
|
||||||
|
if (draw == "y"):
|
||||||
|
echo "Draw claimed"
|
||||||
|
break
|
||||||
if game.isCheckmate(game.toMove):
|
if game.isCheckmate(game.toMove):
|
||||||
echo $game.toMove & " was checkmated"
|
echo $game.toMove & " was checkmated"
|
||||||
if game.isStalemate(game.toMove):
|
if game.isStalemate(game.toMove):
|
||||||
|
|||||||
365
test.nim
365
test.nim
@@ -268,6 +268,371 @@ testSuite GameTest of TestSuite:
|
|||||||
self.check(not self.game.isStalemate(Color.Black))
|
self.check(not self.game.isStalemate(Color.Black))
|
||||||
self.check(not self.game.isStalemate(Color.White))
|
self.check(not self.game.isStalemate(Color.White))
|
||||||
|
|
||||||
|
## Check isDrawClaimable
|
||||||
|
method testIsDrawClaimableThreeFoldRepTrue() =
|
||||||
|
self.setup()
|
||||||
|
self.game.checkedMove(notationToMove("g1f3", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g8f6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f3g1", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("f6g8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("g1f3", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g8f6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f3g1", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("f6g8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("g1f3", Color.White))
|
||||||
|
self.check(self.game.isDrawClaimable())
|
||||||
|
|
||||||
|
method testIsDrawClaimableThreeFoldRepFalse() =
|
||||||
|
self.setup()
|
||||||
|
self.game.checkedMove(notationToMove("g1f3", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g8f6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f3g1", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("f6g8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("g1f3", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g8f6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f3g1", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("f6g8", Color.Black))
|
||||||
|
self.check(not self.game.isDrawClaimable())
|
||||||
|
|
||||||
|
method testIsDrawClaimableFiftyMoveRuleTrue() =
|
||||||
|
self.game = initGame([
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, BRook,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
WBishop, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, WKing, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, WRook, 0,
|
||||||
|
0, 0, 0, BKing, 0, 0, 0, 0
|
||||||
|
], Color.Black)
|
||||||
|
self.game.checkedMove(notationToMove("a2a5", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f5g6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a5e5", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("h4f6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e5e2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b7a7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e2e1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("g6f5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e1b1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f6d4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e8d8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f5e6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d8c8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d4e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("b1c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("a7f7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e6d5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1a1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f7h7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a1a2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6f4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a2a6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f4e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a6b6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("h7c7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c8d8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c7a7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d8c8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("a7c7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c8d8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("b6b1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c7a7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("b1e1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e1d1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d5e6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d1c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("a7b7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b7b3", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2c6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c6c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b3h3", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d8c8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("h3h8", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c8b7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("h8b8", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("b7a7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b8b4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1d1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e6d7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d1c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6c7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1h1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c7f4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("h1h3", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f4e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("h3h1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("h1c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6f4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f4c7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b4b5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b5b6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2g2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b6b3", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g2c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b3b1", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2c3", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c7e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c3c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d7d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2d2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6c6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d2c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c6d5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2g2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g2g5", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d5c6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a7a6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b1b8", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g5g7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b8b6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a6a7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b6b1", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a7a8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b1e1", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g7b7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e1e8", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a8a7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6c5", Color.White))
|
||||||
|
self.check(self.game.isDrawClaimable())
|
||||||
|
|
||||||
|
method testIsDrawClaimableFiftyMoveRuleFalseNinetyFour() =
|
||||||
|
self.game = initGame([
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, BRook,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
WBishop, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, WKing, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, WRook, 0,
|
||||||
|
0, 0, 0, BKing, 0, 0, 0, 0
|
||||||
|
], Color.Black)
|
||||||
|
self.game.checkedMove(notationToMove("a2a5", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f5g6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a5e5", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("h4f6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e5e2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b7a7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e2e1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("g6f5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e1b1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f6d4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e8d8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f5e6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d8c8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d4e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("b1c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("a7f7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e6d5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1a1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f7h7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a1a2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6f4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a2a6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f4e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a6b6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("h7c7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c8d8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c7a7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d8c8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("a7c7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c8d8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("b6b1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c7a7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("b1e1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e1d1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d5e6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d1c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("a7b7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b7b3", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2c6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c6c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b3h3", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d8c8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("h3h8", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c8b7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("h8b8", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("b7a7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b8b4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1d1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e6d7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d1c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6c7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1h1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c7f4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("h1h3", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f4e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("h3h1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("h1c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6f4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f4c7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b4b5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b5b6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2g2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b6b3", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g2c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b3b1", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2c3", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c7e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c3c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d7d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2d2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6c6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d2c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c6d5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2g2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g2g5", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d5c6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a7a6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b1b8", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g5g7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b8b6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a6a7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b6b1", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a7a8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b1e1", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g7b7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e1e8", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a8a7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6c5", Color.White))
|
||||||
|
self.check(self.game.isDrawClaimable())
|
||||||
|
|
||||||
|
method testIsDrawClaimableFiftyMoveRuleFalseCapture() =
|
||||||
|
self.game = initGame([
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, BRook,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
WBishop, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, WKing, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, BPawn, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, WRook, 0,
|
||||||
|
0, 0, 0, BKing, 0, 0, 0, 0
|
||||||
|
], Color.Black)
|
||||||
|
self.game.checkedMove(notationToMove("a2a5", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f5g6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a5e5", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("h4f6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e5e2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b7a7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e2e1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("g6f5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e1b1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f6d4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e8d8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f5e6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d8c8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d4e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("b1c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("a7f7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e6d5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1a1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f7h7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a1a2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6f4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a2a6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f4e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a6b6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("h7c7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c8d8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c7a7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d8c8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("a7c7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c8d8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("b6b1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c7a7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("b1e1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("e1d1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d5e6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d1c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("a7b7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b7b3", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2c6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c6c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b3h3", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d8c8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("h3h8", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c8b7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("h8b8", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("b7a7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b8b4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1d1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e6d7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d1c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6c7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1h1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c7f4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("h1h3", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f4e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("h3h1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("h1c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6f4", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("f4c7", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2c1", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b4b5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c1c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b5b6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2g2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b6b3", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g2c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b3b1", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2c3", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c7e5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c3c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d7d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2d2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6c6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("d2c2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("c6d5", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("c2g2", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e5d6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g2g5", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d5c6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a7a6", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b1b8", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g5g7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b8b6", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a6a7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b6b1", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a7a8", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("b1e1", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("g7b7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("e1e8", Color.White))
|
||||||
|
self.game.checkedMove(notationToMove("a8a7", Color.Black))
|
||||||
|
self.game.checkedMove(notationToMove("d6c5", Color.White))
|
||||||
|
self.check(not self.game.isDrawClaimable())
|
||||||
|
|
||||||
## Tests for Pawn moves
|
## Tests for Pawn moves
|
||||||
method testCheckedMovePawnSingleTrue() =
|
method testCheckedMovePawnSingleTrue() =
|
||||||
self.setup()
|
self.setup()
|
||||||
|
|||||||
Reference in New Issue
Block a user