Поколение Лабиринта - Преобразование из C++
Хорошо, многие из вас могут не знать, что такое пешка. Я конвертирую источник отсюда http://en.wikipedia.org/wiki/User:Dllu/Maze для работы на моем сервере SA:MP. Pawn - очень простой для понимания код, поэтому не запускайте его, потому что вы не знаете язык.
По какой-то причине в лабиринте установлены только внешние отступы и первая ячейка (которой они должны быть). Итак, все стены есть, и это хорошо. Проблема в том, что в лабиринте находится только одна клетка, и это отправная точка.
Пожалуйста помоги!
Я вставил его в Pastebin, потому что у pastebin фактически есть синтаксис пешки. http://pastebin.com/wN6KFyFz
Кроме того, он должен поддерживать как возврат, так и прим. Оба имеют одинаковый результат. Из того, что я тестировал, я знаю, что он никогда не достигает отладочных отпечатков, которые выглядят так ("%i, %i | %x, %x, %x"). Что ж, он достигает цикла "В то время как (! Успешно)", 1 раз или 2-3 каждый раз.
1 ответ
Это не работает, потому что вы изменили некоторые циклы do... while в коде C++ на циклы while в Pawn, что не является логически эквивалентным. Циклы do... while всегда выполняются хотя бы один раз, а циклы while - ноль или более раз.
Например, этот код предполагает, что он будет запущен хотя бы один раз:
do{
//randomly find a cell that's in the maze
xcur=rand()%(xsize-2)+1;
ycur=rand()%(ysize-2)+1;
}while(!MAZE[xcur][ycur].in ||
MAZE[xcur][ycur-1].in&&MAZE[xcur][ycur+1].in&&
MAZE[xcur-1][ycur].in&&MAZE[xcur+1][ycur].in);
Если вы измените это на цикл while, тогда условие цикла будет проверено как ложное (поскольку вы начинаете с ячейки, которая находится в лабиринте и не окружена ячейками), и поэтому цикл не будет введен, xcur и ycur никогда не будут изменитесь, и вы застрянете на стартовом месте навсегда!
Если какая-либо версия Pawn, которую вы используете, не поддерживает циклы do... while, вы можете подделать их следующим образом:
new bool:doOnce;
doOnce=true;
while(doOnce||(condition))
{
doOnce=false;
// do stuff...
}
такой же как
do
{
// do stuff...
} while(condition)
Предполагая, что оценка условия не имеет побочных эффектов, таких как увеличение или присвоение переменных, или Pawn может замкнуть оценку, когда doOnce имеет значение true.
Или вы можете сделать это так:
while(true)
{
// do stuff....
if(!condition)
break;
}