Skip to content

Commit

Permalink
basic implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
Chris Pilcher committed Jul 31, 2023
1 parent f19b15d commit ccdcad8
Show file tree
Hide file tree
Showing 5 changed files with 179 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -396,3 +396,5 @@ FodyWeavers.xsd

# JetBrains Rider
*.sln.iml
**/out/
**/.idea/
15 changes: 15 additions & 0 deletions Chess-Challenge.Uci/Chess-Challenge.Uci.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<RootNamespace>ChessChallenge.Bot</RootNamespace>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\Chess-Challenge\Chess-Challenge.csproj" />
</ItemGroup>

</Project>
11 changes: 11 additions & 0 deletions Chess-Challenge.Uci/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// See https://aka.ms/new-console-template for more information

using ChessChallenge.Bot;

var engine = new UciEngine();
var message = string.Empty;
while (message != "quit")
{
message = Console.ReadLine();
if (!string.IsNullOrEmpty(message)) engine.ReceiveCommand(message);
}
144 changes: 144 additions & 0 deletions Chess-Challenge.Uci/UciEngine.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
using ChessChallenge.API;
using ChessChallenge.Chess;
using Board = ChessChallenge.Chess.Board;
using Move = ChessChallenge.Chess.Move;
using Timer = ChessChallenge.API.Timer;

namespace ChessChallenge.Bot;

public class UciEngine
{
private const string UciInit = "uci";
private const string UciOkay = "uciok";
private const string IsReady = "isready";
private const string ReadyOk = "readyok";
private const string NewGame = "ucinewgame";
private const string Position = "position";
private const string BestMove = "bestmove";
private const string Go = "go";
private const string Stop = "stop";
private const string Quit = "quit";

private const string botMatchStartFens = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";


private MyBot _bot = new MyBot();
private Board _currentBoard;

private string _logFile = "./comm-log.txt";
private string _uciLog = "uci-log.txt";
private string _errorFile = "error.log";
private const string _dateFormat = "yyyyMMddTHHmmss";


private char GetPromotionCharacter(PieceType piece) =>
piece switch
{
PieceType.None => 'q',
PieceType.Pawn => 'q',
PieceType.Knight => 'n',
PieceType.Bishop => 'b',
PieceType.Rook => 'r',
PieceType.Queen => 'q',
PieceType.King => 'q',
_ => throw new ArgumentOutOfRangeException(nameof(piece), piece, null)
};

private void WriteLineToDisk(string line, string file)
{
using StreamWriter outputFile = new StreamWriter(file, true);

outputFile.WriteLine(line);

}
public void ReceiveCommand(string message)
{
var messageType = message.Split(' ')[0];
WriteLineToDisk($"{DateTimeOffset.Now.ToString(_dateFormat)} -- Received message {message}", _logFile);
WriteLineToDisk($"{DateTimeOffset.Now.ToString(_dateFormat)}{message}", _uciLog);
try
{
switch (messageType)
{
case UciInit:
Respond(UciOkay);
break;
case IsReady:
Respond(ReadyOk);
break;
case NewGame:
_uciLog = $"./{_uciLog}";
_currentBoard = new Board();
_currentBoard.LoadPosition(botMatchStartFens);
break;
case Position:
ProcessPositionCommand(message);
break;
case Go:
ProcessGoCommand(message);
break;
case Stop:
// message = Quit;
// ProcessStopCommand();
break;
case Quit:
break;
default:
message = Quit;
break;
}
}
catch (Exception ex)
{
if (ex.StackTrace != null)
{
var errorMessage = $"{DateTimeOffset.Now.ToString(_dateFormat)} -- {ex.Message}\n{ex.StackTrace}";
WriteLineToDisk(errorMessage, _errorFile);

}
}

}

private void ProcessStopCommand()
{
throw new NotImplementedException();
}

private void ProcessGoCommand(string message)
{
var split = message.Split(' ');
var millis = int.Parse(split[2]);
var newMove = new Move(_bot.Think(new(_currentBoard), new (millis)).RawValue);
var moveNameUci = MoveUtility.GetMoveNameUCI(newMove);
Respond($"{BestMove} {moveNameUci}");
}

private void ProcessPositionCommand(string message)
{
// if (message.Split(' ').Length < 3) return;
// var moveStrings = message.Split(' ').Skip(3).ToArray();
// var moves = new Move[moveStrings.Length];
// for (var i = 0; i < moveStrings.Length; i++)
// {
// var str = moveStrings[i];
// moves[i] = MoveUtility.GetMoveFromUCIName(str, _currentBoard);
// _currentBoard.MakeMove(moves[i], false);
// }
_currentBoard = new Board();
_currentBoard.LoadPosition(botMatchStartFens);
var moveStrings = message.Split(' ');
if (moveStrings[^1] == "startpos") return;
for (var i = 3; i < moveStrings.Length; i++)
{
var newMove = MoveUtility.GetMoveFromUCIName(moveStrings[i], _currentBoard);
_currentBoard.MakeMove(newMove, false);
}
}

private void Respond(string response)
{
WriteLineToDisk($"Responding: {response}", _logFile);
Console.WriteLine(response);
}
}
7 changes: 7 additions & 0 deletions Chess-Challenge.sln
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
.editorconfig = .editorconfig
EndProjectSection
EndProject
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chess-Challenge.Uci", "Chess-Challenge.Uci\Chess-Challenge.Uci.csproj", "{75253019-D4F1-4560-859C-F7C2AC61052A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -20,6 +23,10 @@ Global
{2803E64F-15AC-430B-A5A2-69C00EA7505F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2803E64F-15AC-430B-A5A2-69C00EA7505F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2803E64F-15AC-430B-A5A2-69C00EA7505F}.Release|Any CPU.Build.0 = Release|Any CPU
{75253019-D4F1-4560-859C-F7C2AC61052A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{75253019-D4F1-4560-859C-F7C2AC61052A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{75253019-D4F1-4560-859C-F7C2AC61052A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{75253019-D4F1-4560-859C-F7C2AC61052A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down

0 comments on commit ccdcad8

Please sign in to comment.