private static Move ValidateMove(IIOManager myIO, Board board, Player player, string inputCoordinates) { // rimuovo eventuali spazi, e controllo che la stringa passata contenga esattamente due caratteri inputCoordinates = inputCoordinates.Trim(' '); if (inputCoordinates.Length != 2) { myIO.Notify("Input non valido, inserisci le cordinate in formato {char}{int}."); return(null); } // l'indice di riga deve essere un indicatore di riga valido (a, b o c) char myRow = inputCoordinates.ElementAt(0); if (myRow < board.InitialRow || myRow > board.LastRow) { myIO.Notify($"Input non valido, la prima coordinata (indicatore di riga) deve essere compresa tra '{(char)board.InitialRow}' e '{(char)board.LastRow}'."); return(null); } int rowValue = myRow; // l'indice di colonna deve essere un indicatore di colonna valido (1, 2 o 3) char myCol = inputCoordinates.ElementAt(1); if (!int.TryParse(myCol.ToString(), out int colValue)) { myIO.Notify("Input non valido, la seconda coordinata (indicatore di colonna) deve essere numerica."); return(null); } if (colValue < board.InitialCol || colValue > board.LastCol) { myIO.Notify($"Input non valido, la seconda coordinata (indicatore di colonna) deve essere compresa tra {board.InitialCol} e {board.LastCol}."); return(null); } // tolgo il valore iniziale dagli indicatori, per ottenere l'indice di matrice rowValue -= board.InitialRow; colValue -= board.InitialCol; // la cella deve essere libera if (board.Grid[rowValue, colValue] != (char)0) { myIO.Notify($"Input non valido, la cella {inputCoordinates} è già occupata."); return(null); } // se arrivo qui ho superato tutte le validazioni var move = new Move(board, player, rowValue, colValue); move.Evaluate(); return(move); }
public static Player SetNewPlayer(char sign, IIOManager myIO) { myIO.Notify($"Impostazioni per il giocatore {sign}"); myIO.LittleBreak(); var ia = myIO.AcceptBool("Il giocatore è controllato dal computer (s/n): ", false); var name = myIO.AcceptString("Nome del giocatore: ", $"Player {sign}"); myIO.LittleBreak(); var player = new Player(name, sign, ia); myIO.Notify($"Ok, generato giocatore {player}"); return(player); }
public static Move CalculateMove(IIOManager myIO, Board board, Player player) { var possibleMoves = PossibleMoves(board, player); // passo anche il giocatore perché calcolo il rating per ogni mossa relativamente a quel giocatore var maxRating = possibleMoves.Max(x => x.Rating); var bestMoves = possibleMoves.FindAll(x => x.Rating == maxRating); var chioicedMove = bestMoves.ElementAt(randomizer.Next(bestMoves.Count())); myIO.Notify($"{player} muove in {chioicedMove}."); myIO.LittleBreak(); myIO.Wait(); return(chioicedMove); }