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基于二维数组实现的数独问题示例
(0)

相关推荐

  • java使用回溯法求解数独示例

    复制代码 代码如下: import java.util.Calendar;import java.util.Date; public class Matrix { private int matrix[][]; private long timeAfter=0;  private long timeBefore =0; public Matrix(int m[][]) {  matrix = new int[9][9];  for (int i=0; i<9 ; i++)   for(int j

  • 简单实现java数独游戏

    本文实例为大家分享了java数独游戏的具体代码,供大家参考,具体内容如下 打算把javaFx需要的组件装好以后直接用javaFx的,但似乎eclipse的版本不对,安装了也不能用... 数独代码是在之前寒假受命写的,学了一个月java的成果,现在看来有些不足但毕竟是第一个程序,就直接放上来,数独终盘的实现直接用了暴力,时间复杂度有点高,懒得改了直接放代码 终盘实现: import java.util.Random; public class SudokuPuzzleGenerator { pri

  • java旋转二维数组实例

    本文实例讲述了java旋转二维数组的操作,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package test; /*  *     1    2    3    4    5     *    16    17    18    19    6     *    15    24    25    20    7     *    14    23    22    21    8     *    13    12    11    10    9  *  *    写一

  • Java编程中二维数组的初始化和基本操作实例

    Java二维数组的声明和初始化 1.二维数组可以看成以数组为元素的数组: 2.Java中二维数组的声明和初始化应按照从高维到低维的顺序进行. 实例: 静态初始化: Array2.java: 程序代码 public class Array2 { public static void main(String args[]) { int a[][] = {{1,2},{3,4,5,6},{7,8,9}} ; for(int i=0 ; i <a.length ; i++) { for(int j=0

  • Java实现顺时针输出螺旋二维数组的方法示例

    最近看到一道有点意思的逻辑算法题,便着手实现一下.题目是要求打印 出N*N顺时针螺旋数组,规律如下: // 1 2 3 4 5 // 16 17 18 19 6 // 15 24 25 20 7 // 14 23 22 21 8 // 13 12 11 10 9 Java 实现示例代码如下: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new

  • java 二维数组矩阵乘法的实现方法

    复制代码 代码如下: public interface IMatrixMultiple {     public int[][] mmltiple(int[][]a ,int [][]b); } ?public class MatrixMultiple implements IMatrixMultiple { @Override    public int[][] mmltiple(int[][] a, int[][] b) {         int [][] result = new int

  • java版数独游戏界面实现(二)

    本文实例为大家分享了java版数独游戏界面实现的具体代码,供大家参考,具体内容如下 实现效果图: 这里写图片描述 主函数用于启动程序: package hlc.shudu.app; import hlc.shudu.src.ShuduHelper; import hlc.shudu.ui.ShuduMainFrame; public class AppStart { public static void main(String[] args) { ShuduMainFrame mainFrame

  • Java基于二维数组实现的数独问题示例

    本文实例讲述了Java基于二维数组实现的数独问题.分享给大家供大家参考,具体如下: 这里利用Java二维数组实现数独问题. (1)生成简易数独 (2)生成数独问题** 代码 import java.util.Random; import java.util.ArrayList; public class Suduku { /** *打印二维数组,数独矩阵 */ public static void printArray(int a[][]) { for (int i = 0; i < 9; i+

  • Java实现解数独的小程序

    前言 数独相信很多人都玩过,趣味性很强,十分的耐玩.可有没有程序员想过玩实现一个数独布局的算法呢?算法是个很有意思,很神奇的东西. 算法如下,需要预先给出几个固定的值,目前解决的一个最难的数独是大概26个已知值的情况,理论上应该能解决任意已知值的数独,不过不知道会不会迭代栈溢出--因为在26个已知值的情况下就迭代了3000多次了,囧~~~ 结果显示如下: 这是已知值: 1 1 2 1 4 8 1 5 5 1 6 1 1 7 7 1 8 3 2 1 1 2 2 6 2 4 4 3 5 9 3 7

  • java数独游戏完整版分享

    本文实例为大家分享了java数独游戏的具体代码,供大家参考,具体内容如下 自己写的数独游戏,共9关,代码如下: 1.DoShudu类用于产生数独数组 import java.util.Random; public class DoShudu { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[][] cells=newshudu(); //ce

随机推荐