先放一张游戏截图:
实现功能:
1、两种模式,普通数独和锯齿数独
2、不使用题库,数字及锯齿均纯随机生成,有且仅有唯一解。
3、难度控制。
4、生成时间控制在1s内(ipad mini2)
一、生成普通数独。
1、随机对某行生成1-9的排列(普通数独),使用DLX算法求出一组解。
2、挖洞求唯一数独。在成型的数独上挖一些洞检测是否有唯一解。 对于不同的难度采取不同的贪心思路。
do
{
//下个没有访问过的节点
Point p;
cnt = 0;
do {
cnt ++;
p = getNextPoint(level, startX, startY);
}while (vis[p.x][p.y] && cnt < 50);
startX = p.x;
startY = p.y;
// if (level == 1 )
{
while (startX == originX && startY == originY)
{
cnt = 0;
do {
cnt ++;
p = getNextPoint(level, startX, startY);
}while (vis[p.x][p.y] && cnt < 50);
startX = p.x;
startY = p.y;
}
}
if (vis[p.x][p.y])
break;
vis[p.x][p.y] = 1;
//挖洞
tmp[p.x][p.y] = 0;
DLXHelper *dlx = new DLXHelper();
if (dlx->getAnswerCount(tmp) > 1) //多解恢复
{
tmp[p.x][p.y] = sudo[p.x][p.y];
}
free(dlx);
wnf = getDifficulty(tmp);
}while( getLevel(wnf) != level &&
(startX != originX || startY != originY));
注意:1.挖洞nextpoint的选择方法,对于低等级的直接随机就好(让洞看起来更随机),对于高等级的一般采取间隔式随机挖洞,等级越高挖洞的间距约小(不然很快就挖不了了)。
2.难度的计算。主要思路是计算每个空位需要考虑的次数/所有可能的填法。 当然你也可以再加一些限制,比如高难度情况下每行不允许出现几个以上的数字等。
3.跳出条件。两种情况:要么难度超过了,要么nextpoint多次取到访问过的点,我们可以认为已经没有洞可挖了。
添加ui,普通数独差不多就可以完成了,不足的是毕竟随机性,很难生成特别高难度的情况。
锯齿数独 cocos2d-x 开发 (二)