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(""); } }
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 }); }
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++; }