有什么方法可以根据特定情况选择特定的案例陈述吗?

时间:2019-02-17 18:25:34

标签: delphi pascal

 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;

2 个答案:

答案 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);