简单实现java数独游戏

本文实例为大家分享了java数独游戏的具体代码,供大家参考,具体内容如下

打算把javaFx需要的组件装好以后直接用javaFx的,但似乎eclipse的版本不对,安装了也不能用...
数独代码是在之前寒假受命写的,学了一个月java的成果,现在看来有些不足但毕竟是第一个程序,就直接放上来,数独终盘的实现直接用了暴力,时间复杂度有点高,懒得改了直接放代码

终盘实现:

import java.util.Random; 

public class SudokuPuzzleGenerator {
 private Random random = new Random(); 

 private static final int MAX_CALL_RANDOM_ARRAY_TIMES = 220; 

 private int currentTimes = 0; 

 public int[][] generatePuzzleMatrix() { 

  int[][] randomMatrix = new int[9][9]; 

  for (int row = 0; row < 9; row++) {
   if (row == 0) {
    currentTimes = 0;
    randomMatrix[row] = buildRandomArray(); 

   } else {
    int[] tempRandomArray = buildRandomArray(); 

    for (int col = 0; col < 9; col++) {
     if (currentTimes < MAX_CALL_RANDOM_ARRAY_TIMES) {
      if (!isCandidateNmbFound(randomMatrix, tempRandomArray, row, col)) { 

       resetValuesInRowToZero(randomMatrix,row);
       row -= 1;
       col = 8;
       tempRandomArray = buildRandomArray();
      }
     } else {
      row = -1;
      col = 8;
      resetValuesToZeros(randomMatrix);
      currentTimes = 0;
     }
    }
   }
  }
  return randomMatrix;
 } 

 private void resetValuesInRowToZero(int[][] matrix, int row)
 {
  for (int j = 0; j < 9; j++) {
   matrix[row][j] = 0;
  } 

 } 

 private void resetValuesToZeros(int[][] matrix) {
  for (int row = 0; row < 9; row++) {
   for (int col = 0; col < 9; col++) {
    matrix[row][col] = 0;
   }
  }
 } 

 private boolean isCandidateNmbFound(int[][] randomMatrix, int[] randomArray, int row, int col) {
  for (int i = 0; i < 9; i++) {
   randomMatrix[row][col] = randomArray[i];
   if (noConflict(randomMatrix, row, col)) {
    return true;
   }
  }
  return false;
 } 

 private boolean noConflict(int[][] candidateMatrix, int row, int col) {
  return noConflictInRow(candidateMatrix, row, col)&&noConflictInColumn(candidateMatrix, row, col) && noConflictInBlock(candidateMatrix, row, col);
 } 

 private boolean noConflictInRow(int[][] candidateMatrix, int row, int col) { 

  int currentValue = candidateMatrix[row][col]; 

  for (int colNum = 0; colNum < col; colNum++) {
   if (currentValue == candidateMatrix[row][colNum]) {
    return false;
   }
  } 

  return true;
 } 

 private boolean noConflictInColumn(int[][] candidateMatrix, int row, int col) { 

  int currentValue = candidateMatrix[row][col]; 

  for (int rowNum = 0; rowNum < row; rowNum++) {
   if (currentValue == candidateMatrix[rowNum][col]) {
    return false;
   }
  } 

  return true;
 } 

 private boolean noConflictInBlock(int[][] candidateMatrix, int row, int col) { 

  int baseRow = row / 3 * 3;
  int baseCol = col / 3 * 3; 

  for (int rowNum = 0; rowNum < 8; rowNum++) {
   if (candidateMatrix[baseRow + rowNum / 3][baseCol + rowNum % 3] == 0) {
    continue;
   }
   for (int colNum = rowNum + 1; colNum < 9; colNum++) {
    if (candidateMatrix[baseRow + rowNum / 3][baseCol + rowNum % 3] == candidateMatrix[baseRow
      + colNum / 3][baseCol + colNum % 3]) {
     return false;
    }
   }
  }
  return true; 

 }
 private int[] buildRandomArray() {
  currentTimes++;
  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;
  } 

