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;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java 数独算法_java版数独游戏核心算法(一)相关推荐
- 数独java界面基础_java版数独游戏界面实现(二)
本文实例为大家分享了java版数独游戏界面实现的具体代码,供大家参考,具体内容如下 实现效果图: 这里写图片描述 主函数用于启动程序: package hlc.shudu.app; import hl ...
- 横版java_Project4 自己用java写的横版格斗游戏
功能还不是很复杂
可以作为参考~ Other Games 其他 238万源代码下载- www.pudn.com...
文件名称: Project4下载 收藏√ [ 5 4 3 2 1 ] 开发工具: Java 文件大小: 5963 KB 上传时间: 2013-07-17 下载次数: 4 提 供 者: lyk ...
- 吴昊品游戏核心算法 Round 16 ——吴昊教你玩口袋妖怪 第三弹 地洞谜题
这样的场景我们应该经常遇到的吧,哈哈! 口袋妖怪的地洞要算是最令人讨厌的了,因为,有些地洞是全黑的,你即使用了闪光灯(必选道具#03),你有时也只能用GBA外壳的荧光屏作为道具才能将整个地洞看清楚. ...
- 区块链技术六大核心算法,读懂六大核心算法就变成区块链专家
区块链技术六大核心算法,读懂六大核心算法就变成区块链专家 近日,在加密货币经历"混乱时期"后,区块链再次火爆起来,受到了各方的极大关注与重视,成为资本市场和各领域关注的焦点,就连朋 ...
- java控制台扫雷_java实现扫雷游戏控制台版
本文实例为大家分享了java实现扫雷游戏控制台版,供大家参考,具体内容如下 扫雷游戏 a.游戏的分析 在游戏中需要存在对象包含哪些. 格子对象(grid): 属性:内容(content).状态(typ ...
- 吴昊品游戏核心算法 Round 16 —— 吴昊教你玩口袋妖怪 第四弹 拉帝亚斯?!拉帝欧斯?!...
作为讲述口袋妖怪的Round 16,这里,我会采用"夹叙夹议,夹议夹叙"的模式进行编排.也就是在议论一些口袋妖怪中的小游戏的核心算法的同时,叙述一下我对口袋妖怪的理解以及我与这一系 ...
- java 算法_Java 浅谈数据结构和算法
以前不管自己还是朋友在面试java工程师岗位的时候,都会被问到这样的问题: "介绍下java中的数据结构和算法". 很多朋友被问到的时候发现无从下口,甚至特别是一些初级java工程 ...
- java合并排序_Java中的合并排序算法
合并排序算法是一种分而治之的算法.在分而治之的范式中,一个问题被分解成较小的问题,其中每个小问题仍然保留着大问题的所有属性--大小除外.为了解决原始问题,每个部分都是单独解决的,然后这些部分又合并在一 ...
- java 红包算法_JAVA实现拼手气红包算法
实现拼手气红包算法,有以下几个需要注意的地方: 抢红包的期望收益应与先后顺序无关 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如 ...
最新文章
- dos与ddos攻击原理
- matplotlib 均值_干货|教你一文掌握:Matplotlib+Seaborn可视化
- php str cmp,php中整数的strcmp equivalent(intcmp)
- 初一模拟赛(4.27)
- hibernate脏数据_Hibernate脏检查的剖析
- Python之list对应元素求和
- C# 匿名方法及Lambda表达式
- jquery中单选选中及清除选中状态
- python自动下载酷狗音乐_python实现酷狗音乐mp3下载
- 心理测量学信度计算机试题,心理测量学试题及答案
- 利用 cookie,实现在html页面 记住我 功能
- 大学计算机专业课教师听课评语,教师听课评语
- 有别于普通专线的BGP线路
- mysql指定取值范围_MySQL中各种字段的取值范围(转)
- 视频号带货优势有哪些?普通人为什么要做视频号:国仁楠哥
- C++笔记 char
- tomcat配置url跳转_Tomcat
- 电流传感器测试系统1000A/us级上升沿
- 今日金融词汇---网格交易,是什么?
- 认沽期权是什么意思:认沽期权怎么交易