Я работаю над текстовой (консольной) стратегической игрой о Второй мировой войне, установленной на карте с квадратной сеткой 2d. Мне нужен метод для расчета прямой видимости от одной плитки на карте к другой. Я использовал этот пример Java для создания своего кода, вот что я написал:
public function plotLine($x0, $y0, $x1, $y1, $size)
{
$arr = $this->getEmptyMap($size);
$xDist = abs($x1 - $x0);
$yDist = -abs($y1 - $y0);
if($x0 < $x1) {
$xStep = 1;
} else {
$xStep = -1;
}
if($y0 < $y1) {
$yStep = 1;
} else {
$yStep = -1;
}
$plotError = $xDist + $yDist;
$arr[$x0][$y0] = 1;
while($x0 != $x1 || $y0 != $y1) {
// if(2 * $plotError > $yDist) {
// // Horizontal step
// $plotError += $yDist;
// $x0 += $xStep;
// }
// if(2 * $plotError < $xDist) {
// // Vertical step
// $plotError += $xDist;
// $y0 += $yStep;
// }
if(2 * $plotError - $yDist > $xDist - 2 * $plotError) {
// Horizontal step
$plotError += $yDist;
$x0 += $xStep;
} else {
// Vertical step
$plotError += $xDist;
$y0 += $yStep;
}
$arr[$x0][$y0] = 1;
}
$this->line = $arr;
}
Примечание: getEmptyMap просто заполняет многомерный массив нулями.
Результат теста с использованием (0, 0, 4, 4, 4) в качестве входных данных:
1100
0110
0011
0001
Я пробовал способы сопоставления строки: один - это обычная реализация, которую использовал Франц Д. (в настоящее время закомментирована в моем примере выше), другой - модифицированная реализация, которую показал Франц Д.. Ни то, ни другое не дает мне желаемого результата; своего рода «сглаживание». Когда солдат будет смотреть с 0,0 на 2,2, а на 1,2 и 2,1 будут здания, все, что находится на 2,2, должно быть заблокировано из поля зрения. Закомментированная реализация полностью игнорирует здания, модификация "попадает" в 2,1, а не в 1,2. Как мне настроить свой код так, чтобы он «попадал» как под линией, так и над линией?