Direction := TDirection(Random(Succ(Ord(High(TDirection)))));
case Direction of
up:
begin
CurrentCell := maze[i, j - 1];
CurrentCell.Wall := false;
end;
down:
begin
CurrentCell := maze[i, j + 1];
CurrentCell.Wall := false;
end;
left:
begin
CurrentCell := maze[i - 1, j];
CurrentCell.Wall := false;
end;
right:
begin
CurrentCell := maze[i + 1, j];
CurrentCell.Wall := false;
end;
我基本上有一个称为迷宫([0..19, 0.19]
)的2D数组,其中从maze[0,0]
中选择了一个随机方向。如果指针CurrentCell
位于maze
边缘的任何单元格中,即列0,行0,行19和列19,则某些方向无法选择。我的问题是,如果CurrentCell
指针位于上面列出的任何行和列中,有什么办法可以告诉程序从哪个方向随机进行?
使用枚举创建路线
TDirection = (up, down, left, right);
var
Direction : TDirection;
答案 0 :(得分:2)
根据当前坐标,您可以确定可用的方向:累积可用的方向,然后随机选择一个方向。例如:
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
编译为二进制文件之后,就无法在运行时实现各个分支的存在。您也不能影响分支值,它们必须是在编译时解析的常量。幸运的是,根本不需要这样做,毕竟您可以在运行时确定选择器将保留哪个值,从而选择哪个分支。
答案 1 :(得分:0)
将所有可能的方向添加到TDirection
数组中,并从该数组中选择一个随机元素。
这是一个函数,其中输入为迷宫边界和实际位置:
Type
TDirection = (up, down, left, right);
TMazeRect = record lowX,lowY,highX,highY : integer; end;
const
MyMazeRect : TMazeRect = (lowX:0;lowY:0;highX:19;highY:19);
function RandomRestrictedDirection( const area : TMazeRect; posX,posY : Integer) : TDirection;
var
dirArray : array[0..3] of TDirection;
count : Integer;
begin
count := 0;
if (posY < area.highY) then begin
dirArray[count] := up;
Inc(count);
end;
if (posY > area.lowY) then begin
dirArray[count] := down;
Inc(count);
end;
if (posX > area.lowX) then begin
dirArray[count] := left;
Inc(count);
end;
if (posX < area.highX) then begin
dirArray[count] := right;
Inc(count);
end;
Result := dirArray[Random(count)];
end;
这样称呼它:
NewDirection := RandomRestrictedDirection(MyMazeRect,i,j);