0

我有一个代表生物的结构方阵。每个生物都可以向左、向上、向右或向下移动。我正在检查空单元格的相邻矩阵位置,并对新坐标进行以下计算:

function res = Move2(worldDimension,row,col,left,up,right,down)

%In the following matrices, good moves are > 0.

%Directions pattern:
patternMatrix = [0 2 0;
                 1 5 3;
                 0 4 0];
%Possible border moves:             
borderMatrix = [0 (row>1) 0;
                (col>1) 1 (col<worldDimension);
                 0 (row<worldDimension) 0;];
%Possible neighbor moves:              
neighborsMatrix = [0 (up==0) 0 ;
                (left==0) 1 (right==0);
                 0 (down==0) 0;];             

%Matrix of possible directions including neighbors and borders
possibleMovesMatrix = ((borderMatrix).*(neighborsMatrix)).*(patternMatrix);

%Vector of possible directions:
possibleMovesVector = sort(possibleMovesMatrix(possibleMovesMatrix(:) > 0));

%Random direction:
randomDirection = possibleMovesVector(randi(length(possibleMovesVector)));

directionCoordsVector = [[row (col-1)];[(row-1) col];[row (col+1)];[(row+1) col];[row col]];                         
res = [directionCoordsVector(randomDirection,1) directionCoordsVector(randomDirection,2)];
end

这个函数有点慢,当我运行分析器时它告诉我:

borderMatrix = [0 (row>1) 0;
(col>1) 1 (col<worldDimension);
0 (row<worldDimension) 0;];

需要 36% 的时间并且:randomDirection = possibleMove... 需要 15% 的时间。有没有办法可以加快这个过程?

也许我可以通过从主游戏板上立即获取生物坐标周围的空闲点来采取不同的方法?如果是这样,如果一个生物靠近棋盘的边界,我该如何获取子矩阵而不必处理越界索引?

谢了,兄弟们。

4

2 回答 2

1

所以你有一个结构数组,并在数组内移动结构?这对我来说似乎效率极低。

此外,borderMatrix-line 需要这么长时间的原因是因为您正在构建一个可能很大的数组。

以下是处理移动生物的建议:

将您的生物存储为 nCreatures-by-mProperties 数字数组。在数组的列上应用函数来爬取单个字段要容易得多。例如creatures = [x,y,prop1,prop2];

一个接一个地移动你的生物:

for iCreature = 1:nCreatures
    currentPos = creatures(iCreature,1:2);

    %# initialize array of allowed moves with border conditions
    goodMoves = [currentPos(1) > 1, currentPos(2) > 1, currentPos(1) < maxX, currentPos(2) < maxY, true];

    %# check for neighbors
    if any(creatures(:,1) == currentPos(1) - 1 & creatures(:,2) == currentPos(2))
       goodMoves(1) = false;
    end
    %# etc

    %# identify remaining good moves
    if any(goodMoves(1:4))
       goodMoveIdx = find(goodMoves);
       move = goodMoveIdx(randi(length(goodMoveIdx)));
    else
       move = 5; %# remain stationary
    end
end
于 2013-01-22T16:22:20.737 回答
0

目前尚不清楚是否存在多个高度依赖的生物,但否则这将是一个有效的工作流程:

  1. 每个生物产生 1 个随机数
  2. 确定每个生物有多少可能的移动
  3. 使用对应的随机数进行选择

如果它们是相关的,但不是太多,您可以多次执行此操作,直到找到可行的值或在步骤 2 中包含相关性。

于 2013-01-22T15:25:25.973 回答