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);
        }