一:项目背景
本游戏的棋盘大小是9 × 9,一共会出现6种颜色的珠子。初始状态棋盘上7个随机位置分布着7个随机颜色的珠子。通过移动珠子将同色的珠子连在一起来消除后得分。当无珠子可以移动时程序结束。让同色的棋子5颗连在一起排成横向、纵向或者斜向,五颗以上即可消除得分。
游戏规则:
- 1.一次只允许移动一个珠子。(从实现难度上分成3等。原游戏规则是要求必须存在可移动路径时方可移动珠子,即在移动路径上存在珠子阻挡就无法移动。这需要完成一项有效路径判断功能。更为优秀者可设计所采用的移动路径是所有可行移动路径中最短的一个,并把移动线路呈现出来。最低要求是只要棋盘上有空位置就可以移动珠子。)
- 2.每移动一颗珠子以后,如果不满足同色的5颗珠子相连,将出现3个随机颜色珠子分布到棋盘任意空置的位置上。如果同色的珠子能有5颗连在一起排成横向、纵向或者斜向时,这5颗珠子从棋盘上消失,不产生3颗珠子。同时游戏者可以得10分。
- 3.当同色的珠子有6颗连在一起排成横向、纵向或者斜向时,游戏者可以得12分。同时6颗珠子从棋盘上消失。(即:在同一方向上连在一起的珠子每增加一颗,游戏者多得2分。依此类推。)
- 4.如果移动一个珠子之后,有两个方向都可以消除(即:任何单一方向上的同色珠子数至少为5颗),则两个方向的所有珠子都消除。按每个珠子2分获得分值。
- 5.两个方向同时消除的规则,同样适用于三个或四个方向。
- 6.如果系统随机产生的珠子正好能凑成了同色的5颗及以上一起排成横向、纵向或者斜向,则这几颗同向的珠子自行消除,游戏者不得分。
- 7.当棋盘被珠子占满时游戏结束。
二:项目设计
- 各种初始化函数,通过遍历棋盘结构体,将所有数据元素初始化(置零);
- 检查是否有标记的函数:通过遍历棋盘结构体中的被标记的珠子数组实现,用于实现选择空白处时,被标记的小球移动和选中小球时,查看是选中的是其他小球还是原小球等功能;
- 在空白处随机生成num个珠子的函数:通过随机函数rand()实现,用于实现初始状态时要生成七个随机小球,和移动珠子且不满足消除条件时生成新的三个小球等功能;
- 寻找最短路径的函数:通过队列和广度优先搜索实现,用于实现小球移动时按最短路径移动等功能,具体代码如下:
int find_path(color_linez* cl, int startX, int startY, int endX, int endY){
int i;
queue<struct node> Q;
struct node s;
struct node t;
s.x = startX;
s.y = startY;
s.c = 0;
//走过的路设为-1(可改)
if (cl->map[s.x][s.y] == 0)
cl->map[s.x][s.y] = -1;
Q.push(s); //入队
while (!Q.empty()) //队不为空{
s = Q.front();
Q.pop();
if (s.x == endX && s.y == endY) //达到终点 {
init_map(cl); //初始化寻路痕迹
while (!Q.empty()) //队不为空{
Q.pop();
}
return s.c;
}
//四个方向
for (i = 0; i < 4; i++){
t.x = s.x + direct[i][0];
t.y = s.y + direct[i][1];
if (t.x >= 0 && t.x < row && t.y >= 0 && t.y < col && cl->map[t.x][t.y] == 0) //如果可通{
//步数+1
t.c = s.c + 1;
//记录路径
cl->path[t.x][t.y].x = s.x;
cl->path[t.x][t.y].y = s.y;
//走过的路设为-1(可改)
if (cl->map[s.x][s.y] == 0)
cl->map[s.x][s.y] = -1;
Q.push(t);
}
}
}
init_map(cl); //初始化寻路痕迹
return 0;
}
5.移动珠子的函数:用于实现小球移动的功能;
6.小球消除的函数:通过遍历棋盘数组的相同珠子数组实现,包括检查是否满足消除条件和消除动画两个部分;
7.判断游戏是否结束的函数:通过遍历棋盘数组的小球数组实现。