  return array;
 } 

 public int getCurrentTimes() {
  return currentTimes;
 } 

 public void setCurrentTimes(int currentTimes) {
  this.currentTimes = currentTimes;
 } 

}

界面及判断:
用swing写的

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random; 

public class ShuD extends JFrame{
 private static final long serialVersionUID = 5952689219411916553L; //序列化字段
 private static JTextField a[][] = new JTextField[9][9];  //存储文本框中的数字
 static int ans[][] = new int[9][9];  //存储输入后的两位数组
 SudokuPuzzleGenerator example = new SudokuPuzzleGenerator();
 public int right[][] = example.generatePuzzleMatrix();
 public int rightans[][];
 private int[][] Wk(int a[][]){    //挖空
  Random r = new Random();
  int a1, a2;
  a1 = r.nextInt(9);
  a2 = r.nextInt(9);
  for(int i = 0; i < 100; i++)
  {
   a[a1][a2] = 0;
   a1 = r.nextInt(9);
   a2 = r.nextInt(9);
  }
  return a;
 }
 public ShuD(){
  Container c = getContentPane();
  c.setLayout(new BorderLayout(2, 1));  //边框布局
  JMenuItem jmiOk = new JMenuItem("提交");  //定义菜单
  JMenuItem jmiExplain = new JMenuItem("详情");
  JMenuItem jmiMessage = new JMenuItem("信息"); 

  JPanel panel = new JPanel();  //定义一个容器
  panel.add(jmiOk);     //将菜单在容器内显示
  panel.add(jmiExplain);
  panel.add(jmiMessage);
  JPanel p1 = new JPanel(new GridLayout(9, 9, 5, 5));  //定义9行9列的网格布局
  add(panel,BorderLayout.NORTH);   //将菜单放置在北面
  add(p1,BorderLayout.CENTER);   //将数字放置在正中间
  rightans = Wk(right);
  for(int k = 0;k<9; k ++)
  {
   for(int n=0;n<9;n++)
   {
    if(rightans[k][n] != 0)
    {
     a[k][n] = new JTextField("" + rightans[k][n]);
     a[k][n].setHorizontalAlignment(JTextField.CENTER);//将数字水平居中
     a[k][n].setEditable(false);   //只可显示不可修改
     p1.add(a[k][n]);     //添加文本框
    }
    else
    {
     a[k][n] = new JTextField();
     a[k][n].setHorizontalAlignment(JTextField.CENTER);
     p1.add(a[k][n]);
    }
   }
  }
  add(p1);   //将数字面板显示在容器里
  jmiOk.addActionListener(new ActionListener(){//匿名创建事件监听器
   public void actionPerformed(ActionEvent e)
   {
    if(gettext() == 1)
    {
     if(judge() == true)
     {
      JOptionPane.showMessageDialog(null, "Your answer is right!","Result",JOptionPane.INFORMATION_MESSAGE);
     }
     else
     {
      JOptionPane.showMessageDialog(null, "Your answer is wrong!","Result",JOptionPane.INFORMATION_MESSAGE);
     }
    }
   }
  });
  explainListenerClass listener2 = new explainListenerClass();
  jmiExplain.addActionListener(listener2);
  messageListenerClass listener3 = new messageListenerClass();
  jmiMessage.addActionListener(listener3);
 } 

