Gera.Chess
1.0.2
See the version list below for details.
dotnet add package Gera.Chess --version 1.0.2
NuGet\Install-Package Gera.Chess -Version 1.0.2
<PackageReference Include="Gera.Chess" Version="1.0.2" />
paket add Gera.Chess --version 1.0.2
#r "nuget: Gera.Chess, 1.0.2"
// Install Gera.Chess as a Cake Addin
#addin nuget:?package=Gera.Chess&version=1.0.2
// Install Gera.Chess as a Cake Tool
#tool nuget:?package=Gera.Chess&version=1.0.2
Gera Chess Library
Chess logic made with C# and ♥ by Geras1mleo
Chess lib includes:
- Chess board with 2-dimentional array of
Pieces
- Generation, Validation and Execution of
Moves
on Chess board - Logic to
Convert
:Move
intoSAN
and back into Move objectChess Board
intoFEN
and back into ChessBoard objectChess Game
intoPGN
and back into ChessBoard object
- Event Handlers:
OnInvalidMoveKingChecked
- Raises when trying to execute move that places own king in checkOnWhiteKingCheckedChanged
/OnBlackKingCheckedChanged
with state (checked or not) and its positionOnPromotePawn
with PromotionEventArgs.PromotionResult (default: PromotionToQueen)OnEndGame
with according end game info (Win
/Loss
/Draw
)OnCaptured
with captured piece and all recently captured pieces (White/Black)
End Game
Declaration:Draw
orResign
of one of sidesNavigation
between executed moves:First
/Last
Next
/Previous
- Also:
board.MoveIndex
property to navigate direct to specific move
Cancelation
of last executed move
Usage!
Example simple console chess game:
using Chess;
var board = new ChessBoard();
while (!board.IsEndGame)
{
Console.WriteLine(board.ToAscii());
board.Move(Console.ReadLine());
}
Console.WriteLine(board.ToAscii());
Console.WriteLine(board.ToPgn());
// Outcome after last move:
// Qh5
// ┌────────────────────────┐
// 8 │ r n b q k b n r │
// 7 │ p p p p p . . p │
// 6 │ . . . . . . . . │
// 5 │ . . . . . p p Q │
// 4 │ . . . . P P . . │
// 3 │ . . . . . . . . │
// 2 │ P P P P . . P P │
// 1 │ R N B . K B N R │
// └────────────────────────┘
// a b c d e f g h
//
// 1. e4 f5 2. f4 g5 3. Qh5# 1-0
Example random chess game:
while (!board.IsEndGame)
{
var moves = board.Moves();
board.Move(moves[Random.Shared.Next(moves.Length)]);
}
Console.WriteLine(board.ToAscii());
Console.WriteLine(board.ToPgn());
// Todo: End game Insufficient Material
Track Pieces
Track pieces on position using indexers:
board["c2"]... // => White Pawn
board['g', 8]... // => Black Bishop
// Counting from 0
board[0, 0]... // => White Rook
board[new Position(4, 7)]... // => Black King
Track captured pieces:
board.CapturedWhite... // => White pieces that has been captured by black player
board.CapturedBlack... // => Black pieces that has been captured by white player
// Properties above work just fine when board has been loaded from FEN
Track kings and their state (Checked/Unchecked):
board.WhiteKing... // => White king position on chess board (Calculated property)
board.BlackKing... // => Black king position on chess board (Calculated property)
board.WhiteKingChecked... // => State of White king (Referred property)
board.BlackKingChecked... // => State of Black king (Referred property)
Move Pieces
Move pieces using SAN/LAN:
board.Move("e4"); // => Good
board.Move("N-f6"); // => Good
board.Move("NXf6"); // => Good
board.Move("dxc3 e.p.");// => Good
board.Move("Pe4"); // => Good
board.Move("Pe5xd6"); // => Good
board.Move("O-O-O+"); // => Good
board.Move("ne5"); // => Bad
board.Move("e8=K"); // => Bad
board.Move("0-0"); // => Bad
Move pieces using Move object and corresponding positions:
board.Move(new Move("b1", "c3"));
Ambiguity:
board.LoadPgn("1. e4 e5 2. Ne2 f6");
board.ToAscii();
// ┌────────────────────────┐
// 8 │ r n b q k b n r │
// 7 │ p p p p . . p p │
// 6 │ . . . . . p . . │
// 5 │ . . . . p . . . │
// 4 │ . . . . P . . . │
// 3 │ . . . . . . . . │
// 2 │ P P P P N P P P │
// 1 │ R N B Q K B . R │
// └────────────────────────┘
// a b c d e f g h
board.Move("Nc3"); // => Throws exception: ChessSanTooAmbiguousException. Both knights can move to c3
board.Move("Nc4"); // => Throws exception: ChessSanNotFoundException. None of knights can move to c3
Load Chess game/board
Load chess board Variant: From Position (FEN):
board.LoadFen("1nbqkb1r/pppp1ppp/2N5/4p3/3P4/8/PPP1PPPP/RN2KB1R w KQk - 0 1");
board.ToAscii();
// ┌────────────────────────┐
// 8 │ . n b q k b . r │
// 7 │ p p p p . p p p │
// 6 │ . . N . . . . . │
// 5 │ . . . . p . . . │
// 4 │ . . . P . . . . │
// 3 │ . . . . . . . . │
// 2 │ P P P . P P P P │
// 1 │ R N . . K B . R │
// └────────────────────────┘
// a b c d e f g h
board.CapturedWhite... // => { White Bishop, White Queen }
board.CapturedBlack... // => { Black Rook, Black Knight }
// Stalemate
board.LoadFen("rnb1kbnr/pppppppp/8/8/8/8/5q2/7K w kq - 0 1");
board.EndGame... // => { EndgameType = Stalemate, WonSide = null }
Load full chess game from PGN:
board.LoadPgn(
@"[Variant ""From Position""]
[FEN ""rnbqkbnr/ppp1pppp/8/3p4/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 1""]
1.exd5 e6 2.dxe6 fxe6 3.d4(3.f4 g5 4.fxg5) 3... c5 4.b4");
board.ToAscii();
// ┌────────────────────────┐
// 8 │ r n b q k b n r │
// 7 │ p p . . . . p p │
// 6 │ . . . . p . . . │
// 5 │ . . p . . . . . │
// 4 │ . P . P . . . . │
// 3 │ . . . . . . . . │
// 2 │ P . P . . P P P │
// 1 │ R N B Q K B N R │
// └────────────────────────┘
// a b c d e f g h
Alternative moves and comments are getting (temporary) skipped In further versions: Navigate between alternative branches Saving and adding of comments to each move
End Game
Declare Draw/Resign:
board.Draw();
board.EndGame... // => { EndgameType = DrawDeclared, WonSide = null }
board.Clear();
board.Resign(PieceColor.Black);
board.EndGame... // => { EndgameType = Resigned, WonSide = White }
Found a bug?
Drop to Issues Or to: sviatoslav.harasymchuk@gmail.com Thanks in advance!
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- Ardalis.SmartEnum (>= 2.0.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Moves generation improved. TryLoad Fen/Pgn and TryParseSan added