本来打算晚上把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实现简单数独游戏相关推荐

  1. C语言简单数独游戏终盘生成

    前言 这一篇文章介绍的是移动变换法,有详细的移动变化法的图文解析,在文末有完整的可用于查看移动变换法生成数独终盘过程的代码 实现思路 移动变换法这一方法是很简单的一种方法,实现起来也比较容易,但同时它 ...

  2. [内附完整源码和文档] 基于Java实现的数独游戏

    一.本游戏背景介绍 相传数独源起于拉丁方阵(Latin Square),1970年代在美国发展,改名为数字拼图(Number Place),之后流传至日本并发扬光大,以数字智力游戏智力拼图游戏发表.在 ...

  3. 基于C++和QT实现的简单数独游戏软件

    资源下载地址:https://download.csdn.net/download/sheziqiong/85660211 一.实验题目与要求 本次实验主要内容是实现一个简单的数独软件,具体要求如下: ...

  4. JAVA实现简单扫雷游戏

    这是我第一次写博客,初衷是想把我学到的东西展示出来,通过写博客的方式再捋一遍自己的思路.希望自己的一点点想法能够给其他人启发,我也要把自己存在的问题提出来,以此文为起点,树立写博客的习惯,在之后的日子 ...

  5. Java入门简单小游戏有哪些?

    适合新手练习的小游戏有超级玛丽.愤怒的小鸟.飞机大战.五子棋.彩虹雨.聊天室.华容道.坦克大战.扫雷等.还有贪吃蛇,由Java开发出来的一款经典小游戏,java小白入门可以用这款游戏开发练手锻炼自己的 ...

  6. Java实现简单扑克牌游戏

    扑克牌小游戏: 游戏玩法简介:定义五个People在玩扑克牌游戏,玩法是5个人从一副没有大小王的扑克牌中各抽取4张,牌的类型有四种:♥,♣,♠,♦.牌的大小为从1~13.(此处为了简单,只取1 -5) ...

  7. 基于JAVA的简单迷宫游戏

    一.实验要求 1. 迷宫游戏是非常经典的游戏,在该题中要求随机生成一个迷宫,并求解迷宫. 2. 要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式.玩家走迷宫,通过键盘方向键控制,并在行走路径上留下痕迹 ...

  8. Java编写简单五子棋游戏

    编写15*15的棋盘,其中第15行和第15列表示坐标. 详细代码实现如下: import java.util.Scanner; /** 五子棋*/ public class WZQ {static S ...

  9. Java 实现简单打字游戏

    打字游戏 题目: 代码实现: 题目: 编写一个打字游戏,从一个面板顶端随机出现一些字母,字母按一定的时间自顶向下移动,如果字母接触到面板底端则Game Over,用户可以通过敲击键盘消除移动中的字母. ...

最新文章

  1. 毛永胜计算机教师,中国文化中心笛子教师与毛国立音乐学院师生交流
  2. SpiderData 2019年2月13日 DApp数据排行榜
  3. C#实现所有经典排序算法汇总
  4. 树莓派 红灯不亮_请问我的树莓派烧了系统后板子只有红灯亮,而act绿灯不亮,并且网口不插网线两个灯都是微微亮,请问?...
  5. 使用RedisTemplate实现Redis分布式锁出现的一些列问题(避坑)
  6. 学校为什么要单位接收函_学校就快要截止收档案接收函了!你开始处理没?
  7. 使用phaserjs开发简单h5小游戏
  8. DBeaver - 一款免费开源的通用数据库工具
  9. java linux获取本机ip_Java 获取本机IP
  10. git 放弃本地修改
  11. 决定局域网特性的三要素
  12. X509 PKCS7 PKCS12
  13. 两台电脑使用一根网线直连传输文件
  14. 时间转换 Wed Sep 16 2020 00:00:00 GMT+0800 (中国标准时间)
  15. cognos使用自定义函数_将单点登录添加到您的IBM Cognos 8自定义Java身份验证提供程序
  16. rtklib-单点定位(pntpos.c)代码关键问题解析-satposs部分
  17. python迅雷下载任务出错_迅雷下载时提示“任务出错”怎么办?(附多种解决方法)...
  18. 去哪儿笔试:座位安排问题
  19. Kaggle注册以及问题解决
  20. pdf怎么分割成多个文件?有两种方式

热门文章

  1. 计算机办公软件应用实训,计算机专业职业教育实训系列教材:Office 2007办公软件实训教程...
  2. MATLAB数值分析学习笔记:多项式拟合
  3. 中科大文献管理笔记——文献调研起步
  4. 用Tkinter打造自己的Python IDE开发工具(4)利用HP_tk模块设计自己的代码编辑器
  5. 设计*** 得到远程主机的注册表
  6. surf程序 matlab,Matlab图像处理学习笔记(七):surf特征点
  7. zencart忘记后台密码的解决办法
  8. openGauss客户端工具DataStudio
  9. jQuery_03_操作HTML和CSS
  10. jeesite4打包部署到服务器