sve*_*vit 13 .net c# algorithm design-patterns
我正在尝试用我自己的一套规则来编写自己的生命游戏.我想申请的第一个"概念"是社会化(这基本上意味着细胞想要独处还是与其他细胞组成).数据结构是二维数组(现在).
为了能够将一个细胞移动到一组另一个细胞,我需要确定移动细胞的位置.我的想法是,我评估区域中的所有单元格(邻居)并获得一个向量,它告诉我在哪里移动单元格.矢量的大小为0或1(不移动或移动),角度为方向阵列(向上,向下,向右,向左).
这是一个代表细胞的力的图像,就像我想象的那样(但是达到的可能超过5):
ForceAppliedToACell http://img293.imageshack.us/img293/2852/29186643.png
我们举个例子来拍这张照片:
示例http://img683.imageshack.us/img683/7357/70002678.png
Forces from lower left neighbour: down (0), up (2), right (2), left (0)
Forces from right neighbour : down (0), up (0), right (0), left (2)
sum : down (0), up (2), right (0), left (0)
Run Code Online (Sandbox Code Playgroud)
所以细胞应该上升.
我可以用很多if语句编写一个算法并检查邻域中的所有单元格.当然,如果'reach'参数设置为1(图1中的第一列),该算法将是最简单的.但是如果我将覆盖参数更改为10怎么办?我需要事先为每个'达到'参数编写一个算法...我怎么能避免这种情况(注意,力量正在增长(1,2,4,8,16,32 ......)) ?我可以针对此问题使用特定的设计模式吗?
另外:最重要的不是速度,而是能够扩展初始逻辑.
需要考虑的事项:
编写算法来搜索特定小区可达距离内的所有小区应该不难C
。每个有居民的细胞都会对细胞产生特定的排斥力C
。这种排斥力取决于细胞之间的距离C
。在您给出的示例中,排斥力基于 L-1 距离,为2^(reach-distance)
。然后将每个排斥力加在一起以产生累积力,该累积力决定了牢房中居民的移动方向C
。
您不需要为每个不同的范围编写算法。力的大小可以通过一个简单的公式确定。如果您将该公式更改为其他公式(例如斐波那契数),您仍然应该能够根据距离和范围计算所需的大小。
以下是一些用伪 Java 编写的粗略代码,显示了基本思想: http: //codepad.org/K6zxnOAx
enum Direction {Left, Right, Up, Down, None};
Direction push(boolean board[][], int testX, int testY, int reach)
{
int xWeight = 0;
int yWeight = 0;
for (int xDist=-reach; xDist<=+reach; ++xDist)
{
for (int yDist=-reach; yDist<=+reach; ++yDist)
{
int normDist = abs(xDist) + abs(yDist);
if (0<normDist && normDist<reach)
{
int x = testX + xDist;
int y = testY + yDist;
if (0<=x && x<board.length && 0<=y && y<board[0].length)
{
if (board[x][y])
{
int force = getForceMagnitude(reach, normDist);
xWeight += sign(xDist) * force;
yWeight += sign(yDist) * force;
}
}
}
}
}
if (xWeight==0 && yWeight==0) return Direction.None;
if (abs(xWeight) > abs(yWeight))
{
return xWeight<0 ? Direction.Left : Direction.Right;
}
else
{
return yWeight<0 ? Direction.Up : Direction.Down;
}
}
int getForceMagnitude(int reach, int distance)
{
return 1<<(reach-distance);
}
Run Code Online (Sandbox Code Playgroud)