一个棋类游戏统计连子个数的算法
1、数据结构:这里用一个2维数组存储棋盘信息,每个位置存储棋子的状态信息,定义数组board[x][y],x和y代表棋盘的行和列。就拿五子棋说,五子棋的棋子只有黑色和白色的,这里我们用0表示这个位置没子,1表示黑色,-1表示白色,比如board[1][2] = 1时,就是在第1行的第2个位置上放的是一个黑色棋子。在这样的棋盘上只要知道x和y的值就可以统计board[x][y]在棋盘上的连子个数。棋盘数组如下:
int board[][] = {{0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
{0, 1, 1, 1, 1, 1, 0, 1, 0, 0},
{1, 0, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 0, 0, 1, 1},
{0, 1, 1, 0, 0, 1, 0, 0, 1, 0},
{0, 0, 1, 1, 1, 1, 0, 0, 1, 0},
{1, 0, 0, 0, 0, 1, 1, 1, 1, 0},
{0, 1, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 1, 1, 1, 1, 1, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 1, 0} };
2、基本思想:
判断连子个数主要就是找四个大方向上(横竖撇捺)的连子个数,但实际上是八个方向每个大方向上都有一个正负的分方向。一般都是把八个方向上的连子找出来,如果两个分方向是同一个大方向上的,就把连子个数加起来,得到每个大方向的连子个数。在这里不管用递归还是循环都可以把八个分方向上的连子个数统计出来。这里用循环实现一个统计连子的算法。因为有八个方向,在这里我们用两个一维数组来实现八个方向的变化,数组定义如下:
int directionx[] = {1,1,0,-1,-1,-1,0,1};
int directiony[] = {0,1,1,1,0,-1,-1,-1};
这样(x+1,y+1)方向的表示应该是(x+directionx[1],y+directiony[1]),用一个for循环就实现了八个方向的变换,这里可以照着坐标系看看就清楚了。这两个数组在四个大方向上的正负方向的下标刚好相差为4,这样设计就是为了方便统计的,这样就可以用方向下标对4取模来表示一个大方向了,最后用一个一维数组来纪录四个方向上的连子个数maxnum[4],如果是连子就maxnum[i mod 4]++就可以了,就这样一两个辅助存储空间用一个for循环就统计出了4个方向的连子个数。
3、算法实现:(伪c代码表示)
统计n*n的棋盘上的连子个数
int maxnum(int x, int y, int board[][])
{
int temp;
int x1, y1;
int maxnum[] = {1,1,1,1};
temp = board[x][y];
int directionx[] = {1,1,0,-1,-1,-1,0,1};
int directiony[] = {0,1,1,1,0,-1,-1,-1};
for(i = 0; i < 8; i++)
{
x1 = x + directionx[i];
y1 = y +directiony[i];
while(x1 >= 0 && x1 < n && y1 >= 0 && y1 < n )
{
if(temp == board[x1][y1])
maxnum[i mod 4]++;
else
break;
x1 = x1 + directionx[i];
y1 = y1 +directiony[i];
}
}
return maxnum;
}
完
写的不太清楚请谅解,不过看代码应该能知道意思。。。
作者:迷途的羔羊