private GameReturn GameLoop(string gameName, bool displayBoard, NeuralNetwork a, NeuralNetwork b, Client cA, Client cB) { var checkCountA = 0; var moveCountA = 0; var totalTimeA = new Stopwatch(); var checkCountB = 0; var moveCountB = 0; var totalTimeB = new Stopwatch(); var gameEnded = false; var skipA = false; while (!gameEnded) { if (!skipA) { do { } while (!Board.PlayerOneTurn); totalTimeA.Start(); Console.Title = Board.FiftyMoveRule.ToString(); if (Board.FiftyMoveRule >= 50) { break; } var moveA = a.Output; var messageA = cA.SendMessage(Packet.Packets.Game, "MOVE", gameName, moveA.Item1.ToString(), moveA.Item2.ToString(), true.ToString()); if (messageA.Item1.Code == Packet.Packets.Error) { Console.WriteLine("[X:" + ((moveA.Item1 % 8) + 1) + " Y:" + (8 - (moveA.Item1 / 8)) + "](" + moveA.Item1 + ") -> " + "[X:" + ((moveA.Item2 % 8) + 1) + " Y:" + (8 - (moveA.Item2 / 8)) + "](" + moveA.Item2 + ") AI1"); gameEnded = !RefreshBoard(cA, gameName); if (displayBoard) { DrawBoard(); } continue; } _lastPlayerOneMove = moveA; totalTimeA.Stop(); //Thread.Sleep(1000); gameEnded = !RefreshBoard(cA, gameName); if (Board.CheckCheck(Board.WhiteColour)) { checkCountA++; } moveCountA++; if (displayBoard) { DrawBoard(); } } skipA = false; if (Board.CheckCheckMate(Board.WhiteColour) || Board.CheckCheckMate(Board.BlackColour)) { break; } if (gameEnded) { break; } do { } while (Board.PlayerOneTurn); totalTimeB.Start(); Console.Title = Board.FiftyMoveRule.ToString(); if (Board.FiftyMoveRule >= 50) { break; } var moveB = b.Output; var messageB = cB.SendMessage(Packet.Packets.Game, "MOVE", gameName, moveB.Item1.ToString(), moveB.Item2.ToString(), false.ToString()); if (messageB.Item1.Code == Packet.Packets.Error) { Console.WriteLine("[X:" + ((moveB.Item1 % 8) + 1) + " Y:" + (8 - (moveB.Item1 / 8)) + "](" + moveB.Item1 + ") -> " + "[X:" + ((moveB.Item2 % 8) + 1) + " Y:" + (8 - (moveB.Item2 / 8)) + "](" + moveB.Item2 + ") AI2"); gameEnded = !RefreshBoard(cA, gameName); skipA = true; if (displayBoard) { DrawBoard(); } continue; } _lastPlayerTwoMove = moveB; totalTimeB.Stop(); //Thread.Sleep(1000); gameEnded = !RefreshBoard(cB, gameName); if (Board.CheckCheck(Board.BlackColour)) { checkCountB++; } moveCountB++; if (displayBoard) { DrawBoard(); } } totalTimeA.Stop(); totalTimeB.Stop(); if (Board.PlayerOneTurn) { MovePiece(_lastPlayerOneMove.Item1, _lastPlayerOneMove.Item2); } else { MovePiece(_lastPlayerTwoMove.Item1, _lastPlayerTwoMove.Item2); } var returnInfo = new GameReturn { WhiteCheckMate = Board.CheckCheckMate(Board.BlackColour), BlackCheckMate = Board.CheckCheckMate(Board.WhiteColour), AmountCheckW = checkCountA, AmountCheckB = checkCountB, MoveCountW = moveCountA, MoveCountB = moveCountB, TotalTimeW = totalTimeA.ElapsedMilliseconds, TotalTimeB = totalTimeB.ElapsedMilliseconds, Draw = (Board.FiftyMoveRule >= 50) }; return(returnInfo); }