В зависимости от текущей координаты вы можете определить, какие направления доступны: накапливать доступные направления и затем выбирать случайные.Например:
var
..
DirList: TList<TDirection>;
begin
..
DirList := TList<TDirection>.Create;
try
if i > 0 then
DirList.Add(mdUp);
if i < 19 then
DirList.Add(mdDown);
if j > 0 then
DirList.Add(mdRight);
if j < 19 then
DirList.Add(mdLeft);
case DirList[Random(DirList.Count)] of
mdUp: CurrentCell := maze[i, j - 1];
mdDown: CurrentCell := maze[i, j + 1];
mdLeft: CurrentCell := maze[i - 1, j];
mdRight: CurrentCell := maze[i + 1, j];
end;
CurrentCell.Wall := False;
...
Без общего списка это будет выглядеть так:
var
..
DirList: TList;
begin
..
DirList := TList.Create;
try
if i > 0 then
DirList.Add(Pointer(mdUp));
if i < 19 then
DirList.Add(Pointer(mdDown));
if j < 19 then
DirList.Add(Pointer(mdLeft));
if j > 0 then
DirList.Add(Pointer(mdRight));
Direction := TDirection(DirList[Random(DirList.Count)]);
...
Мне бы очень хотелось сделать это с набором, который лучше соответствовал бы контексту, но для этого потребовались бы случайные помощники.
Чтобы ответить на заглавный вопрос, необходимо прочитать исходное сообщение.Ответ - нет, после того, как case
скомпилирован в двоичный файл, нет способа повлиять на существование отдельных веток во время выполнения.Вы также не можете воздействовать на значения ветвления, они должны быть константами, которые разрешаются во время компиляции.К счастью, это вообще не требуется, ведь вы решаете во время выполнения, какое значение будет иметь селектор и, следовательно, какая ветвь будет выбрана.