Пример #1
0
 public static void PrintMoves(List <TblMove> moves)
 {
     for (int r = 0; r < 3; r++)
     {
         for (int c = 0; c < 3; c++)
         {
             TblMove move = moves.FirstOrDefault(m => m.Row == r && m.Col == c);
             Console.Write(move?.PlayerNumber.ToString() ?? "X");
         }
         Console.WriteLine("");
     }
 }
Пример #2
0
        public TblMove Move(List <TblMove> previousMoves, int moveNumber)
        {
            if (moveNumber == 0)
            {
                _started = true;
            }

            List <TblGame> oldGameMoves = Providers.ServiceProvider.GetService <GameService>().GetAll();

            List <TblMove> winningMatchedMoves = oldGameMoves.Where(m => m.IsWinner(_started) && m.TblMove.Take(previousMoves.Count).SequenceEqual(previousMoves)).SelectMany(m => m.TblMove).Where(m => m.MoveNumber == moveNumber).ToList();
            List <TblMove> loosingMatchedMoves = oldGameMoves.Where(m => m.IsWinner(_started) && m.TblMove.Take(previousMoves.Count).SequenceEqual(previousMoves)).SelectMany(m => m.TblMove).Where(m => m.MoveNumber == moveNumber).ToList();

            TblMove move = null;

            if (winningMatchedMoves.Any())
            {
                // Console.WriteLine("Success!!");
                List <TblMove> availableMoves = winningMatchedMoves.Where(m => m.MoveNumber == moveNumber).ToList();

                move = availableMoves.GroupBy(m => m).OrderByDescending(g => g.Count()).Select(x => x.Key).First();
            }
            else
            {
                // Console.WriteLine("Fail!!");

                List <TblMove> unionMoves = loosingMatchedMoves.Union(previousMoves).ToList();

                List <IGrouping <int, TblMove> > gRMoves = unionMoves.GroupBy(m => m.Row).ToList();
                List <IGrouping <int, TblMove> > gCMoves = unionMoves.GroupBy(m => m.Col).ToList();

                //Clear list if there are no way to win
                if (loosingMatchedMoves.Any() && gRMoves.Count == 3 && gRMoves.All(g => g.Count() == 3) && gCMoves.Count == 3 && gCMoves.All(g => g.Count() == 3))
                {
                    move = loosingMatchedMoves.GroupBy(m => m).OrderBy(g => g.Count()).Select(g => g.Key).First();
                }
                else
                {
                    move = GetNewRandomMove(moveNumber, previousMoves, loosingMatchedMoves);
                }
            }

            return(new TblMove()
            {
                Row = move.Row,
                Col = move.Col,
                PlayerNumber = PlayerNumber,
                MoveNumber = moveNumber
            });
        }
Пример #3
0
        public void Move()
        {
            var     currentPlayer = GetCurrentPlayer();
            TblMove move          = currentPlayer.Move(Moves, _moveId);

            Moves.Add(move);

            bool won = HasWon(currentPlayer);

            _isGameOver = won || _moveId == MAX_MOVE_ID;

            if (won)
            {
                Winner = currentPlayer;
            }

            _moveId++;
        }