internal static void GameStart(int STARTING_FLAGS, int WINNING_CONDITION, int[] arrayFlagsToRemoved, bool isHumanStartFirst) { string input; List <int> FlagsToRemove = arrayFlagsToRemoved.OfType <int>().ToList(); FlagRemovalBrain brain = new FlagRemovalBrain(WINNING_CONDITION, STARTING_FLAGS, FlagsToRemove); int remainingFlags = STARTING_FLAGS; int turn = 0; bool humanWon = false; bool draw = false; List <ResultTable> ListOfResultTable = new List <ResultTable>();//keep track the result of each turn do { int pulledFlag = 0; if (isHumanStartFirst) { Console.WriteLine("Flag(s) remaining: {0}, winning condition: {1} flag(s) remain ", remainingFlags, WINNING_CONDITION); WriteLine("Your turn , enter the number of flag(s) that you willing to pull ({0} only).", string.Join(" or ", FlagsToRemove.Select(i => i)), remainingFlags); input = ReadLine(); if (!int.TryParse(input, out pulledFlag) || !FlagsToRemove.Contains(pulledFlag) || pulledFlag > remainingFlags) { WriteLine("Please enter number {0 } only", string.Join(" or ", FlagsToRemove.Select(i => i))); continue; } /**Human's turn */ (remainingFlags, turn) = ProcessDecision(remainingFlags, turn, pulledFlag, brain, ListOfResultTable, true); if (remainingFlags == WINNING_CONDITION) { humanWon = true; break; } isHumanStartFirst = false; } brain.FlagsThatCanBeRemove.RemoveAll(t => remainingFlags - t < WINNING_CONDITION); //remove availabe flags if (brain.FlagsThatCanBeRemove.Count == 0) //draw { draw = true; break; } /**Computer's turn */ (remainingFlags, turn) = ProcessDecision(remainingFlags, turn, pulledFlag, brain, ListOfResultTable, false); if (remainingFlags == WINNING_CONDITION) { break; } FlagsToRemove.RemoveAll(t => remainingFlags - t < WINNING_CONDITION); //remove availabe flags if (FlagsToRemove.Count == 0) //draw { draw = true; break; } isHumanStartFirst = true; } while (remainingFlags > WINNING_CONDITION); if (draw) { WriteLine("There is no way to reach the winning condition, game ended. Draw. \n\n\n"); } else if (humanWon) { WriteLine("Game Ended! Good Job, you beat the computer! You are a good strategist!!! \n\n\n"); } else { WriteLine("Game Ended! You were beaten by computer! You sucks! \n\n\n"); } }
static (int, int) ProcessDecision(int remainingFlags, int turn, int HumanPulledFlag, FlagRemovalBrain brain, List <ResultTable> resultTables, bool isHumanTurn) { if (!isHumanTurn) { Thread.Sleep(1000);//pretending that the computer is taking time to think WriteLine("Computer AI's turn, computer is thinking..."); WriteLine(); } ResultTable resultTable = new ResultTable { Turn = ++turn, Move = isHumanTurn ? "You " : "Computer", Pulled = isHumanTurn ? HumanPulledFlag : brain.ComputerDecision(remainingFlags, out _) }; resultTable.Remaining = remainingFlags - resultTable.Pulled; resultTables.Add(resultTable); DisplayResultTable(resultTables); return(resultTable.Remaining, resultTable.Turn); }