转载自IT学习社区:http://bbs.itcast.cn/thread-6273-1-1.html
作者:梁桐
无聊时偶尔会玩一玩益智类游戏。有一种游戏叫“数独”,满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复
突发奇想,使用Java基础编写一个自己的获得数独数据小程序。
- package cn.itcast;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Random;
- public class SudokuTest2 {
- public static void main(String[] args) {
- //数组
- int[][] soduku = new int[9][9];
- //生成数据
- getData(soduku);
- // print(soduku);
- //修改数据
- changeData(soduku);
- //打印
- print(soduku);
- // System.out.println(getValueList());
- }
- private static int currentCount; //当前循环次数
- /**
- * 修改内容
- * @param soduku
- */
- private static void changeData(int[][] soduku) {
- //获得一个数字
- for(int m = 0 ; m < soduku.length ; m ++){
- lineNumList = getValueList(); //随机生成数据
- //获得一行数据
- currentCount = 0;
- for(int i = 0 ; i < lineNumList.size() ; i ++){
- int num = lineNumList.get(i);
- //查询是否已经使用,当前之前
- if(findHasValue(soduku,m,i,num)){
- //将当前添加到最后
- lineNumList.add(lineNumList.remove(i));
- i--;
- if(currentCount > lineNumList.size()){ //数据不符合
- m--; //重新来
- break;
- }
- currentCount ++;
- continue;
- }
- //交换与之后的
- changeValue(soduku,m,i,num);
- }
- // System.out.println(m + " ## " + lineNumList);
- // print(soduku);
- }
- }
- private static void changeValue(int[][] soduku, int currentRow, int currentCols, int num) {
- int endRow = (currentRow / 3 + 1) * 3;
- int endCols = (currentCols / 3 + 1) * 3;
- for(int i = currentRow ; i < endRow ; i ++){
- int startCols = currentCols / 3 * 3;
- if(i == currentRow){
- startCols = currentCols;
- }
- for(int j = startCols ; j < endCols ; j ++){
- int temp = soduku[i][j];
- if(temp == num){
- soduku[i][j] = soduku[currentRow][currentCols];
- soduku[currentRow][currentCols] = temp;
- }
- }
- }
- }
- /**
- * 查询当前的之前是否使用过num
- * @param soduku
- * @param currentRow
- * @param currentCols
- * @param num
- * @return
- */
- private static boolean findHasValue(int[][] soduku, int currentRow, int currentCols, int num) {
- return findAreaValue(soduku, currentRow, currentCols, num)
- || findRowValue(soduku, currentRow, currentCols, num)
- || findColsValue(soduku, currentRow, currentCols, num);
- }
- /**
- * 当前行查询
- * @param soduku
- * @param currentRow
- * @param currentCols
- * @param num
- * @return
- */
- private static boolean findRowValue(int[][] soduku, int currentRow, int currentCols, int num) {
- for(int i = 0 ; i < currentCols ; i++ ){
- int exists = soduku[currentRow][i];
- if(exists == num ){
- return true;
- }
- }
- return false;
- }
- /**
- * 当前列查询
- * @param soduku
- * @param currentRow
- * @param currentCols
- * @param num
- * @return
- */
- private static boolean findColsValue(int[][] soduku, int currentRow, int currentCols, int num) {
- for(int i = 0 ; i < currentRow ; i ++){
- int exists = soduku[i][currentCols];
- if(exists == num){
- return true;
- }
- }
- return false;
- }
- /**
- * 当前区域查询
- * @param soduku
- * @param currentRow
- * @param currentCols
- * @param num
- * @return
- */
- private static boolean findAreaValue(int[][] soduku, int currentRow, int currentCols, int num) {
- //currentRow 1 currentCols 5
- int startRow = currentRow / 3 * 3; //3
- int startCols = currentCols / 3 * 3;
- for(int i = startRow ; i <= currentRow ; i ++ ){ // 345
- int cols = startCols + 3;
- if(i == currentRow){
- cols = currentCols;
- }
- for(int j = startCols ; j < cols ; j ++) {
- int exists = soduku[i][j];
- if(exists == num){
- return true;
- }
- }
- }
- return false;
- }
- /**
- * 生成数据
- * @param soduku
- */
- private static void getData(int[][] soduku) {
- for(int m = 0 ; m < 9 ; m ++){
- for(int n = 0 ; n < 9 ; n ++){
- soduku[m][n] = (m % 3) * 3 + (n % 3) + 1 ;
- }
- }
- }
- private static List<Integer> lineNumList;
- private static List<Integer> getValueList(){
- Random random = new Random();
- List<Integer> list = new ArrayList<Integer>();
- while(list.size() < 9){
- //保证行数据唯一
- int num = random.nextInt(10);
- if(!list.contains(num) && num > 0){
- list.add(num);
- }
- }
- return list;
- }
- /**
- * 输出
- * @param soduku
- */
- private static void print(int[][] soduku) {
- for(int m = 0 ; m < 9 ; m ++){
- for(int n = 0 ; n < 9 ; n ++){
- System.out.print(soduku[m][n]);
- if( ( (n + 1) % 3 == 0 ) && n < 8 ){
- System.out.print(" | ");
- }
- }
- if( ( (m + 1) % 3 == 0 ) && m < 8){
- System.out.println();
- for(int i = 0 ; i < 15 ; i ++){
- System.out.print("-");
- }
- }
- System.out.println();
- }
- System.out.println("#############");
- }
- }
相关推荐
最近几天,在学习java。编写了一个数独小游戏。源代码
微信小程序源码-数独小游戏.zip微信小程序源码-数独小游戏.zip微信小程序源码-数独小游戏.zip微信小程序源码-数独小游戏.zip微信小程序源码-数独小游戏.zip微信小程序源码-数独小游戏.zip微信小程序源码-数独小游戏....
基于JS的微信小程序游戏-数独小游戏.zip 基于JS的微信小程序游戏-数独小游戏.zip 基于JS的微信小程序游戏-数独小游戏.zip 基于JS的微信小程序游戏-数独小游戏.zip 基于JS的微信小程序游戏-数独小游戏.zip 基于JS的...
java数独生成算法及基于此算法的android数独游戏APK
主要思想:用二维数组表示数独,将为0的下标用一维数组表示,从小到大依次试探每一个可能的数,填充,若皆不可能,则回退到上一个数从上一个数的可能值+1开始,同时将以后的数重新置为0,特别注意的是,回退后求得解...
c++趣味编程------数独 无解释 可以自己改代码 无bug
数独算法Java版。 有注释。 编译已过。
Jav小游戏---数独
这是一个微信小程序项目源码,是经典怀旧的数独游戏, 数独游戏逻辑非常简单,能训练大脑和观察能力,适合新手入门参考学习。 相关指导教程请看作者发表的文章 ...
可以根据设置不同难度生成9x9数独题
练习一下算法 , 可以在控制台显示试数的过程 ,缓解一下紧张的神经和精神。答案在第49557次试数,也许有多个结果,不过我没耐心等待。
这是一个h5或小程序,是经典怀旧的数独游戏,是uniapp项目源码,用HBuilderX开发工具编写而成, 数独游戏逻辑非常简单,能训练大脑和观察能力,适合新手入门参考学习。 相关指导教程请看作者发表的文章 ...
关于数独的算法有很多种,最基本的有基拙挖掘法,唯一解法,侯选数置换法.查了很多资料但都没有找到完整的算法实现.花了30块银子到当当网上买了编程之美>>找到其中的章节,看完之后大失所望.其中的算法实现藏头露尾,...
java课程设计作业——基于java+swing构建的数独小游戏(源码+资源文件) 编程语言:java 界面绘制:swing IDE:MyEclipse,IDEA java课程设计作业——基于java+swing构建的数独小游戏(源码+资源文件) 编程语言...
JAVA的数独游戏代码,随机生成数独,如果有三个难度可选
游戏 - 数独 游戏算法 手机游戏 游戏下载 源代码
制作了一个简单的数独游戏,使用了非递归的算法数独结果。
JavaScript应用实例-数独算法.js
算法分析,源码都在里面。该文件是一篇被收录的论文。
Java版的数独, 程序设计良好,能够运行,希望对学习回溯法的同学有所帮助哦