java版数独游戏核心算法(一)
时间:2019-04-11
本文章向大家介绍java版数独游戏核心算法(一),主要包括java版数独游戏核心算法(一)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
之前学习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; } }
完整程序包可在GitHub上下载:https://github.com/houlongchao/s
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Python办公自动化|批量提取Excel数据
- 3分钟短文 | 有挑战!PHP用1个函数实现post请求,你用哪个?
- linux 磁盘管理
- linux 安装各个版本nodejs
- python3 使用cookie模拟post实现修改活码内容
- VIM 创建程序文件自动添加头部注释
- 【简记】Linux 计划任务 Crontab
- VS Code 免密登录Linux服务器
- Linux部署私钥实现免密登录
- 搭建Jenkins+tomcat+maven+Gitlab持续部署/回滚系统
- Java--注解
- 如何在 Ubuntu 20.04 上安装 Jenkins
- 在 Linux 下如何检查内存使用率
- 3分钟短文 | MySQL存时间,到底该用timestamp还是datetime?
- js中class的继承的基础用法