Exemplo n.º 1
0
        private async Task GameLoop()
        {
            do
            {
                var validMoves = _rulesProvider.GetMoves(Board, SideUtil.Convert(CurrentPlayer.Side));
                var gameMoves  = new List <IGameMove>(validMoves.Values.Count);
                if (validMoves.Count > 0)
                {
                    gameMoves.AddRange(validMoves.Flatten((f, m) => new WalkGameMove(this, f, m)));
                }
                if (_currentHistoryItem.Previous != null && _currentHistoryItem.Previous.Previous != null)
                {
                    gameMoves.Add(UndoMove);
                }
                if (_currentHistoryItem.Next != null && _currentHistoryItem.Next.Next != null)
                {
                    gameMoves.Add(RedoMove);
                }

                try
                {
                    var move = await TryChooseMove(gameMoves);

                    if (move == null)
                    {
                        return;               //gameLoop was interrupted
                    }
                    move.Execute();
                    _gameStatistics.Append(move, this);
                }
                catch (Exception ex)
                {
                    Error      = ex?.InnerException ?? ex;
                    Status     = GameStatus.Error;
                    _isRunning = false;
                    break;
                }

                foreach (var player in _players)
                {
                    player.GameUpdated(this);
                }
            } while (_isRunning);
        }