protected Slot NormalMode(OxGame game) { var stupid = ((int)game.Size * (int)game.Size) - ((int)game.Size != 3 ? (int)game.Size != 5 ? 5 : 3 : 1); return((game.Slots.Where(s => s.IsX == null).Count() >= stupid) ? EasyMode(game) : HardMode(game, Symbol)); }
protected bool PlayerTurn(OxGame game, Board board, IPlayer player) { var slot = player.Play(game, board); var result = game.TakeSlot(slot); board.Render(game.Slots); return(result); }
protected Slot EasyMode(OxGame game) { var random = new Random(); int row = random.Next(0, (int)game.Size); int col = random.Next(0, (int)game.Size); while (game.Slots.Find(s => s.Row == row && s.Column == col).IsX != null) { row = random.Next(0, (int)game.Size); col = random.Next(0, (int)game.Size); } return(new Slot { IsX = Symbol == "X", Row = row, Column = col }); }
public int Start(string selected, BoardSize size, AiLevel level, bool first) { var score = new GameScore(); do { var symbol = GetSymbolForPlayer(selected); var player = first ? symbol.Item1 : symbol.Item2; var game = new OxGame(size); var board = new Board(size); var human = new Human(symbol.Item1); var ai = new AI(symbol.Item2, level); // game loop while (game.GameState == State.Playing) { if (player == human.Symbol) { // ตาผู้เล่น game.CheckError(PlayerTurn(game, board, human)); player = ChangeTurn(player); } else { // ตา ai game.CheckError(PlayerTurn(game, board, ai)); player = ChangeTurn(player); } } if (game.GameState == State.Win || game.GameState == State.Draw) { // นับสถิติการแข่งขัน AddSore(game, score, human, ai); } else if (game.GameState == State.Error) { // แสดงข้อผิดพลาด DisplayError(); } } while (PlayAgain()); score.Summary(); return(0); }
public Slot Play(OxGame game, Board board) { ConsoleKey key; Console.CursorVisible = false; // หาช่องที่ว่างแรกที่เจอเพื่อวาง cursor var first = game.Slots.First(s => s.IsX == null); CurrentCell = game.Slots.IndexOf(first); board.Cursor(new Slot { IsX = Symbol == "X", Row = first.Row, Column = first.Column }); do { // กดปุ่มลูกศรเพื่อเลื่อน cursor ไปยังช่องที่ว่างอยู่ key = Console.ReadKey(true).Key; switch (key) { case ConsoleKey.UpArrow: MoveUp(board, game.Slots); break; case ConsoleKey.DownArrow: MoveDown(board, game.Slots); break; case ConsoleKey.LeftArrow: MoveLeft(board, game.Slots); break; case ConsoleKey.RightArrow: MoveRight(board, game.Slots); break; } } while (key != ConsoleKey.Enter); Console.CursorVisible = true; // ผู้เล่นใส่ค่าในช่องที่เลือก return(new Slot { IsX = Symbol == "X", Row = game.Slots[CurrentCell].Row, Column = game.Slots[CurrentCell].Column }); }
protected Slot Minimax(OxGame game, string player) { Slot best = null; var isX = player == "X"; foreach (var slot in game.Slots.Where(s => s.IsX == null)) { var clone = game.Clone(); clone.TakeSlot(isX, slot.Row, slot.Column); if (clone.GameState == State.Playing) { var minimax = Minimax(clone, TogglePlayer(player)); slot.Score = minimax.Score; } else { switch (clone.GameState) { case State.Win: slot.Score = (clone.GetWinner() == Symbol) ? 1 : -1; break; case State.Draw: slot.Score = 0; break; } } if (best == null) { best = new Slot { IsX = isX, Row = slot.Row, Column = slot.Column, Score = slot.Score }; } if ((player == Symbol && slot.Score > best.Score) || (player != Symbol && slot.Score < best.Score)) { best = new Slot { IsX = isX, Row = slot.Row, Column = slot.Column, Score = slot.Score }; } } return(best); }
protected void AddSore(OxGame game, GameScore score, Human human, AI ai) { switch (game.GameState) { case State.Win: if (game.GetWinner() == human.Symbol) { score.AddWin(); DisplayResult($"You({human.Symbol}) Win"); } else { score.AddLose(); DisplayResult($"Com({ai.Symbol}) Win"); } break; case State.Draw: score.AddDraw(); DisplayResult("Draw"); break; } }
public Slot Play(OxGame game, Board board) { var cells = (int)board.Size * (int)board.Size; if (game.Slots.Where(s => s.IsX == null).Count() == cells) { // ai เริ่มเล่นก่อน var random = new Random(); return(new Slot { IsX = Symbol == "X", Row = random.Next(0, (int)board.Size), Column = random.Next(0, (int)board.Size) }); } // difficult level var slot = Level switch { AiLevel.Easy => EasyMode(game), AiLevel.Normal => NormalMode(game), _ => HardMode(game, Symbol), }; return(slot); }
// minimax algorithm protected Slot HardMode(OxGame game, string player) { return(Minimax(game, player)); }