Как сделать функцию поиска ходов для шашки - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Нуждаюсь в помощи коллективного разума. Не могу понять как сделать функцию поиска ходов для шашки, а точнее как она может побить. Кое-что написано уже есть, но оно не совсем корректно работает. Тут вызываем функцию:
for (int i = 0; i < checkersLocation.GetLength(0); i++)
    for (int j = 0; j < checkersLocation.GetLength(0); j++)   // Перебираем все клетки
        if (checkersLocation[i, j] == opColor)                      // Находим нужную
            findJumps(i, j, opColor,new Move(i,j,-1,-1,-1,-1));   // Ищем можно ли побить этой шашкой
List<Move> jumps = new List<Move> { }; // Сюда сохраняем ходы
 
        // х, у - координаты шашки, с - сокращение от Соlor, move - туда сохраняем ход
        private void findJumps(int x, int y, int c, Move move) 
        {
            int enemy;
            int empty = 0;
            int opColor = c;
            if (c == -1) enemy = 1; // Определяем кто враг
            else enemy = 1;
 
            // Сначала смотрим сможем ли мы вообще что нибудь побить если нет - else
            if (isCanJump(x, y, c)) 
            {
 
                // Проверяем на доске ли клетки
                if (x + 1 < 8 && y - 1 >= 0 && x + 2 < 8 && y - 2 >= 0)
                    // Можем ли мы туда походить
                    if (checkersLocation[x + 1, y - 1] == enemy && checkersLocation[x + 2, y - 2] == empty)
                    {
                        // Если можем тогда ходим
                        // Записываем в переменную move где окажеться шашка и что побили
                        move.hitXY.Add(new int[,] { { x + 1, y - 1 } });
                        move.xEnd = x + 2;
                        move.yEnd = y - 2;
                        // Временно прячем побитую шашку чтобы не бить ее снова
                        checkersLocation[x + 1, y - 1] = -3;
                        // Вызываем эту же функцию уже для того места в которым шашка сейчас
                        findJumps(x + 2, y - 2, c, move);
                        // Меняем назад побитую шашку
                        checkersLocation[x + 1, y - 1] = enemy;
                    }
 
                // Эти три IF по аналогии с первым только ищем по другим диагоналям
                if (x + 1 < 8 && y + 1 < 8 && x + 2 < 8 && y + 2 < 8)
                    if (checkersLocation[x + 1, y + 1] == enemy && checkersLocation[x + 2, y + 2] == empty)
                    {
                        move.hitXY.Add(new int[,] { { x + 1, y + 1 } });
                        move.xEnd = x + 2;
                        move.yEnd = y + 2;
                        checkersLocation[x + 1, y + 1] = -3;
                        findJumps(x + 2, y + 2, c, move);
                        checkersLocation[x + 1, y + 1] = enemy;
                    }
                if (x - 1 >= 0 && y - 1 >= 0 && x - 2 >= 0 && y - 2 >= 0)
                    if (checkersLocation[x - 1, y - 1] == enemy && checkersLocation[x - 2, y - 2] == empty)
                    {
                        move.hitXY.Add(new int[,] { { x - 1, y - 1 } });
                        move.xEnd = x - 2;
                        move.yEnd = y - 2;
                        checkersLocation[x - 1, y - 1] = -3;
                        findJumps(x - 2, y - 2, c, move);
                        checkersLocation[x - 1, y - 1] = enemy;
                    }
                if (x - 1 >= 0 && y + 1 < 8 && x - 2 >= 0 && y + 2 < 8)
                    if (checkersLocation[x - 1, y + 1] == enemy && checkersLocation[x - 2, y + 2] == empty)
                    {
                        move.hitXY.Add(new int[,] { { x - 1, y + 1 } });
                        move.xEnd = x - 2;
                        move.yEnd = y + 2;
                        checkersLocation[x - 1, y + 1] = -3;
                        findJumps(x - 2, y + 2, c, move);
                        checkersLocation[x - 1, y + 1] = enemy;
                    }
            }
            else
            {
                // Если ходов больше нет смотрим записывали ли мы вообще что нибудь в
                // переменную move и сохраняем ее в списке доступных ходов
                if (move.xEnd != -1 && move.yEnd != -1)  jumps.Add(move);
            }
        }
Скриншот внизу это что-то вроде прототипа. Красные против зеленых. На доске у красных есть четыре варианта как побить. [OFFTOP] Извините за неразбериху с числами [/OFFTOP] Вот что выдает та функция:
Кто бьет: 8 Где остановится: 44 Что побила: 17 35 Кто бьет: 8 Где остановится: 12 Что побила: 17 35 19 Кто бьет: 28 Где остановится: 60 Что побила: 35 51 Кто бьет: 28 Где остановится: 24 Что побила: 35 51 19 17
То есть добавляет побитые шашки из другого хода.

Решение задачи: «Как сделать функцию поиска ходов для шашки»

textual
Листинг программы
if (c == -1) enemy = 1; // Определяем кто враг
            else enemy = 1;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5
Похожие ответы