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

二、锯齿的生成
1、9*9的格子划分成9个随机形状的连通块。
这里采用了bfs + 并查集的算法。 在bfs生成连通块的同时,检测整个图所有的联通分量, 一些特殊的情况进行剪枝。
bfs 函数如下:

bool JigsawHelper:: bfs(int i, int j, int groupId)
{bool vis[81];memset(vis, 0, sizeof(vis));int n = i * 9 + j;vis[n] = true;queue<int>q;q.push(n);add(i,j,q,vis);int cnt = 1;
//    cout<<"-------------------"<<endl;while (cnt <= 9 && !q.empty()){int tp = q.front();q.pop();g[tp] = groupId;if (!check(n)){g[tp] = 0;continue;}cnt ++;add(tp/9,tp%9,q,vis);
//        cout<<"("<<tp/9<<","<<tp%9<<")";}
//    cout<<"-------------------"<<endl;if (cnt < 10){//        cout<<"cnt: "<<cnt<<endl;return false;}return true;
}

check()用于检测当前情况下能否有机会成功划分。
这里有两个重要的判定:
1) 生成过程中不同连通块的个数不得超过九个。
2)生成一个连通块完毕后,剩下的连通块中不能有个数不为9的倍数。

    int cnt[81];memset(cnt,0,sizeof(cnt));for (int i = 0; i < 81; i++){int num = FindSet(i);cnt[num]++;}int nParent = FindSet(n);int ans = 0;int small = 0;for (int i = 0; i < 81; i++){if (cnt[i] == 0) continue;if (cnt[i]%9 != 0) //连通个数不是9的倍数{ans ++;}if (cnt[i]%9 != 0 && i != nParent) //小于9的连通块{small += cnt[i]%9;}}if (cnt[nParent] != 9) //生成过程中小连通块的个数和当前块的和大于9{if (small + cnt[nParent] > 9)return false;}if (cnt[nParent] == 9 && ans > 0) //生成结束后仍然有个数不为9的倍数的连通块return false;return true;

到这里并没有结束,仍然有一些刁钻的数据会造成无法继续往下生成的情况,好在只有20%左右的几率。
项目不是做题,复杂度不大,rebuild即可。

void JigsawHelper:: build()
{srand(time(NULL));memset(g,0,sizeof(g));vector<int>vt;for (int i = 0; i < 81; i++)vt.push_back(i);for (int groupId = 1; groupId <= 9; groupId++){int num = vt[rand()%vt.size()];if (!bfs(num/9, num%9, groupId)){cout<<"fail!!!!!!!!!!! rebuild"<<endl;build();return;}vt.clear();for (int i = 0; i < 81; i++){if (g[i] == 0)vt.push_back(i);}}checkColor();
}

2、 染色
由于四色定理的存在,预先准备四种不同的颜色。
将每个连通块看做一个节点,Welch Powel法染色即可。

3、数独的生成及tricks。
获取锯齿数组和颜色数组后就可以重新用DLX解精确覆盖问题了,构造的时候方式略不同而已。
但是最终生成的时候却偶尔会出现卡死的情况!
对于一种锯齿并不是确定有解的。所以这里修改了下生成数独的方式并添加了一些剪枝。
1)选取种子的时候只取一个随机格子随机数。
2)dlx 中dfs时超过一定depth就return false。多次测试取15000。
3)算不出结果继续rebuild, 相信cpu的实力。(实测ipad mini2以上 生成所有难度均在1s之内,完全可以接受的范围)。

4、UI
我只是在简单的背景上添加了81个不同颜色的editbox,限制一下整数。
当然有时间换成用button选择肯定是更好的

void SudokuUI::editBoxTextChanged(EditBox *editBox, const std::string &text)
{char buffer[2];if (text.length() >= 1){char c = text[text.length() - 1];if (!isdigit(c)){editBox->setText("");return;}sprintf(buffer, "%c",c);editBox->setText(buffer);        }}

由于锯齿形本身限制较多, 所以比较容易挖更多的洞,生成的效果也明显好一些,感受下难度吧XD~

