Beispiel #1
0
        public XoMove GetMove(XoField field)
        {
            var root = AnalysePosition(field);

            // Создаём список вариантов
            var moves = new List<XoMove>();
            foreach (var nextChoice in root.Next)
            {
                // Если оценки совпали это лучший ход
                if (nextChoice.Evaluation == root.Evaluation)
                {
                    // Ищем что же за ход это был
                    var move = new XoMove { line = 255, column = 255 };
                    for (byte i = 0; i <= 2; i++)
                    {
                        for (byte j = 0; j <= 2; j++)
                        {
                            if (nextChoice.Field.F[i, j] != root.Field.F[i, j])
                            {
                                move.line = i;
                                move.column = j;
                            }
                        }
                    }
                    moves.Add(move);
                }
            }

            // Выбираем случайный
            var rnd1 = new Random();
            var randMoveIndex = rnd1.Next(0, moves.Count - 1);

            return moves[randMoveIndex];
        }
Beispiel #2
0
        private void SystemsGame()
        {
            var engines = GetXoGameEngines();

            var enginePlaysXInfo =
                ChooseEngine(engines, "Выберите игровой движок для крестиков: ", true);

            var enginePlaysOInfo =
                ChooseEngine(engines, "Выберите игровой движок для ноликов: ", false);

            var enginePlaysX = LoadEngine(enginePlaysXInfo);
            var enginePlaysO = LoadEngine(enginePlaysOInfo);

            var engineMove = new XoMove();
            bool correctMove;
            do
            {
                switch (DetectMove(_field))
                {
                    case 1: // X
                        engineMove = enginePlaysX.GetMove(_field);
                        break;
                    case 2: // O
                        engineMove = enginePlaysO.GetMove(_field);
                        break;
                }

                correctMove = CheckMove(engineMove, _field);
                if (correctMove)
                    MakeMove(engineMove);

                PrintField(true);

                Console.WriteLine("Для продолжения нажмите любую клавишу...");
                Console.ReadKey();

            } while ((Finished == 3) && (correctMove));

            PrintField(true);

            if (!correctMove)
            {
                Console.WriteLine("Попытка сделать ход в непустую ячейку: {0}, {1}",
                    engineMove.line, engineMove.column);
                return;
            }

            if (Finished == 0)
            {
                Console.WriteLine("Ничья.");
            }
            else
            {
                Console.WriteLine("Победа! Выиграли - " + ToolBox.BytetoChar(Finished));
            }

            Console.ReadKey();
        }
Beispiel #3
0
 private void MakeMove(XoMove move)
 {
     _field.F[move.line, move.column] = DetectMove(_field);
 }
Beispiel #4
0
        private XoMove HumanMove()
        {
            var result = new XoMove();

            do
            {
                PrintField(true);

                Console.Write("Введите строку хода: ");
                result.line = (byte)(byte.Parse(Console.ReadLine()) - 1);

                Console.Write("Введите столбец хода: ");
                result.column = (byte)(byte.Parse(Console.ReadLine()) - 1);

                if (_field.F[result.line, result.column] != 0)
                {
                    Console.WriteLine("Неправильный ход.");
                    Console.ReadKey();
                }
            } while (_field.F[result.line, result.column] != 0);

            return result;
        }
Beispiel #5
0
        private void EnginesTest()
        {
            var engines = GetXoGameEngines();

            var engineInfo1 =
                ChooseEngine(engines, "Выберите первый игровой движок: ", true);

            var engineInfo2 =
                ChooseEngine(engines, "Выберите второй игровой движок: ", false);

            Console.Write("Введите количество туров: ");
            var roundQuantity = int.Parse(Console.ReadLine());

            var engine1 = LoadEngine(engineInfo1);
            var engine2 = LoadEngine(engineInfo2);

            int engine1Wins = 0,   // Побед первого движка
                engine2Wins = 0,   // Побед второго движка
                engine1Faults = 0, // Ошибок первого движка
                engine2Faults = 0, // Ошибок второго движка
                draws = 0;         // Ничьих

            var engineMove = new XoMove();
            byte correctMoves;

            for (int i = 1; i < (roundQuantity * 2) + 1; i++)
            {
                _field = new XoField {F = new byte[,] {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}};

                do
                {
                    correctMoves = 0;

                    switch (DetectMove(_field))
                    {
                        case 1: // X
                            engineMove = i % 2 == 1 ?
                                     engine1.GetMove(_field) :
                                     engine2.GetMove(_field);

                            break;
                        case 2: // O
                            engineMove = i % 2 == 1 ?
                                     engine2.GetMove(_field) :
                                     engine1.GetMove(_field);
                            break;
                    }

                    if (CheckMove(engineMove, _field))
                        MakeMove(engineMove);
                    else
                        correctMoves = (byte)(((DetectMove(_field)) == 1) ?
                                              ((i % 2 == 1) ? 1 : 2) :
                                              ((i % 2 == 1) ? 2 : 1));

                } while ((Finished == 3) && (correctMoves == 0));

                if (correctMoves != 0)
                {
                    if (correctMoves == 1) // Ошибся 1-й движок
                        engine1Faults++;
                    else // Второй
                        engine2Faults++;
                }
                else
                {
                    switch (Finished)
                    {
                        case 0:
                            draws++;
                            break;
                        case 1:
                            if (i%2 == 1)
                            {
                                engine1Wins++;
                            }
                            else
                            {
                                engine2Wins++;
                            }
                            break;
                        case 2:
                            if (i%2 == 1)
                            {
                                engine2Wins++;
                            }
                            else
                            {
                                engine1Wins++;
                            }
                            break;
                    }
                }

                Console.Clear();
                Console.WriteLine("Всего игр = {0}.", i);
                Console.WriteLine("Ничьих = {0}", draws);
                Console.WriteLine("Побед {0} = {1}", engineInfo1.Name, engine1Wins);
                Console.WriteLine("Побед {0} = {1}", engineInfo2.Name, engine2Wins);
                Console.WriteLine("Ошибок {0} = {1}", engineInfo1.Name, engine1Faults);
                Console.WriteLine("Ошибок {0} = {1}", engineInfo2.Name, engine2Faults);
            }

            Console.ReadKey();
        }
Beispiel #6
0
 private static bool CheckMove(XoMove engineMove, XoField field)
 {
     return field.F[engineMove.line, engineMove.column] == 0;
 }