Как сделать функцию поиска ходов для шашки - 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;