锯齿数独 cocos2d-x 开发 (二)相关推荐

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

    先放一张游戏截图: 实现功能: 1.两种模式,普通数独和锯齿数独 2.不使用题库,数字及锯齿均纯随机生成,有且仅有唯一解. 3.难度控制. 4.生成时间控制在1s内(ipad mini2) 一.生成普 ...

  2. 初学者开发iOS游戏的入门必备用书——iOS 5 cocos2d游戏开发实战(第2版)

    如果想接触iOS游戏开发,今天笔者就推荐一本"大杀器"--<iOS 5 cocos2d游戏开发实战(第2版)>(当当链接) 为零基础的"设想过自己写个电脑游戏 ...

  3. springboot flask php,使用Vue,Spring Boot,Flask,Django 完成Vue前后端分离开发(二)

    使用Vue完成前后端分离开发(二) Bravery never goes out of fashion. 勇敢永远不过时. 前面简单说了一下 Vue 项目的搭建和项目的大致页面,这里讲一下 Djang ...

  4. 【Android游戏开发二十七】讲解游戏开发与项目下的hdpi 、mdpi与ldpi资源文件夹以及游戏高清版本的设置...

    今天一个开发者问到我为什么游戏开发要删除项目下的hdpi.mdpi和ldpi文件夹:下面详细给大家解答一下: 首先童鞋们如果看过我写的<[Android游戏开发二十一]Android os设备谎 ...

  5. Qt计算器开发(二):信号槽实现数学表达式合法性检查

    表达式的合法性 由于我们的计算器不是单步计算的,所以我们能够一次性输入一个长表达式.然而假设用户输入的长表达式不合法的话,那么就会引发灾难.所以有必要对于用户的输入做一个限制. 一些限制举例: 比方, ...

  6. SQL2K数据库开发二十三之索引操作重建索引

    1.可以使用下面的语句创建索引,重建索引应使用DROP_EXISTING选项. 2.在SQL Server查询分析器中输入如下的SQL语句,点击工具栏上的执行查询图标. 3.查询语句执行完毕后,结果窗 ...

  7. 以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约

    以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约 在上一篇文章中,我们使用Truffle自带的客户端Truffle Develop,在私有链上搭建并运行了官方提供的WebPack智能合 ...

  8. Java 快速开发二维码生成服务

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「码农小胖哥」 1. 前言 不知道从什么 ...

  9. proc除了能用于oracle开发_能不能用于mysql开发_Oracle数据库开发(二).Linux下配置使用ProC...

    一.提要 上文简单介绍了Windows下ProC配置开发,这次我们使用Linux平台再次配置Oracle ProC开 发环境(RedHat Linux 9 + Oracle 92). <ORAC ...

最新文章

  1. matlab 多项式拟合 ployval
  2. PHPMaker 2020中文版
  3. 51nod 1127 最短的包含字符串(尺取法)
  4. 基础省选+NOI-第6部分 字符串
  5. linux tar 命令使用
  6. OTL翻译(4) -- otl_stream类
  7. BZOJ1301 字符加密Cipher (后缀数组)
  8. 拓端tecdat|R语言参数检验 :需要多少样本?如何选择样本数量
  9. 汇编语言转c语言的软件,Arm汇编转换器下载
  10. 云服务预先定义正确的云计算SLA要求
  11. html使用表格输入数字,表格中输入数字,为什么出现“####”的原因
  12. 亚马逊账户违规了?如何自查
  13. CTFHUB技能树题目解析(持续更新)
  14. 模糊照片怎么修复清晰?快来看看这两个方法
  15. C# 如何取得本机网卡的型号,IP地址,子网掩码和网关
  16. python断网重联_Python实现WiFi断线自动重连的方法详解
  17. HttpClient模块的HttpGet和HttpPost及Connection to refuse解决
  18. maven下载依赖提示系统找不到指定路径的问题
  19. AUTOCAD2008注册
  20. Django 表单验证之自定义表单验证器

热门文章

  1. RFID标签打印机在加工制造业中的应用
  2. 没有期刊申请清华博士_清华大学不再硬性要求博士生毕业发表期刊论文,对博士有何影响?...
  3. SQLServer恢复表级数据
  4. 阿里云服务器进入黑洞怎么办?如何查看进入黑洞时间与原因
  5. Unity UWA内存优化总结列表
  6. 诺基亚N81手机密码如何解锁
  7. 浅谈NFT抵押借贷的三种模式:点对点、资金池和中心化模式
  8. win7重装win10解决错误代码0x80072F8F
  9. Android文件命名规范初版
  10. Qt5.订餐系统源代码