- 浏览: 461021 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ty1972873004:
sunwang810812 写道我运行了这个例子,怎么结果是这 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
lgh1992314:
simpleDean 写道请问,Logger.setLevel ...
Java内置Logger详解 -
sunwang810812:
我运行了这个例子,怎么结果是这样的:2号车泊车6号车泊车5号车 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
jp260715007:
nanjiwubing123 写道参考你的用法,用如下方式实现 ...
面试题--三个线程循环打印ABC10次的几种解决方法 -
cb_0312:
SurnameDictionary文章我没看完,现在懂了
中文排序
前面两篇博文介绍了数独终盘生成的两种方法。
Swing数独游戏(一):终盘生成之矩阵转换法 ==> http://mouselearnjava.iteye.com/blog/1941483
Swing数独游戏(二):终盘生成之随机法 ==> http://mouselearnjava.iteye.com/blog/1941693
拥有了数独终盘之后,我们需要在这个终盘上挖去一些数字,然后就能产生数独难题。
在这篇博文中将简单介绍一下“挖洞”法生成数独难题的方式,并采用随机挖洞的方式,对同一份数独终盘产生不同难度的数独难题。
“挖洞”的方式可以有多种实现,一般有四种方式:
参考自:http://zhangroup.aporc.org/images/files/Paper_3485.pdf
本文采用随机法来实现。
生成的步骤如下:
1. 首先采用前面两篇文章提供的产生数独终盘的方式,产生1000个.txt文件,作为每一关关卡的数独终盘。
Swing数独游戏(一):终盘生成之矩阵转换法 ==> http://mouselearnjava.iteye.com/blog/1941483
Swing数独游戏(二):终盘生成之随机法 ==> http://mouselearnjava.iteye.com/blog/1941693
2. 每个数独终盘由9个 3 * 3 的块组成,根据设定的关卡难度随机产生一个适合关卡难度的随机数,比如5, 然后在某个 3*3的块中随机剔除5个数。
剔除数据的位置记为1,代表这个位置没有数字,用户可以输入数字。保留数字的位置记为0, 用于在页面上显示出数字,但用户不能对其进行修改操作。
比如:
我们可以定义游戏难度为四个等级:简单,中等,困难和非常困难。
定义每个困难等级随机数剔除数据的数目:
简单 --> [4,5]
中等 --> [5,6]
困难 --> [5,8]
非常困难 --> [6,9]
3. 根据关卡的数独终盘及其根据困难等级随机挖空某些数据产生的文件一起,共同确定数独难题
比如,第一关对应的数独终盘如下图所示,终盘内容存储在文件1.txt中。
结合为简单难度产生的“挖洞”后的文件,生成对应的数独难题:
这样一来,不同困难难度的数独难题就产生了,一个关卡,根据剔除数据个数的不同,将为每个困难等级产生一个挖洞文件,也就是有四个数独难题。如果随机产生1000个数独终盘,那么玩家可以玩4000个数独题目,每个困难等级1000个关卡可供选择。
总结:
本篇文章使用简单的随机剔除数据的方法去产生数独难题,这个方法比较方便简单。但是并不能保证解的唯一性,也就是一道数独难题可能拥有超过一个解法。如果用户填入的数据都满足数独条件,那么他的解就是可用的,有效的,可以通过该关卡。
另外随机剔除数据可能没有剔除某些数据的关联性,可能使得尽管剔除的数据不少,但是玩起来并不难的情况。
下面是随机剔除数据的一个工具类:
Swing数独游戏(一):终盘生成之矩阵转换法 ==> http://mouselearnjava.iteye.com/blog/1941483
Swing数独游戏(二):终盘生成之随机法 ==> http://mouselearnjava.iteye.com/blog/1941693
拥有了数独终盘之后,我们需要在这个终盘上挖去一些数字,然后就能产生数独难题。
在这篇博文中将简单介绍一下“挖洞”法生成数独难题的方式,并采用随机挖洞的方式,对同一份数独终盘产生不同难度的数独难题。
“挖洞”的方式可以有多种实现,一般有四种方式:
参考自:http://zhangroup.aporc.org/images/files/Paper_3485.pdf
本文采用随机法来实现。
生成的步骤如下:
1. 首先采用前面两篇文章提供的产生数独终盘的方式,产生1000个.txt文件,作为每一关关卡的数独终盘。
Swing数独游戏(一):终盘生成之矩阵转换法 ==> http://mouselearnjava.iteye.com/blog/1941483
Swing数独游戏(二):终盘生成之随机法 ==> http://mouselearnjava.iteye.com/blog/1941693
2. 每个数独终盘由9个 3 * 3 的块组成,根据设定的关卡难度随机产生一个适合关卡难度的随机数,比如5, 然后在某个 3*3的块中随机剔除5个数。
剔除数据的位置记为1,代表这个位置没有数字,用户可以输入数字。保留数字的位置记为0, 用于在页面上显示出数字,但用户不能对其进行修改操作。
比如:
我们可以定义游戏难度为四个等级:简单,中等,困难和非常困难。
定义每个困难等级随机数剔除数据的数目:
简单 --> [4,5]
中等 --> [5,6]
困难 --> [5,8]
非常困难 --> [6,9]
/** * 根据不同的游戏难度,获取随机数 */ public int getRandomNumberByLevel(DifficultyLevel level) { int randomValue = 5; switch (level) { case EASY: /** * 产生随机数[4,5] */ randomValue = random.nextInt(2) + 4; break; case MEDIUM: /** * 产生随机数[5,6] */ randomValue = random.nextInt(2) + 5; break; case DIFFICULT: /** * 产生随机数[5,8] */ randomValue = random.nextInt(4) + 5; break; case EVIL: /** * 产生随机数[6,9] */ randomValue = random.nextInt(4) + 6; break; default: break; } return randomValue; }
3. 根据关卡的数独终盘及其根据困难等级随机挖空某些数据产生的文件一起,共同确定数独难题
比如,第一关对应的数独终盘如下图所示,终盘内容存储在文件1.txt中。
结合为简单难度产生的“挖洞”后的文件,生成对应的数独难题:
- 简单难度==>
- 中等难度==>
- 困难难度==>
同理可以获得中等难度,困难难度等对应的数独难题。
这样一来,不同困难难度的数独难题就产生了,一个关卡,根据剔除数据个数的不同,将为每个困难等级产生一个挖洞文件,也就是有四个数独难题。如果随机产生1000个数独终盘,那么玩家可以玩4000个数独题目,每个困难等级1000个关卡可供选择。
总结:
本篇文章使用简单的随机剔除数据的方法去产生数独难题,这个方法比较方便简单。但是并不能保证解的唯一性,也就是一道数独难题可能拥有超过一个解法。如果用户填入的数据都满足数独条件,那么他的解就是可用的,有效的,可以通过该关卡。
另外随机剔除数据可能没有剔除某些数据的关联性,可能使得尽管剔除的数据不少,但是玩起来并不难的情况。
下面是随机剔除数据的一个工具类:
package my.sudoku.utils; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Random; import java.util.logging.Logger; import my.sudoku.constant.SudokuContants; import my.sudoku.enums.DifficultyLevel; public class HoleDigUtils { private static final Logger logger = Logger .getLogger("my.sudoku.utils.HoleDigUtils"); private Random random = new Random(); public void digHolesByGameDifficulty(int numOfFiles, DifficultyLevel level) { for (int num = 1; num <= numOfFiles; num++) { int[][] array = new int[9][9]; int randomInt = 0; for (int i = 0; i < 9; i++) { randomInt = getRandomNumberByLevel(level); int[] randomPositions = populateRandomArray(randomInt); for (int j = 0; j < randomPositions.length; j++) { int col = (i % 3) * 3 + (randomPositions[j] - 1) % 3; int row = (i / 3) * 3 + ((randomPositions[j] - 1) / 3); array[row][col] = 1; } /** * 将array写入文件 */ BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(new File( SudokuContants.SUDOKU_FOLDER_NAME, buildFileName( level, num)))); } catch (IOException e) { logger.severe(e.getMessage()); } StringBuilder sb = new StringBuilder(); for (int k = 0; k < 9; k++) { sb.setLength(0); for (int j = 0; j < 9; j++) { sb.append(array[k][j]); sb.append(","); } try { bw.write(sb.substring(0, sb.length() - 1).toString()); bw.newLine(); } catch (IOException e) { logger.severe(e.getMessage()); } } if (bw != null) { try { bw.close(); } catch (IOException e) { logger.severe(e.getMessage()); } finally { bw = null; } } } } } private String buildFileName(DifficultyLevel level, int fileNumberl) { StringBuilder sb = new StringBuilder(); sb.append(fileNumberl); switch (level) { case EASY: sb.append("_easy.txt"); break; case MEDIUM: sb.append("_medium.txt"); break; case DIFFICULT: sb.append("_difficult.txt"); break; case EVIL: sb.append("_evil.txt"); break; default: break; } return sb.toString(); } /** * 根据不同的游戏难度,获取随机数 */ public int getRandomNumberByLevel(DifficultyLevel level) { int randomValue = 5; switch (level) { case EASY: /** * 产生随机数[4,5] */ randomValue = random.nextInt(2) + 4; break; case MEDIUM: /** * 产生随机数[5,7] */ randomValue = random.nextInt(3) + 5; break; case DIFFICULT: /** * 产生随机数[5,8] */ randomValue = random.nextInt(4) + 5; break; case EVIL: /** * 产生随机数[6,9] */ randomValue = random.nextInt(4) + 6; break; default: break; } return randomValue; } private int[] populateRandomArray(int numOfRandoms) { int[] array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int randomInt = 0; for (int i = 0; i < 20; i++) { randomInt = random.nextInt(8) + 1; int temp = array[0]; array[0] = array[randomInt]; array[randomInt] = temp; } int[] result = new int[numOfRandoms]; System.arraycopy(array, 0, result, 0, numOfRandoms); return result; } public static void main(String[] args) throws IOException { HoleDigUtils digger = new HoleDigUtils(); /** * 采用"挖洞"法,产生不同难度的数独难题文件。 * 文件中 0 表示 有数据且不可编辑,1 表示不显示数据,且可编辑 */ for (DifficultyLevel level : DifficultyLevel.values()) { digger.digHolesByGameDifficulty( SudokuContants.NUMBER_OF_SUDOKU_ARRAYS, level); } } }
发表评论
-
工厂类中移除if/else语句
2016-07-10 19:52 862面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6676本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2183本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1697尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2666本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2113正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3709本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1927问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3951题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3126题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8715EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3292题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6670面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9810Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1381个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2108从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7366for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4082本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2848本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
数独游戏技巧:1~9九宫格数独口诀和解题技巧心得分享.doc
数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏数独游戏...
数独游戏 构建一个构建一个数独游戏是一个很有趣的项目!你可以使用Python来实现这个游戏,并且可以通过Django构建一个Web界面,让用户可以在线玩游戏。以下是一个基本的设计思路: 1. **生成数独谜题**: 开始时,...
几何数独游戏,微博[@屠龙的胭脂](https://weibo.com/1852299857?refer_flag=1001030103_)所介绍[几何数独游戏视频介绍](https://video.weibo.com/show?fid=1034:4737961351381034)同款。源码在:[蛇蛇数独游戏源...
java课程设计作业——基于java+swing构建的数独小游戏(源码+资源文件) 编程语言:java 界面绘制:swing IDE:MyEclipse,IDEA java课程设计作业——基于java+swing构建的数独小游戏(源码+资源文件) 编程语言...
是08年的美国数学建模比赛一等奖,里面的是介绍了挖洞思想的数独生成游戏算法。
数独游戏终结者 不要再为数独游戏而纠结了 只要一输入 答案马上给出 当之无愧的数独游戏"终结者
java数独生成算法及基于此算法的android数独游戏APK
用c#写了一个能够随机生成唯一解的数独游戏,很多其他人的都不是随机生成,而且也不能保证生成的数独表的解是唯一的,所以我自己写了一个可以随机生成唯一解的数独游戏,上传上来和大家一起学习学习,看看算法还有...
微信小程序 小游戏类 数独小游戏 (源代码+截图)微信小程序 小游戏类 数独小游戏 (源代码+截图)微信小程序 小游戏类 数独小游戏 (源代码+截图)微信小程序 小游戏类 数独小游戏 (源代码+截图)微信小程序 小...
Python数独游戏源代码、源程序共包括两个程序文件:main.py及build.py
数独游戏数独游戏数独游戏数独游戏
使用对话框创建数独游戏 主要含有以下模块:数独生成 数独判断 数独求解 数独生成方法:先填充一个完整的数独,再去掉若干个构成游戏初始界面 算法运行效率极高
学习了Mars老师的数独游戏教程,奈何题库太单调,于是查找资料,增加了难度选择自动生成题库功能,游戏胜利后会弹框提示
介绍:用C#开发的数独游戏 核心:核心代码是从网上借鉴来的, 价值:仅供娱乐和学习参考。 用途:大家开心就好
6.在某日早上,在地铁时代报上看到数独游戏,就想在网页上做一个试试 百度google了下生成算法,没有发现有效的生成算法,很多是随机回滚类型[还有错误的算法。。。] 在纸上随意写写,排排,发现还有个简单的生成数独...
JAVA的数独游戏代码,随机生成数独,如果有三个难度可选
1、常规回溯方法2、以宫为单位的矩阵置换法3、以数字顺序的以宫为单位的回溯法4、以某一数独为基础的数字替换法1、常规回溯方法这种方法是最容易想到的, 但是执行效
excel为数独9宫格自动生成版本。下载excel后,打开下方的sheet1,即为九宫格题目,复制到word内打印即可。 详细说明: 1.更改sheet2内的A1单元格内的数字(范围1-9),可以调节数独的难度,1难度最低,9难度最高,...