 static int gettext()   //获取文本框的文字
 {
  int i,j;
  for(i = 0; i < 9; i++)
  {
   for(j = 0; j < 9 ; j ++)
   {
    ans[i][j] = 0;
   }
  }
  for(int k = 0;k < 9; k++)
  {
   for(int n = 0;n < 9; n++)
   {
    try   //异常处理
    {
     ans[k][n] = Integer.parseInt(a[k][n].getText());
     //将答案类型转换之后传给ans
    }
    catch(NumberFormatException nfe)
    {
     JOptionPane.showMessageDialog(null,"数据中包括非数字,请重新输入");
     return 0;
    }
   }
  }
  return 1;
 }
 public static boolean judge()   //判断输入的答案是否正确
 {
  int i,j,k;
  int [][]answer = ans;    

  for(i = 0; i < 9; i ++)
  {
   if(judge9(answer[i]) == false)  //判断每列是否有重复数字
    return false;
  }
  for(j = 0; j < 9; j ++)     //判断每行是否有重复数字
  { 

   int[] newAnswerColumn = new int[9];
   for(i = 0; i < 9; i ++)
   {
    newAnswerColumn[i] = answer[i][j];
   }
   if(judge9(newAnswerColumn) == false)
    return false;
  }
  for(i = 0; i < 3; i ++)   //判断每个小九宫格内是否有重复数字
  {
   for(j = 0; j < 3; j ++)
   {
    k = 0;
    int[] newAnswer = new int[9];
    for(int m = i * 3; m < i * 3 + 3; m ++)
    {
     for(int n = j * 3; n < j * 3 + 3; n ++)
     {
      newAnswer[k] = answer[m][n];
      k++;
     }
    }
    if(judge9(newAnswer) == false)
    {
     return false;
    }
   }
  }
  return true;
 }
 public static boolean judge9(int[] answer)
 {
  int i,j;
  for(i = 0; i < 9; i ++)
  {
   for(j = 0; j < 9; j ++)
   {
    if(i == j)
     continue;
    if(answer[i] == answer[j])  //如果有重复的数字,返回false
    {
     return false;
    }
   }
  }
  return true;  //没有重复数字,返回true
 } 

 public static void main(String[] args) {
  JFrame frame = new ShuD();
  frame.setTitle("SuDoku");
  frame.setSize(600,900);
  frame.setLocationRelativeTo(null);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
 }
}
class explainListenerClass implements ActionListener{  //事件监听器
 public void actionPerformed(ActionEvent e){
  JOptionPane.showMessageDialog(null, "填入数字保证每行每列及每个小的九宫格内数字无重复","Explain",JOptionPane.INFORMATION_MESSAGE);
 }
}
class messageListenerClass implements ActionListener{
 public void actionPerformed(ActionEvent e){
  JOptionPane.showMessageDialog(null, "made by wyx","Message",JOptionPane.INFORMATION_MESSAGE);
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • java 二维数组矩阵乘法的实现方法
  • java使用回溯法求解数独示例
  • java旋转二维数组实例
  • Java编程中二维数组的初始化和基本操作实例
  • Java实现解数独的小程序
  • Java实现顺时针输出螺旋二维数组的方法示例
  • java版数独游戏核心算法(一)
  • java版数独游戏界面实现(二)
  • java数独游戏完整版分享
  • Java基于二维数组实现的数独问题示例
(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编程中二维数组的初始化和基本操作实例

    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旋转二维数组实例

    本文实例讲述了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 二维数组矩阵乘法的实现方法

    复制代码 代码如下: 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版数独游戏核心算法(一)

    之前学习javascript时用javascript写过一个数独游戏,最近看了一点java的内容,于是就心血来潮想搞一个java版的数独游戏. 现在将全部代码分享出来和大家学习交流,当然代码中有着各种各样的问题和不足之处,望各位朋友批评指点. 以下是生成数独地图的核心算法,算法不是很好,也是之前参考过网上的一些思想: package hlc.shudu.src; /* * 数独的帮助类,里面提供数据所需的所有算法 */ public class ShuduHelper { //数独地图数组 pr

  • 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使用回溯法求解数独示例

    复制代码 代码如下: 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基于二维数组实现的数独问题.分享给大家供大家参考,具体如下: 这里利用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数独游戏完整版分享

    本文实例为大家分享了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

  • 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

随机推荐