锯齿数独 cocos2d-x 开发 (一)

先放一张游戏截图:
这里写图片描述

实现功能:
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 开发 (二)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值