我有一个代表生物的大方阵结构。每个生物都可以向左,向上,向右或向下移动。我正在检查空单元格的相邻矩阵位置,并对新坐标进行以下计算:
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%的时间。有没有办法加快这个过程?
也许我可以采取不同的方法,从主游戏板上立即围绕生物坐标的自由点?如果是这样,如果一个生物靠近棋盘边界而不必处理离线索引,我该如何拍摄一个子矩阵?
谢谢, 盖
答案 0 :(得分:1)
所以你有一个结构数组,并在数组内移动结构?这对我来说似乎效率极低。
另外,borderMatrix
- 行花费这么长时间的原因是因为你构建了一个可能很大的数组。
以下是处理移动生物的建议:
将您的生物存储为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
答案 1 :(得分:0)
目前尚不清楚是否存在多个高度依赖的生物,否则这将是一个有效的工作流程:
如果他们是依赖的,但不是太多,你可以多次这样做,直到找到可行的值或在步骤2中包含依赖。