之前学习javascript时用javascript写过一个数独游戏,最近看了一点java的内容,于是就心血来潮想搞一个java版的数独游戏。

现在将全部代码分享出来和大家学习交流,当然代码中有着各种各样的问题和不足之处,望各位朋友批评指点。

以下是生成数独地图的核心算法,算法不是很好,也是之前参考过网上的一些思想:

package hlc.shudu.src;

/*

* 数独的帮助类,里面提供数据所需的所有算法

*/

public class ShuduHelper {

//数独地图数组

private static int[][] maps = new int[9][9];

//每个小九宫格可放置位置的数

private static int[] canPutSum = new int[9];

//用来存储之前放置过的位置

static int[] used = new int[9];

//是否已经完成地图的生成

static boolean isOk = true;

/*

* 得到数独地图数组

*/

public static int[][] getMap() {

//判断是否已经完成地图的生成,要是没有完成就重新生成。

//从这里就可以看出算法还有待优化,如果回溯的好的话就一直可以通过回溯来重新生成,而这里是通过重新执行生成算法来重新生成。希望感兴趣的朋友可以去实现以下。

do{

isOk = true;

initMaps();

}while(!isOk);

return maps;

}

/*

* 初始化maps

*/

private static void initMaps() {

// 初始化地图数组中没有填入任何数字

for (int i = 0; i < 9; i++) {

for (int j = 0; j < 9; j++) {

maps[i][j] = -1;

}

}

// 依次填入1~9

for (int num = 1; num <= 9; num++) {

for (int i = 0; i < 9; i++) {

used[i] = -1;

canPutSum[i] = -1;

}

// 遍历大九宫格中的每个小九宫格

for (int i = 0; i < 9; i++) {

if (canPutSum[i]==-1) {

canPutSum[i] = getCanPutSum(i, num);

}

if (canPutSum[i]==1) {

used[i] = -1;

}

if (canPutSum[i] == 0) {

canPutSum[i] = -1;

used[i] = -1;

// 如果当前小九宫格中不能放入数字num,则回到前一个小九宫格

if (i > 0) {

// 将前一个九宫格中放num的位置清空

if (used[i-1]!=-1) {

//maps[(int) (Math.floor(used[i-1]/3)+Math.floor((i-1)/3)*3)][used[i-1]%3+((i-1)%3)*3]=-1;

clearNum(i - 1, num);

}

// i回退一个,因为等会for循环灰给i加一,所以这里减2

i -= 2;

continue;

} else {

isOk = false;

return;

}

} else {

// 将num放入当前小九宫格中

boolean flag = false;

while (!flag) {

int j = (int) (Math.random() * 9);

// 当前小方格横坐标

int ii = (i / 3) * 3 + j / 3;

// 当前小方格纵坐标

int jj = (i % 3) * 3 + j % 3;

//System.out.println("num:"+num+"\tii:"+ii+"\tjj:"+jj);

// 如果可以放置num则放置

if (maps[ii][jj] == -1 && j!=used[i] && isCanPut(ii, jj, num)) {

maps[ii][jj] = num;

used[i] = j;

canPutSum[i] -= 1;

flag = true;

}

}

}

}

}

}

/*

* 清空第i个小九宫格中的num

*/

private static void clearNum(int i, int num) {

for (int j = 0; j < 9; j++) {

// 当前小方格横坐标

int ii = (i / 3) * 3 + j / 3;

// 当前小方格纵坐标

int jj = (i % 3) * 3 + j % 3;

// 判断当前小方格是否可以放置

if (maps[ii][jj] == num) {

maps[ii][jj] = -1;

}

}

}

/*

* 得到当前小九宫格可以放入数字num的位置数目

*/

private static int getCanPutSum(int i, int num) {

int sum = 0;

// 遍历小九宫格

for (int j = 0; j < 9; j++) {

// 当前小方格横坐标

int ii = (i / 3) * 3 + j / 3;

// 当前小方格纵坐标

int jj = i % 3 * 3 + j % 3;

// 判断当前小方格是否可以放置

if (maps[ii][jj] == -1 && isCanPut(ii, jj, num)) {

++sum;

}

}

return sum;

}

/*

* 指定横纵坐标点是否可以放置num

*/

private static boolean isCanPut(int ii, int jj, int num) {

// 判断指定坐标点的同行或同列是否有相同数字,要是有则为false

for (int i = 0; i < 9; i++) {

if (maps[ii][i] == num) {

return false;

}

if (maps[i][jj] == num) {

return false;

}

}

return true;

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java 数独算法_java版数独游戏核心算法(一)相关推荐

  1. 数独java界面基础_java版数独游戏界面实现(二)

    本文实例为大家分享了java版数独游戏界面实现的具体代码,供大家参考,具体内容如下 实现效果图: 这里写图片描述 主函数用于启动程序: package hlc.shudu.app; import hl ...

  2. 横版java_Project4 自己用java写的横版格斗游戏 功能还不是很复杂 可以作为参考~ Other Games 其他 238万源代码下载- www.pudn.com...

    文件名称: Project4下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 5963 KB 上传时间: 2013-07-17 下载次数: 4 提 供 者: lyk ...

  3. 吴昊品游戏核心算法 Round 16 ——吴昊教你玩口袋妖怪 第三弹 地洞谜题

    这样的场景我们应该经常遇到的吧,哈哈! 口袋妖怪的地洞要算是最令人讨厌的了,因为,有些地洞是全黑的,你即使用了闪光灯(必选道具#03),你有时也只能用GBA外壳的荧光屏作为道具才能将整个地洞看清楚. ...

  4. 区块链技术六大核心算法,读懂六大核心算法就变成区块链专家

    区块链技术六大核心算法,读懂六大核心算法就变成区块链专家 近日,在加密货币经历"混乱时期"后,区块链再次火爆起来,受到了各方的极大关注与重视,成为资本市场和各领域关注的焦点,就连朋 ...

  5. java控制台扫雷_java实现扫雷游戏控制台版

    本文实例为大家分享了java实现扫雷游戏控制台版,供大家参考,具体内容如下 扫雷游戏 a.游戏的分析 在游戏中需要存在对象包含哪些. 格子对象(grid): 属性:内容(content).状态(typ ...

  6. 吴昊品游戏核心算法 Round 16 —— 吴昊教你玩口袋妖怪 第四弹 拉帝亚斯?!拉帝欧斯?!...

    作为讲述口袋妖怪的Round 16,这里,我会采用"夹叙夹议,夹议夹叙"的模式进行编排.也就是在议论一些口袋妖怪中的小游戏的核心算法的同时,叙述一下我对口袋妖怪的理解以及我与这一系 ...

  7. java 算法_Java 浅谈数据结构和算法

    以前不管自己还是朋友在面试java工程师岗位的时候,都会被问到这样的问题: "介绍下java中的数据结构和算法". 很多朋友被问到的时候发现无从下口,甚至特别是一些初级java工程 ...

  8. java合并排序_Java中的合并排序算法

    合并排序算法是一种分而治之的算法.在分而治之的范式中,一个问题被分解成较小的问题,其中每个小问题仍然保留着大问题的所有属性--大小除外.为了解决原始问题,每个部分都是单独解决的,然后这些部分又合并在一 ...

  9. java 红包算法_JAVA实现拼手气红包算法

    实现拼手气红包算法,有以下几个需要注意的地方: 抢红包的期望收益应与先后顺序无关 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如 ...

最新文章

  1. dos与ddos攻击原理
  2. matplotlib 均值_干货|教你一文掌握:Matplotlib+Seaborn可视化
  3. php str cmp,php中整数的strcmp equivalent(intcmp)
  4. 初一模拟赛(4.27)
  5. hibernate脏数据_Hibernate脏检查的剖析
  6. Python之list对应元素求和
  7. C# 匿名方法及Lambda表达式
  8. jquery中单选选中及清除选中状态
  9. python自动下载酷狗音乐_python实现酷狗音乐mp3下载
  10. 心理测量学信度计算机试题,心理测量学试题及答案
  11. 利用 cookie,实现在html页面 记住我 功能
  12. 大学计算机专业课教师听课评语,教师听课评语
  13. 有别于普通专线的BGP线路
  14. mysql指定取值范围_MySQL中各种字段的取值范围(转)
  15. 视频号带货优势有哪些?普通人为什么要做视频号:国仁楠哥
  16. C++笔记 char
  17. tomcat配置url跳转_Tomcat
  18. 电流传感器测试系统1000A/us级上升沿
  19. 今日金融词汇---网格交易,是什么?
  20. 认沽期权是什么意思:认沽期权怎么交易

热门文章

  1. azure云 试用_真实世界的云迁移:Azure前门,用于全局HTTP和基于路径的负载平衡
  2. 【每天更新】2022年最新WordPress主题下载,外贸独立站商城/企业网站/个人博客模板 2022-5-16
  3. 琐碎打包工具_让我们停止琐碎的设计工作
  4. 基于精益生产的车间设施规划改善设计(zt)
  5. 酷播v4.0免费播放器最新最简短代码范例
  6. IMU(惯性测量单元)学习
  7. 大一下学期.学期总结
  8. 微信小程序开放「分享到朋友圈」功能
  9. Popover 弹出框内容动态撑开溢出
  10. 将excel文件另存为csv文件