Не рекомендуется «перебирать» случайное число, когда вы обнаружите, что не можете двигаться в каком-то направлении, потому что, если вам не повезло, вы получаете одно и то же число дважды (или даже 3, 4 или более раз) -так что даже если вы сгенерировали 4 случайных числа и все они потерпели неудачу, это не значит, что вы застряли.
Вы можете решить эту проблему, сгенерировав одно число и попробовав все 4 возможных направления, начиная с него:
Если генератор случайных чисел возвратил 0: проверьте 0, 1, 2, 3
Если генератор случайных чисел возвратил 1: проверьте 1, 2, 3, 0
Если генератор случайных чисел возвратил 2: проверка 2, 3, 0, 1
Если генератор случайных чисел возвратил 3: проверка 3, 0, 1, 2
Реализуется следующим кодом:
desired_move = rand();
success = 0;
for (i = 0; i < 4 && !success; ++i)
{
move = (desired_move + i) % 4;
switch (move)
{
case 0: // Go up
if (row > 0 && box[row - 1][col] == '.')
{
row = row - 1;
success = 1;
}
break;
case 1: // Go down
...
}
}
if (!success) // Tried all 4 directions but failed! You are stuck!
{
goto START_OVER; // or whatever else
}
Обратите внимание, что этот алгоритм не очень случайный: если вы не можете подняться вверх, есть большая вероятность того, что вы пойдете вниз, чем вправо или влево.Если вы хотите исправить это, вы можете выбрать случайную перестановку из 4 направлений вместо последовательной проверки направлений:
const int permutation_table[24][4] = {
{0, 1, 2, 3},
{0, 1, 3, 2},
{0, 2, 1, 3},
...
{3, 2, 1, 0}
};
index = rand() % 24;
for (i = 0; i < 4; ++i)
{
move = permutation_table[index][i];
switch (move) {
... // As above
}
}