Как сделать функцию поиска ходов для шашки - 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;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д