Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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
            });
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
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
            });
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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;
            }
        }
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
 // minimax algorithm
 protected Slot HardMode(OxGame game, string player)
 {
     return(Minimax(game, player));
 }