Как сделать функцию поиска ходов для шашки - C#
Формулировка задачи:
Доброго времени суток! Нуждаюсь в помощи коллективного разума. Не могу понять как сделать функцию поиска ходов для шашки, а точнее как она может побить.
Кое-что написано уже есть, но оно не совсем корректно работает.
Тут вызываем функцию:
Скриншот внизу это что-то вроде прототипа. Красные против зеленых. На доске у красных есть четыре варианта как побить.
[OFFTOP] Извините за неразбериху с числами [/OFFTOP]
Вот что выдает та функция:
То есть добавляет побитые шашки из другого хода.
Листинг программы
- 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);
- }
- }
Кто бьет: 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;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д