Java版数独设计
JAVA数独(九宫格)游戏软件设计报告(推荐文档)
panel_txt.add(panel[i]); //添加组件
int m=(i+2)/3*3-2; //生成九个3*3的网格,并添加数字
int n=((i-1)%3+1)*3-2;
for(int j=m;j<=m+2;j++){
for(int k=n;k<=n+2;k++){
panel[i].add(text[j][k]);
单击事件处理方法
单击实践
JOptionPaneshow
游戏布局:
①JPanel panel_txt=new JPanel(new GridLayout(3,3,2,2));
//将面板设置为3行3列网格布,并设置大小
②for(int i=1;i<=9;i++){ //设置9个面板
panel[i]=new JPanel(new GridLayout(3,3)); //将面板设置为3行3列
}
}
}
2.2数独游戏界面设计
2.3数独游戏程序功能
功能1:弹出游戏界面,可直接开始进行数独游戏,也可以在游戏过程中选择菜单栏中“文件”——“新局”,进行新一局的游戏,或者是“文件”——“重来”,重新开始当前局。
功能2:判断答案的正误。游戏当前局完成后,可选择菜单栏中“文件”——“提交”,系统会根据玩家在当前局所填写的结果,弹出相应的对话框。
功能5:选择菜单栏中“文件”——“退出”,会自动关闭当前的数独游戏界面,退出系统。
功能6:玩家可根据自身的情况或兴趣,在数独游戏界面上方的下拉列表中选择适合自己的难度(难度共分为3级,分别是“简单”,“一般”和“困难”),然后选择重新开局,游戏的难度会进行相应的变化。
java上机练习题
java上机练习题一、题目描述编写一个Java程序,实现一个数独游戏的解题器。
数独游戏是一种填数字的逻辑游戏,要求每个数字在每一行、每一列和每一个九宫格内只能出现一次。
给定一个部分填充的数独棋盘,请编写程序解决数独题目。
二、问题分析1. 数独棋盘由9行9列的格子组成,每个格子初始时可能包含数字1-9或空格(0)。
2. 数独的解决过程需要逐个格子进行填充,满足数字在行、列和九宫格内各不重复的条件。
3. 使用回溯算法进行解题,即通过逐个尝试每个格子的可能数字,如果填充的数字导致下一个格子无法满足要求,则返回上一个格子重新尝试其他可能数字。
三、算法设计1. 创建一个求解数独的方法,该方法输入一个数独棋盘二维数组,并返回解决后的棋盘。
2. 在求解数独方法中,通过循环遍历数独棋盘的每一个格子,对空格子进行尝试填充。
3. 对每个空格子进行填充时,按照从1到9的顺序尝试,找到一个合适的数字填充后递归调用求解数独方法,处理下一个格子。
4. 如果下一个格子无法填充合适数字,则回溯到当前格子重新选择一个数字填充,直到找到合适的数字或者所有可能数字均不满足条件。
5. 递归调用的终止条件为所有格子均填充完毕。
四、核心代码实现```javapublic class SudokuSolver {public static void main(String[] args) {// 数独棋盘输入示例int[][] board = {{5, 3, 0, 0, 7, 0, 0, 0, 0},{6, 0, 0, 1, 9, 5, 0, 0, 0},{0, 9, 8, 0, 0, 0, 0, 6, 0},{8, 0, 0, 0, 6, 0, 0, 0, 3},{4, 0, 0, 8, 0, 3, 0, 0, 1},{7, 0, 0, 0, 2, 0, 0, 0, 6},{0, 6, 0, 0, 0, 0, 2, 8, 0},{0, 0, 0, 4, 1, 9, 0, 0, 5},{0, 0, 0, 0, 8, 0, 0, 7, 9}};solveSudoku(board);// 打印解决后的数独棋盘printSudoku(board);}public static void solveSudoku(int[][] board) { // 在求解数独的方法中填充空格solve(board);}public static boolean solve(int[][] board) {for (int row = 0; row < 9; row++) {for (int col = 0; col < 9; col++) {if (board[row][col] == 0) {for (int num = 1; num <= 9; num++) { if (isValid(board, row, col, num)) { board[row][col] = num;if (solve(board)) {return true;} else {board[row][col] = 0;}}}return false;}}}return true;}public static boolean isValid(int[][] board, int row, int col, int num) { for (int i = 0; i < 9; i++) {if (board[i][col] == num || board[row][i] == num ||board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == num) { return false;}}return true;}public static void printSudoku(int[][] board) {for (int row = 0; row < 9; row++) {for (int col = 0; col < 9; col++) {System.out.print(board[row][col] + " ");}System.out.println();}}}```五、运行结果数独解题结果将以二维矩阵形式输出在控制台上。
数独游戏在Java开发环境下使用Swing库进行开发
数独游戏在Java开发环境下使用Swing库进行开发数独游戏是一种智力益智类游戏,通过填写9×9的方格中的数字,使得每一行、每一列和每一个宫都包含了1到9的所有数字,而且在每一行、每一列和每一个宫中都没有重复数字。
在本文中,将介绍如何使用Java开发环境下的Swing库来实现一个简单的数独游戏。
Swing库是Java中用于创建图形用户界面(GUI)的一套组件。
通过使用Swing库,我们可以轻松创建各种用户界面,包括按钮、文本框、标签等,以及处理用户交互。
在这个数独游戏的开发中,我们将使用Swing库来创建一个可交互的数独游戏界面,并实现数独游戏的逻辑。
首先,我们需要创建一个窗口来容纳数独游戏界面。
这可以通过Swing库中的JFrame类来实现。
JFrame类表示一个顶层窗口,我们可以在其中添加其他的Swing组件。
通过设置JFrame的标题、大小和关闭操作,我们可以创建一个适用于数独游戏的窗口。
接下来,我们将创建一个9×9的网格来表示数独游戏的方格。
在Swing库中,可以使用JPanel类来创建一个面板,并将其设置为GridLayout布局。
GridLayout布局可以将面板分割为固定数量的行和列,适合用于显示网格。
我们将在这个面板中添加81个文本框来表示数独方格,以及一个按钮用于提供重置游戏的功能。
当用户点击某个数独方格时,我们将使该方格成为焦点,并允许用户在键盘上输入数字。
为了实现这一功能,我们可以为所有的文本框添加一个事件监听器,并在焦点变化时记录当前焦点的位置。
通过处理用户键盘输入事件,我们可以将输入的数字显示在方格中,并验证该数字的合法性。
在数独游戏中,我们需要检查每一行、每一列和每一个宫中是否包含了1到9的所有数字,并且没有重复数字。
我们可以通过创建相应的检查函数来实现这一功能。
当用户完成数独游戏并点击验证按钮时,我们将使用这些检查函数来验证用户填写的数字是否正确。
java课程设计九宫格数独
中南民族大学管理学院学生课程设计报告课题名称: java课程设计选题名称:九宫格数独年级: 2009专业:信息管理与信息系统学号:姓名:指导教师:完成地点:管理学院综合实验室完成日期: 2011年9月25日2011学年至2012学年度第一学期目录一、题目描述 3二、问题分析 3三、问题分解 4四、系统设计 6五、系统实现 11六、系统设计和软件发布 24七、难点及关键技术分析 31八、心得体会 32一、题目(问题)描述在9×9格的大九宫格中有9个3×3格的小九宫格,并提供一定数量的数字。
根据这些数字,利用逻辑和推理,在其它的空格上填入1到9的数字。
每个数字在每个小九宫格内只能出现一次,每个数字在每行、每列也只能出现一次。
这种游戏只需要逻辑思维能力,与数字运算无关。
虽然玩法简单,但数字排列方式却千变万化,所以不少教育者认为数独是锻炼脑筋的好方法。
二、问题分析1、基本解法:利用1 ~ 9 的数字在每一行、每一列、每一宫都只能出现一次的规则进行解题的方法。
实际寻找解的过程为:使用单元排除法的目的就是要在某一单元(即行,列或区块)中找到能填入某一数字的唯一位置,换句话说,就是把单元中其他的空白位置都排除掉。
那么要如何排除其余的空格呢?当然还是不能忘了游戏规则,由于1-9的数字在每一行、每一列、每一个九宫格都要出现且只能出现一次,所以:如果某行中已经有了某一数字,则该行中的其他位置不可能再出现这一数字如果某列中已经有了某一数字,则该列中的其他位置不可能再出现这一数字如果某区块中已经有了某一数字,则该区块中的其他位置不可能再出现这一数字。
单元格:数独中最小的单元,标准数独中共有81个;行:横向9个单元格的集合;列:纵向9个单元格的集合;宫:粗黑线划分的区域,标准数独中为3×3的9个单元格的集合;已知数:数独初始盘面给出的数字;候选数:每个空单元格中可以填入的数字。
2、软件系统的功能可弹出游戏界面,方便用户操作,界面易于用户理解。
java 数独题目编辑
java 数独题目编辑(最新版)目录1.Java 编程语言与数独游戏的结合2.数独题目的生成规则3.Java 代码实现数独题目的编辑4.总结与展望正文一、Java 编程语言与数独游戏的结合数独是一款经典的逻辑智力游戏,其规则简单却趣味无穷。
近年来,随着计算机编程技术的发展,越来越多的编程语言被应用于数独游戏的编写与实现。
Java 作为一门广泛应用的高级编程语言,因其良好的跨平台性能、丰富的类库以及简单易学的语法特性,成为许多开发者编写数独游戏的首选。
二、数独题目的生成规则数独题目的生成需要遵循一定的规则,主要包括以下几个方面:1.棋盘大小:数独棋盘通常为 9x9 的大小,每个交叉点上可以放置一个数字。
2.数字范围:数独题目中的数字范围通常为 1-9,分别代表行、列和九宫格的数字。
3.唯一性:数独题目中每个数字在行、列和九宫格内只能出现一次,保证了题目的唯一解。
4.布局规则:数独题目的生成需要遵循一定的布局规则,例如:每行、每列和每个九宫格内的数字分布要均匀,不能出现重复数字。
三、Java 代码实现数独题目的编辑为了实现数独题目的编辑,我们可以使用 Java 编程语言编写一个简单的程序。
首先,定义一个二维数组来存储数独棋盘的数据,然后通过循环遍历的方法,生成满足唯一性规则的数独题目。
以下是一个简单的 Java 代码示例:```javapublic class SudokuGenerator {public static void main(String[] args) {int[][] board = new int[9][9];generateSudoku(board);printSudoku(board);}private static void generateSudoku(int[][] board) {// 随机生成数独题目的逻辑部分}private static void printSudoku(int[][] board) {// 打印数独题目}}```四、总结与展望本文简要介绍了 Java 编程语言与数独游戏的结合,并通过数独题目生成规则和 Java 代码示例,展示了如何实现数独题目的编辑。
java实现9宫格及九宫格求解的程序
java实现9宫格及九宫格求解的程序以下是一个Java实现九宫格及九宫格求解的程序的示例。
这个程序使用了回溯算法来解决九宫格问题。
```javapublic class SudokuSolverprivate static final int SIZE = 9;private static final int EMPTY = 0;private int[][] grid;public SudokuSolver(int[][] grid)this.grid = grid;}public boolean solvint row = 0;int col = 0;//寻找还未填入数字的格子if (!findEmptyCell(grid, row, col))//如果没有空格子了,表示解决方案已找到return true;}//尝试填入数字for (int num = 1; num <= SIZE; num++)if (isValid(grid, row, col, num))grid[row][col] = num;//递归调用,尝试填入下一个空格子if (solve()return true;}//如果当前的数字导致解决方案无效,则重置为0grid[row][col] = EMPTY;}}return false;}private boolean findEmptyCell(int[][] grid, int row, int col) for (row = 0; row < SIZE; row++)for (col = 0; col < SIZE; col++)if (grid[row][col] == EMPTY)return true;}}}return false;}private boolean isValid(int[][] grid, int row, int col, int num)//检查行是否合法for (int c = 0; c < SIZE; c++)if (grid[row][c] == num)return false;}}//检查列是否合法for (int r = 0; r < SIZE; r++)if (grid[r][col] == num)return false;}}//检查小格子是否合法int startRow = row - row % 3;int startCol = col - col % 3;for (int r = 0; r < 3; r++)for (int c = 0; c < 3; c++)if (grid[r + startRow][c + startCol] == num) return false;}}}return true;}public void printSolutiofor (int row = 0; row < SIZE; row++)for (int col = 0; col < SIZE; col++) System.out.print(grid[row][col] + " ");}System.out.println(;}public static void main(String[] args)int[][] grid ={5,3,0,0,7,0,0,0,0},{6,0,0,1,9,5,0,0,0},{0,9,8,0,0,0,0,6,0},{8,0,0,0,6,0,0,0,3},{4,0,0,8,0,3,0,0,1},{7,0,0,0,2,0,0,0,6},{0,6,0,0,0,0,2,8,0},{0,0,0,4,1,9,0,0,5},{0,0,0,0,8,0,0,7,9}};SudokuSolver solver = new SudokuSolver(grid); if (solver.solve()solver.printSolution(;} elseSystem.out.println("No solution exists.");}```这个程序实现了一个SudokuSolver类,其中包含了一个solve(方法来解决九宫格问题。
java数独的实现
package com.chinasofti.etc.dalian.simple.sukoduGUI;import java.util.ArrayList;import java.util.Random;public class sukodu {int map[][] = new int[9][9];// 保存数独地图ArrayList usable[][] = new ArrayList[9][9];// 保存数独地图中每个元素的可选列表Random random = new Random();/*** 方法:initMap():初始化地图* 参数:givenMap:如果givenMap中的每一个元素都为空,意味着产生一个全新的数独,如果其中的元素有值,则解开数独** 关于+100的说明:用超过10的值说明该值为题目初始化值,在程序运行的过程中不允许更改*/public void initMap(int[][] givenMap) {for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {map[i][j] = givenMap[i][j];if (map[i][j] != 0) {//????????????????????System.out.println("no o");usable[i][j] = new ArrayList();usable[i][j].add(new Integer(map[i][j] + 100));//参见方法说明}}}}/*** @return*/public int[][] createAndFill() {int direction = 1;for (int num = 0; num < 81;) {// 如果回溯到第一个元素之前,说明此题无解,返回nullif (num < 0) {return null;}// i:每个地图元素的行编号(0序),j:每个地图元素的列编号(0序)int i = num / 9;int j = num % 9;if (usable[i][j] == null) {// -------说明地图上的这个元素还未曾被访问过createList(i, j);ArrayList src = usable[i][j];if (src.size() == 0) {// 卡死,不能进行,回溯map[i][j]=0;direction = 2;// 表示遍历方向为负方向num--;} else {// 可选列表中有元素,则随机选择一个,并将其从可选列表中删除int randomIndex = Math.abs(random.nextInt()) %src.size();map[i][j] = ((Integer) src.get(randomIndex)).intValue();src.remove(randomIndex);direction = 1;num++;}}// ----------说明地图上的这个元素还未曾被访问过else {// 可选列表不为空,曾经访问过如果为空则说明还没有访问到这个点if (usable[i][j].size() > 0&& ((Integer) usable[i][j].get(0)).intValue() > 10) {//????????????switch (direction) {case 1:num++;break;case 2:num--;break;}} else {switch (direction) {case 1:map[i][j]=0;//??????????????createList(i,j);ArrayList src=usable[i][j];if (src.size() == 0) {// 卡死,不能进行,回溯map[i][j]=0;direction = 2;// 表示遍历方向为负方向num--;} else {// 可选列表中有元素,则随机选择一个,并将其从可选列表中删除int randomIndex = Math.abs(random.nextInt()) % src.size();map[i][j] = ((Integer) src.get (randomIndex)).intValue();src.remove(randomIndex);direction = 1;num++;}break;case 2:src=usable[i][j];if(src.size()==0){map[i][j]=0;direction = 2;// 表示遍历方向为负方向num--;}else{int randomIndex = Math.abs(random.nextInt()) % src.size();map[i][j] = ((Integer) src.get(randomIndex)).intValue();src.remove(randomIndex);direction = 1;num++;}}}}}return map;}/*** 方法added():用于判断某一个值是否位于元素可选列表之中参数:list:元素的可选列表value:需要判断的值返回值:* 如果值位于可选列表之中,则返回位置标号,否则返回-1**/public int added(ArrayList list, int value) {for (int i = 0; i < list.size(); i++) {if (((Integer) list.get(i)).intValue() == value) {return i;}}return -1;}/*** 方法:createList():用于初始化元素的可选列表参数:i:元素行编号,j:元素列编号src是备选元素的list*/public void createList(int i, int j) {usable[i][j] = new ArrayList();ArrayList src = usable[i][j];// 初始化该元素位置可选列表,将1-9都添加进可选列表for (int m = 1; m <= 9; m++) {src.add(new Integer(m));}// 判断与当前元素同行元素的值是否在可选列表之中for (int col = 0; col < 9; col++) {int index = added(src, map[i][col]);if (index != -1) {// 当前值位于可选列表中,删除之src.remove(index);}}// 判断与当前元素同列行元素的值是否在可选列表之中for (int row = 0; row < 9; row++) {int index = added(src, map[row][j]);if (index != -1) {// 当前值位于可选列表中,删除之src.remove(index);}}// 判断与当前元素处在同一个9宫格元素的值是否在可选列表之中int cellI = i / 3;// 9宫格的行编号int cellJ = j / 3;// 9宫格的列编号int indexI = cellI * 3;// 9宫格左上角第一个元素的行编号for (int a = 0; a < 3; a++) {int indexJ = cellJ * 3;// 9宫格左边第一列的列编号for (int b = 0; b < 3; b++) {int index = added(src, map[indexI][indexJ]);if (index != -1) {src.remove(index);// 当前值位于可选列表中,删除之}indexJ++;}indexI++;}}/*** @param args*/public static void main(String[] args) {int[][] map = new int[9][9];// int map[][]={//// {5 , 9 , 0 , 3 , 0 , 0 , 1 , 0, 6 },// {0 , 1 , 0 , 0 , 0 , 5 , 3 , 8, 0 },// {0 , 0 , 6 , 9 , 0 , 1 , 0 , 0, 0 },// {4 , 0 , 0 , 0 , 1 , 0 , 2 , 7, 3 },// {2 , 5 , 0 , 0 , 3 , 7 , 0 , 0 , 0 },// {0 , 0 , 0 , 0 , 9 , 0 , 0 , 0, 1 },// {9 , 6 , 5 , 1 , 0 , 0 , 8 , 0, 0 },// {0 , 0 , 0 , 6 , 0 , 9 , 5 , 0, 2 },// {1 , 0 , 8 , 0 , 0 , 3 , 0 , 9, 0 }//// };sukodu sk = new sukodu();sk.initMap(map);//递归生成// long begin = System.currentTimeMillis();//// map=sk.createAndFill();//// long end = System.currentTimeMillis();//循环生成long begin = System.currentTimeMillis();map=sk.createAndFill();long end = System.currentTimeMillis();System.out.println("Times:" + (end - begin));System.out.println("#####################################");//map = sk.map;for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {if(j%3==2){System.out.print(map[i][j]+" # ");}else if(j==0){System.out.print("# "+map[i][j]+" ");}else{System.out.print(map[i][j] + " ");}}if(i%3==2){System.out.println("\n#####################################");}else{System.out.println();}}}}。
Java实现数独小游戏
Java实现数独⼩游戏本⽂实例为⼤家分享了Java实现数独⼩游戏的具体代码,供⼤家参考,具体内容如下题⽬要求:制作⼀个数独游戏。
数据游戏拼图由⼀个3*3的九宫格组成,每个格式⼜分成⼀个⼩九宫格,共九九⼋⼗⼀个⼩格⼦。
游戏规则:游戏开始前会有⼀些格式了写好了1-9的数,在剩下的格式⾥填写1-9的数,直到把所有格式填满,要求任何⼀⾏或⼀列或者任⼀个⼩九宫中没有相同的数字。
拼图⽰例如下:任务要求:(1)可以根据在九宫格中初始给出的数字个数设定游戏难度,如初始给出30个数设定为难、35个数设定为中等难度、40个数设定为容易。
(2)对于初始给出的数据要能验证题⽬的合法性(即验证给出数据本⾝是否符合游戏规则,⾏、列及⼩九宫中不能出现重复数字1-9),对玩游戏中填⼊的数字在提交后要能验证其正确性(任何⼀⾏或⼀列或者任⼀个⼩九宫中没有相同的数字)。
(3)程序能保存玩家的信息、游戏记录以及成绩(最⾼分),并能够在游戏结束时查看玩家排名。
⼯作流程如下:该数独游戏需要连接数据库,登录⽤户和保存数据记录,连接数据库创建表等暂不作显⽰。
主要数独游戏部分(除去登录页⾯,注册页⾯,查看排名页⾯不做显⽰)分为Main(⽣成数独,将⽣成100个数独保存在⽂件中,也可以不保存,每次⽣成数独都为⼀次新的数独不做记录,效率较差)和Play(数独显⽰页⾯,同时包括填写数独和判断数独是否正确)两类。
1、Main类package shudu;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.GridLayout;import java.awt.SystemColor;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.util.Random;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;public class Main {private int[][] Arry; //得到⼀个9*9的数独private int[][] shudu; //挖空arry数组中的数字private int[][] answer; //存储数独答案private int[][] game; //最终数独private int grade;private int[] row; //每⼀⾏的个数private int[] col; //每⼀列的个数private int[] places; //每⼀个九宫格的个数private boolean flag=false;//读取⽂件名private String filename=new String("C:\\Users\\liaolilan\\Desktop\\shudu.txt");public static void main(String[] args){Main mainer=new Main();// mainer.UI();}public void UI(){for(int k=0;k<100;k++){this.Arry=new int[9][9];this.shudu=new int[9][9];this.game=new int[9][9];this.answer=new int[9][9];this.row=new int[9];this.col=new int[9];this.places=new int[9];this.grade=grade;flag=false;//初始化数组for(int i=0;i<9;i++)row[i]=col[i]=places[i]=9;//调试// this.answer=new int[9][9]; //最终答案存储再arry中rand();//先产⽣15个随机数加上随机位置,⼀定需要随机⽣成,不然就会⼀直都是⼀个数组 for(int i=0;i<9;i++){for(int j=0;j<9;j++)System.out.print(Arry[i][j]);System.out.println();}dfs(Arry,0);//获得⼀个数组答案d// diger(grade);//挖空数组//将100个数独写⼊⽂件中try{String data = "";File file =new File(filename);//if file doesnt exists, then create itif(!file.exists()){file.createNewFile();}//true = append fileFileWriter fileWritter = new FileWriter(filename,true);BufferedWriter bufferWritter = new BufferedWriter(fileWritter);bufferWritter.write(k+1+"\r\n");for(int i=0;i<9;i++){data="";for(int j=0;j<9;j++){data=data+answer[i][j]+"";}System.out.println(data);}bufferWritter.close();System.out.println("Done");}catch(IOException e){e.printStackTrace();}}}//随机给数public void rand(){int t=0;//t=14不随机性太⾼,容易产⽣没有解的数独,经过参考资料发现,当t=6的时候,⼏乎100%有解 while(t<6){int x=new Random().nextInt(9);int y=new Random().nextInt(9);int i=new Random().nextInt(9)+1;if(Arry[x][y]==0){if(istrue(Arry,x,y,i)){ //判断数是否能填Arry[x][y]=i;t++;}}}}//判断在arry[x][y]上是否能放numpublic boolean istrue(int arry[][],int x,int y,int num){//横竖是否有numfor(int i=0;i<9;i++){if(arry[x][i]==num||arry[i][y]==num)return false;}for(int i=(x/3)*3;i<(x/3+1)*3;i++)for(int j=(y/3)*3;j<(y/3+1)*3;j++)if(arry[i][j]==num)return false;return true;}//根据前⾯放的数获得⼀个正确的答案,dfs获取public void dfs(int arry[][],int n){if(n<81){if(flag==true) return;int x=n/9;//x第N个数的横坐标int y=n%9;//y第N个数的纵坐标if(arry[x][y]==0){//若第N个数为0,没有被填过,则判断0~9是否能被填for(int i=1;i<10;i++){if(istrue(arry,x,y,i)){//第N个数可以填i,填⼊然后dfsarry[x][y]=i;dfs(arry,n+1);//dfs回溯arry[x][y]=0;}}}else{dfs(arry,n+1);}}else{//获得第⼀个结果,flag置trueflag=true;//将获得的数组放⼊shudu中然后再挖空//if(all==false){for(int i=0;i<9;i++)for(int j=0;j<9;j++)shudu[i][j]=answer[i][j]=arry[i][j];System.out.println("###################");for(int i=0;i<9;i++){for(int j=0;j<9;j++)System.out.print(arry[i][j]);System.out.println();}}}//为了避免数独⽆解,保证数独有唯⼀解//挖空数组,分难易程度,,grade为挖空个数//是否有⼀个⾏、列、九宫格已经为空boolean emptyrow=false,emptycol=false,emptyplaces=false;public void diger(int grade,int level){this.shudu=new int[9][9];this.game=new int[9][9];this.answer=new int[9][9];this.row=new int[9];this.col=new int[9];this.places=new int[9];this.grade=grade;File file=new File(filename);BufferedReader reader = null;try {System.out.println("以⾏为单位读取⽂件内容,⼀次读⼀整⾏:");reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8")); // reader = new BufferedReader(new FileReader(file));String tempString = null;int line = 1,k=0;boolean flag=false;// ⼀次读⼊⼀⾏,直到读⼊null为⽂件结束while ((tempString = reader.readLine()) != null&&k<9) {// 显⽰⾏号System.out.println(" line " + line + ": " + tempString);if(tempString.equals(level+"")){flag=true;continue;}if(flag==true){for(int i=0;i<9;i++)answer[k][i]=tempString.charAt(i)-48;k++;}line++;}reader.close();} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e1) {}}}for(int i=0;i<9;i++)for(int j=0;j<9;j++)shudu[i][j]=answer[i][j];int t=grade;while(t>0){//随机抽到x,yint x=new Random().nextInt(9);int y=new Random().nextInt(9);//若x,y没有被挖空则挖空x,yif(shudu[x][y]!=0){row[x]--;col[y]--;places[(y/3)*3+x/3]--;if((row[x]==0&&emptyrow)||(col[y]==0&&emptycol)||(places[(y/3)*3+x/3]==0&&emptyplaces)) {System.out.println(x+" "+y+" 不可以");continue;}else{shudu[x][y]=0;t=t-1;}if(row[x]==0)emptyrow=true;if(col[y]==0)emptycol=true;if(places[(y/3)*3+x/3]==0)emptyplaces=true;}}//获得最终游戏数独for(int i=0;i<9;i++)for(int j=0;j<9;j++)game[i][j]=shudu[i][j];}//获得最终游戏数独public int[][] getArr(){for(int i=0;i<9;i++){for(int j=0;j<9;j++){System.out.print(game[i][j]);if(game[i][j]==0)t++;}System.out.println();}System.out.println("###################");System.out.println("挖空数为:"+t);return this.game;}//获得答案数独public int[][] getAnswer(){for(int i=0;i<9;i++){for(int j=0;j<9;j++)System.out.print(answer[i][j]);System.out.println();}System.out.println("###################");return this.answer;}}2、Play类package shudu;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.GridLayout;import java.awt.SystemColor;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.FocusEvent;import java.awt.event.FocusListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.util.ArrayList;import java.util.List;import java.util.Timer;import java.util.TimerTask;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;import javax.swing.border.Border;import erDao;import shudu.Main;import er;//游戏界⾯的设计public class Play {//设置全局变量,九宫格JTextField[][] numberFields=new JTextField[9][9]; //游戏数独数组int[][] gamearr=new int[9][9];//游戏答案数组int[][] answerarr=new int[9][9];Color green=new Color(93, 200, 138);Color lightGray = new Color(217, 217, 217);Color blue = new Color(102, 183, 255);//挖空数!private int grade=40;//过去的private int usedgrade=0;//计时器Timer time;JLabel timeLabel;TimerTask task;//⽤标签表⽰游戏进展JLabel labelsc=new JLabel();//创建字体,之后所有的字体为该字体Font f=new Font("⽅正仿宋简体", Font.BOLD, 25);//选择九宫格中的格⼦的坐标int sx=10;int sy=10;//是否已经看过答案private boolean isanswer;//⽤户名JLabel username=new JLabel();JLabel usergrade=new JLabel();private int gamegrade=0;//游戏分数//登录login loger=new login();User user=er;//读取⽂件名private String filename=new String("C:\\Users\\liaolilan\\Desktop\\SuDoKu.txt");//以前游戏数组private int[][] usedgame=new int[9][9];//以前的游戏时间private int usedtim=1;//判断是不是新⽤户//是否为新⽤户private boolean isnew=true;//保存⽤户名存在在第⼏⾏private int act=-1;//关卡JLabel levels=new JLabel();int levs=1;//窗⼝private JFrame jf ;public Play(){//制作游戏界⾯System.out.println(user.getUsername()+" "+user.getUserpwd()+" "+user.getUsergrade());jf = new JFrame();jf.setTitle("数独游戏");jf.setBounds(400, 0, 1100, 1000);jf.setResizable(false);//不允许窗⼝最⼤化jf.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//不执⾏任何操作;要求程序在已注册的 WindowListener 对象的 windowClosing ⽅法中处理该操作 jf.setLocationRelativeTo(null);//居中,不⽤定位窗⼝⼤⼩jf.setVisible(true);//打开时,判断是否上⼀局游戏jf.addWindowListener(new WindowAdapter() {@Overridepublic void windowOpened(WindowEvent arg0) {//如果是新⽤户,保存数组//保存记录,读取⽂件,读出⽂件,在开始游戏的时候读出File file=new File(filename);BufferedReader reader = null;try {System.out.println("以⾏为单位读取⽂件内容,⼀次读⼀整⾏:");reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8"));// reader = new BufferedReader(new FileReader(file));String tempString = null;int line = 1;// ⼀次读⼊⼀⾏,直到读⼊null为⽂件结束while ((tempString = reader.readLine()) != null) {// 显⽰⾏号if(tempString.equals(user.getUsername())){act=line;isnew=false;}else if(isnew==false){//关卡levs=Integer.valueOf(tempString);System.out.println(levs);break;}line++;}reader.close();} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e1) {}}}newGame(grade,levs);}});//关闭时,保存关卡记录jf.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent arg0) {BufferedReader reader = null;//保存记录,读取⽂件,读出⽂件,在开始游戏的时候读出File file=new File(filename);int num=0;//第⼏⾏boolean flag=false;System.out.println("act:"+act);List list = new ArrayList();try{reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8"));// reader = new BufferedReader(new FileReader(file));String str = null;// ⼀次读⼊⼀⾏,直到读⼊null为⽂件结束while ((str = reader.readLine())!= null) {++num;System.out.println(num+"⾏:"+str);if(isnew==false&&(num==act||num==act+1)){System.out.println(str);continue;}list.add(str);}}catch(IOException e){e.printStackTrace();}System.out.println("list size:"+list.size());System.out.println("删除成功");//重新写⼊try{FileWriter fileWritter = new FileWriter(filename);BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), "utf-8")); //BufferedWriter bw= new BufferedWriter(fileWritter);for( int i=0;i<list.size();i++ ){System.out.println("list["+i+"]"+list.get(i));bw.write(list.get(i).toString());bw.newLine();}String data = user.getUsername();//⽤户名,保存⽤户所通过的关卡?bw.write(data+"\r\n");//关卡bw.write(levs+"\r\n");System.out.println("Done");bw.flush();bw.close();}catch(IOException e){e.printStackTrace();}System.exit(0);}});JPanel bodyPanel=new JPanel();bodyPanel.setBackground(lightGray);jf.add(bodyPanel,BorderLayout.CENTER);bodyPanel.setLayout(new GridLayout(9,9,0,0));//右边布局,难易程度,计时,重新开始,换⼀题等选择按钮 JPanel rightPanel=new JPanel();//宽度⼤⼩设置rightPanel.setPreferredSize(new Dimension(200, 789));jf.add(rightPanel, BorderLayout.EAST);//显⽰⽤户名和当前分数username.setText("⽤户名: "+user.getUsername());username.setFont(f);rightPanel.add(username);usergrade.setText("总分数: "+user.getUsergrade());usergrade.setFont(f);rightPanel.add(usergrade);//显⽰当前关卡levels.setText("关卡: "+levs);levels.setFont(f);rightPanel.add(levels);//难度选择,默认为容易JLabel label1=new JLabel("请选择模式");label1.setFont(f);rightPanel.add(label1);//容易,中等,难String[] btnstr={"容易","中等","难"};for(int i=0;i<3;i++){JButton btn=new JButton(btnstr[i]);btn.setFont(f);btn.setBackground(lightGray);btn.setPreferredSize(new Dimension(120,60));//为难度按钮加上监听器btn.addActionListener(new funactionListener());rightPanel.add(btn);//加监听器}//功能按钮JLabel label2=new JLabel("功能按钮 ");label2.setFont(f);rightPanel.add(label2);//换⼀题JButton changebtn=new JButton("换⼀题");changebtn.setFont(f);changebtn.setPreferredSize(new Dimension(120,60));changebtn.setBackground(lightGray);changebtn.setForeground(Color.black);changebtn.addActionListener(new funactionListener());rightPanel.add(changebtn);//重做JButton newbtn=new JButton("重玩");newbtn.setFont(f);newbtn.setPreferredSize(new Dimension(120,60));newbtn.setBackground(lightGray);newbtn.setForeground(Color.BLACK);newbtn.addActionListener(new funactionListener());rightPanel.add(newbtn);//答案JButton answerbtn=new JButton("答案");answerbtn.setFont(f);answerbtn.setPreferredSize(new Dimension(120,60));answerbtn.setBackground(Color.red);answerbtn.setForeground(Color.WHITE);answerbtn.addActionListener(new funactionListener());rightPanel.add(answerbtn);//计时JLabel label3=new JLabel(" 计时 ");label3.setFont(f);rightPanel.add(label3);timeLabel=new JLabel("00:00");timeLabel.setFont(f);//放⼀个游戏进展rightPanel.add(labelsc);labelsc.setVisible(false);//下⾯布局JPanel lastPanel=new JPanel();jf.add(lastPanel,BorderLayout.SOUTH);lastPanel.setPreferredSize(new Dimension(1333, 100));lastPanel.setLayout(new GridLayout(0, 10, 0, 0));//放选择按钮JButton[] setNum=new JButton[10];for(int i=0;i<10;i++){if(i==9){setNum[i]=new JButton("清除");//加清除的监听器}else{setNum[i]=new JButton(i+1+"");//加按钮的监听器}setNum[i].setFont(f);setNum[i].setForeground(Color.WHITE);setNum[i].setBackground(green);setNum[i].setPreferredSize(new Dimension(90,70));setNum[i].setFocusPainted(false);//加下⽅按钮监听器setNum[i].addActionListener(new buttonaction());lastPanel.add(setNum[i]);}//对中间布局进⾏控制//组件边框Border centernBorder = BorderFactory.createMatteBorder(1, 1, 1, 1, Color.GRAY);Border rightAndBottomBorder = BorderFactory.createMatteBorder(1, 1, 4, 4, Color.GRAY); Border bottomBorder = BorderFactory.createMatteBorder(1, 1, 4, 1, Color.GRAY);Border rightBorder = BorderFactory.createMatteBorder(1, 1, 1, 4, Color.GRAY);//循环设置组件JTextField,九宫格//numberFields = new JTextField[9][9];for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {//System.out.println(i+j+"");numberFields[i][j] = new JTextField();//不可编辑numberFields[i][j].setEditable(false);numberFields[i][j].setFont(new Font("微软雅⿊", Font.BOLD, 35));numberFields[i][j].setHorizontalAlignment(JTextField.CENTER);numberFields[i][j].setBackground(Color.WHITE);numberFields[i][j].setForeground(Color.BLACK);//加边框!if (i == 2 && j == 2 || i == 2 && j == 5 || i == 5 && j == 2 || i == 5 && j == 5) {numberFields[i][j].setBorder(rightAndBottomBorder);} else if (j == 2 || j == 5) {numberFields[i][j].setBorder(rightBorder);} else if (i == 2 || i == 5) {numberFields[i][j].setBorder(bottomBorder);} else {numberFields[i][j].setBorder(centernBorder);}//对每个格⼦加上名称来标识numberFields[i][j].setName(Integer.toString(i) + Integer.toString(j));//对每个格⼦加上监听器numberFields[i][j].addFocusListener(new textfocusaction());;bodyPanel.add(numberFields[i][j]);}}}//开始新游戏public void newGame(int grade,int level){isanswer=false;//显⽰总分数usergrade.setText("总分数: "+user.getUsergrade());//显⽰当前关卡levels.setText("关卡:"+levs+"");Main maker=new Main();maker.diger(grade, level);gamearr=maker.getArr();answerarr=maker.getAnswer();for(int i=0;i<9;i++){for(int j=0;j<9;j++)System.out.println();}System.out.println("###################");//先清空九宫格for(int i=0;i<9;i++)for(int j=0;j<9;j++){if(gamearr[i][j]!=0){numberFields[i][j].setText(gamearr[i][j]+"");numberFields[i][j].setBackground(lightGray);numberFields[i][j].setForeground(Color.BLACK);//加监听器!}else{numberFields[i][j].setText("");numberFields[i][j].setBackground(Color.WHITE);numberFields[i][j].setForeground(Color.BLACK);}}//开始计时startTime();}//游戏开始计时public void startTime(){//游戏开始计时!time = new Timer();task = new TimerTask() {int count = usedtim;@Overridepublic void run() {timeLabel.setText(gettime(count));count++;}};time.schedule(task, 1000L, 1000L); // 开始游戏时⾃动计时 }//时间重新计时public void restartTime(){//删除time记录,要使⽤过才能删除time.cancel();time=new Timer();timeLabel.setText("00:00");task = new TimerTask() {int count = 1;@Overridepublic void run() {timeLabel.setText(gettime(count));count++;}};time.schedule(task, 1000L, 1000L);}//将时间转换成分:秒public String gettime(int count){String second = null;String minute = null;if (count / 60 < 10) {minute = "0" + (count / 60);} else {minute = "" + (count / 60);}if (count % 60 < 10) {second = ":0" + count % 60;} else {second = ":" + count % 60;}return minute + second;}//重玩该关public void again(){//重新设置for(int i=0;i<9;i++)for(int j=0;j<9;j++){if(gamearr[i][j]!=0){numberFields[i][j].setBackground(lightGray);//加监听器!}}}//输出答案!!public void answer(){//gamearr中为0的地⽅放答案!!for(int i=0;i<9;i++)for(int j=0;j<9;j++){if(gamearr[i][j]==0){numberFields[i][j].setText(answerarr[i][j]+"");numberFields[i][j].setForeground(Color.RED);}}}//清空九宫格重新对获取新数独public void resetfields(){for(int i=0;i<9;i++)for(int j=0;j<9;j++){numberFields[i][j].setText("");numberFields[i][j].setBackground(Color.WHITE);}}//下⾯为各事件的处理//右边处理数独按钮监听器(难度类别监听,换⼀题,重玩,答案) class funactionListener implements ActionListener{//难度监听器String btnstr;@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubbtnstr=e.getActionCommand();if(btnstr.equals("容易")){grade=40;//若选择按钮难度为容易,重新开始游戏resetfields();newGame(grade,levs);restartTime();}else if(btnstr.equals("中等")){grade=45;//若选择按钮难度为中等,重新开始游戏resetfields();newGame(grade,levs);restartTime();}else if(btnstr.equals("难")){//同上grade=50;resetfields();newGame(grade,levs);restartTime();}else if(btnstr.equals("换⼀题")){resetfields();newGame(grade,levs);restartTime();}//重新开始计分else if(btnstr.equals("重玩")){resetfields();again();restartTime();}//将分归零else if(btnstr.equals("答案")){answer();time.cancel();isanswer=true;}}}//九宫格数组的监听器class textfocusaction implements FocusListener{//该各⾃获得焦点@Overridepublic void focusGained(FocusEvent e) {// TODO Auto-generated method stubJTextField jt=(JTextField) e.getSource();//点击之前还原颜⾊replace();sameNumber(jt);}//该格⼦失去焦点,将颜⾊还原@Overridepublic void focusLost(FocusEvent e) {// TODO Auto-generated method stublabelsc.setVisible(false);replace();}}//处理获得焦点的⽂本格⼦public void sameNumber(JTextField jt){String name=jt.getName();System.out.println(name);int x=Integer.parseInt(name.substring(0,1));int y=Integer.parseInt(name.substring(1));String number=jt.getText();//System.out.println(x+" "+y);if(gamearr[x][y]!=0){sx=10;sy=10;}else{sx=x;sy=y;System.out.println(sx+" "+sy);//格⼦为空if(number.equals("")){//使该⾏该列和该⼩九宫格的颜⾊置blue,提醒⽤户for(int i=0;i<9;i++){numberFields[i][sy].setBackground(blue);numberFields[sx][i].setBackground(blue);}for(int i=(sx/3)*3;i<((sx/3)+1)*3;i++)for(int j=(sy/3)*3;j<((sy/3)+1)*3;j++)numberFields[i][j].setBackground(blue);numberFields[sx][sy].setBackground(green);}//格⼦不为空,使与格⼦相同的数显⽰粉⾊else{for(int i=0;i<9;i++)for(int j=0;j<9;j++)if(numberFields[i][j].getText().equals(number))numberFields[i][j].setBackground(Color.pink);}}}//使格⼦颜⾊还原public void replace(){if(sx<10&&sy<10){for(int i=0;i<9;i++){if(gamearr[i][sy]!=0)numberFields[i][sy].setBackground(lightGray);elsenumberFields[i][sy].setBackground(Color.WHITE);if(gamearr[sx][i]!=0)numberFields[sx][i].setBackground(lightGray);elsenumberFields[sx][i].setBackground(Color.WHITE);}for(int i=(sx/3)*3;i<((sx/3)+1)*3;i++)for(int j=(sy/3)*3;j<((sy/3)+1)*3;j++)if(gamearr[i][j]!=0)numberFields[i][j].setBackground(lightGray);elsenumberFields[i][j].setBackground(Color.WHITE);for(int i=0;i<9;i++)for(int j=0;j<9;j++)if(numberFields[i][j].getText().equals(numberFields[sx][sy].getText())&&!(i==sx&&j==sy)){ if(gamearr[i][j]!=0)numberFields[i][j].setBackground(lightGray);elsenumberFields[i][j].setBackground(Color.WHITE);}}}//为下⽅的按钮增加监听器class buttonaction implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubString btnstr;btnstr=e.getActionCommand();replace();//如果按钮为清除,则将格⼦置空if(btnstr.equals("清除")&&(sx<10&&sy<10)){numberFields[sx][sy].setText("");numberFields[sx][sy].setBackground(Color.white);}//若为其他的,在格⼦中放⼊值else if(sx<10&&sy<10){numberFields[sx][sy].setText(btnstr);numberFields[sx][sy].setForeground(Color.blue);numberFields[sx][sy].setBackground(Color.white);//判断值放的是否正确,若不正确,则将该值和相冲突的格⼦背景颜⾊置为红⾊ jugewrong(btnstr);}}}//判断值放的是否正确,若不正确,则将该值和相冲突的格⼦背景颜⾊置为红⾊ public void jugewrong(String number){boolean flag=false; //该值是否正确//⾏列是否有相同的for(int i=0;i<9;i++){if(i!=sy&&(numberFields[sx][i].getText().equals(number))){numberFields[sx][i].setBackground(Color.red);flag=true;}if(i!=sx&&(numberFields[i][sy].getText().equals(number))){numberFields[i][sy].setBackground(Color.red);flag=true;}}//⼩九宫格内是否有已经存在过这个值for(int i=(sx/3)*3;i<((sx/3)+1)*3;i++)for(int j=(sy/3)*3;j<((sy/3)+1)*3;j++){if(!(i==sx&&j==sy)&&(numberFields[i][j].getText().equals(number))){numberFields[i][j].setBackground(Color.red);flag=true;}}if(flag){labelsc.setText("已有该数字,请检查!");labelsc.setFont(new Font("⽅正仿宋简体", Font.BOLD, 21));labelsc.setForeground(Color.RED);labelsc.setVisible(true);}else{//挑战成功后if(isanswer==false&&gamesc()){//关卡加⼀levs++;time.cancel();String runtime=new String();runtime=timeLabel.getText();System.out.println(runtime);//转换成秒int tim=((runtime.charAt(0)-48)*10+(runtime.charAt(1))-48)*60+(runtime.charAt(3)-48)*10+runtime.charAt(4)-48;//计分规则System.out.println(tim);if(grade==40){if(tim<=180)gamegrade=80;else if(tim<=600)gamegrade=70;else if(tim<=1800)gamegrade=60;elsegamegrade=50;}else if(grade==45){if(tim<=180)gamegrade=90;else if(tim<=600)gamegrade=85;else if(tim<=1800)gamegrade=75;elsegamegrade=65;}else{if(tim<=180)gamegrade=100;else if(tim<=600)gamegrade=90;else if(tim<=1800)gamegrade=85;elsegamegrade=80;}user.setUsergrade(user.getUsergrade()+gamegrade);System.out.println(user.getUsergrade());UserDao dao=new UserDao();dao.modifyuser(user);//弹出⼀个成功的对话框!Object[] options = { "查看排名", "继续挑战"};//查看排名是0,继续挑战是1int x = JOptionPane.showOptionDialog(null, "挑战成功!分数为"+gamegrade, "挑战成功!",JOptionPane.DEFAULT_OPTION, RMATION_MESSAGE, null, options, options[0]);System.out.println(x);if(x==0){rank ranker;ranker=new rank();//newGame(grade);}else{newGame(grade,levs);}}}}//判断点完之后数独是否成功!public boolean gamesc(){for(int i=0;i<9;i++)for(int j=0;j<9;j++){System.out.println(numberFields[i][j].getText());System.out.println("点击!");if(numberFields[i][j].getText().equals("")){// System.out.println("111失败!");return false;}for(int k=0;k<9;k++)if((k!=j&&numberFields[i][k].getText().equals(numberFields[i][j].getText()))||(k!=i&&numberFields[k][j].getText().equals(numberFields[i][j].getText()))){ numberFields[i][j].setBackground(Color.RED);numberFields[i][k].setBackground(Color.red);return false;}for(int m=(i/3)*3;m<(i/3+1)*3;m++)for(int n=(j/3)*3;n<(j/3+1)*3;n++)if(!(m==i&&n==j)&&(numberFields[m][n].getText().equals(numberFields[i][j].getText()))){return false;}}System.out.println("成功!");return true;}}最后⽣成数独页⾯的效果如下:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
五字格数独算法java解析
五字格数独算法java解析五字格数独是一种数独变体,与传统数独不同的是,每个格子内只能填入五个数字,且每行、每列和每个九宫格内的数字不能重复。
本文将介绍使用Java编写的五字格数独算法。
在解析五字格数独算法之前,我们先来了解一下传统数独算法。
传统数独是一种逻辑推理游戏,由一个9x9的网格组成,其中每个格子内填入1至9的数字,使得每行、每列和每个九宫格内的数字都不重复。
传统数独的解题思路一般是通过递归和回溯的方法,尝试填入数字,并判断是否满足条件,如果满足则继续填入下一个数字,如果不满足则回溯到上一个状态,重新选择数字。
而五字格数独算法则是在传统数独的基础上进行了一些修改。
首先,每个格子内只能填入五个数字,而不是1至9的数字。
其次,每行、每列和每个九宫格内的数字也不能重复。
这样的修改增加了数独的难度,也带来了更多的挑战。
针对五字格数独,我们可以使用类似传统数独算法的思路来解题。
首先,我们需要定义一个9x9的二维数组来表示数独的初始状态,其中空白格子用0表示。
然后,我们可以编写一个递归函数,通过遍历每个格子,并尝试填入数字来解题。
在递归函数中,我们首先需要找到一个还没有填入数字的空白格子。
然后,我们可以尝试填入1至5的数字,并判断是否满足每行、每列和每个九宫格内的数字不重复的条件。
如果满足条件,则继续递归地调用函数,尝试填入下一个空白格子。
如果不满足条件,则回溯到上一个状态,重新选择数字。
当所有的格子都填满数字时,即找到了一个解。
在编写递归函数时,我们可以使用一个辅助函数来判断某个数字是否满足每行、每列和每个九宫格内的数字不重复的条件。
该函数可以通过遍历相应的行、列和九宫格来判断是否存在重复的数字。
如果存在重复的数字,则返回false,否则返回true。
除了递归函数,我们还可以编写一个辅助函数来输出解题结果。
该函数可以遍历数独的二维数组,并将数字打印出来。
这样,当我们找到一个解时,就可以将解题结果输出。
数独计算器源码(java语言)
/*这是本人最近做的一个数独计算器程序。
1.该程序由java编写。
2.该程序具有界面3.把以下代码复制到记事本上保存为java文件。
4.javac Test8.java ,然后再java Test8,你懂的。
5.再图形中输入已知的数字,点击确定,图形中就会出现解。
*/import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.ArrayList;import java.util.Iterator;import java.util.TreeSet;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextField;class Myframe extends JFrame{public static Object obj=new Object();public final static JTextField[][] filed=new JTextField[9][9]; public Myframe(){for(int a=0;a<9;a++){for(int b=0;b<9;b++){filed[a][b]=new JTextField();filed[a][b].setText("");}}JPanel jpan=new JPanel();jpan.setLayout(new GridLayout(9,9));for(int a=8;a>-1;a--){for(int b=0;b<9;b++){jpan.add(filed[b][a]);}}add(jpan,BorderLayout.CENTER);JPanel jpb=new JPanel();JButton button=new JButton("确定");jpb.add(button);button.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){synchronized (obj) {for(int a=0;a<9;a++){for(int b3=0;b3<9;b3++){int pp=0;if(!(filed[a][b3].getText().trim().equals(""))){pp=Integer.parseInt(filed[a][b3].getText().trim());Jieda.b[a][b3]=pp;}}}}synchronized (obj) {new Thread(new Jieda()).start();}}});add(jpb,BorderLayout.SOUTH);}}public class Test8{public static void main(String[] args) {Myframe myf=new Myframe();myf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);myf.setTitle("数独");myf.setSize(500,500);myf.setVisible(true);}}class Jieda implements Runnable{public static boolean[][] boo=new boolean[9][9];public static int shanghang=0;public static int shanglie=0;public static int[][] b=new int[9][9];public static void Huigui(boolean[][] boo1,int hang,int lie){int s=lie*9+hang;s--;int shang=s/9;int yushu=s%9;if(boo1[yushu][shang]){Huigui(boo1,yushu,shang);}else{shanghang=yushu;shanglie=shang;}}public static void arrayAdd(ArrayList<Integer> array,TreeSet<Integer> tree){for(int z=1;z<10;z++){boolean flag3=true;Iterator<Integer> it=tree.iterator();while(it.hasNext()){//10int b=it.next().intValue();if(z==b){flag3=false;break;}}if(flag3){array.add(new Integer(z));}flag3=true;}}public static ArrayList<Integer> Maybe(int hang,int lie){ ArrayList<Integer> array=new ArrayList<Integer>();TreeSet<Integer> tree=new TreeSet<Integer>();if(0<=hang&&hang<=2&&0<=lie&&lie<=2){for(int a=0;a<9;a++){if(a!=lie&&b[hang][a]!=0){tree.add(new Integer(b[hang][a]));}}for(int b1=0;b1<9;b1++){if(b1!=hang&&b[b1][lie]!=0){tree.add(new Integer(b[b1][lie]));}}for(int a2=0;a2<3;a2++){for(int b4=0;b4<3;b4++){if((!(a2==hang&&b4==lie))&&b[a2][b4]!=0){tree.add(new Integer(b[a2][b4]));}}}arrayAdd(array,tree);}else if(0<=hang&&hang<=2&&3<=lie&&lie<=5){for(int a=0;a<9;a++){if(a!=lie&&b[hang][a]!=0){tree.add(new Integer(b[hang][a]));}for(int b1=0;b1<9;b1++){if(b1!=hang&&b[b1][lie]!=0){tree.add(new Integer(b[b1][lie]));}}for(int a2=0;a2<3;a2++){for(int b4=3;b4<6;b4++){if((!(a2==hang&&b4==lie))&&b[a2][b4]!=0){tree.add(new Integer(b[a2][b4]));}}}arrayAdd(array,tree);}else if(0<=hang&&hang<=2&&6<=lie&&lie<=8){ for(int a=0;a<9;a++){if(a!=lie&&b[hang][a]!=0){tree.add(new Integer(b[hang][a]));}}for(int b1=0;b1<9;b1++){if(b1!=hang&&b[b1][lie]!=0){tree.add(new Integer(b[b1][lie]));}}for(int a2=0;a2<3;a2++){for(int b4=6;b4<9;b4++){if((!(a2==hang&&b4==lie))&&b[a2][b4]!=0){tree.add(new Integer(b[a2][b4]));}}}arrayAdd(array,tree);}else if(3<=hang&&hang<=5&&0<=lie&&lie<=2){ for(int a=0;a<9;a++){if(a!=lie&&b[hang][a]!=0){tree.add(new Integer(b[hang][a]));}}for(int b1=0;b1<9;b1++){if(b1!=hang&&b[b1][lie]!=0){tree.add(new Integer(b[b1][lie]));}for(int a2=3;a2<6;a2++){for(int b4=0;b4<3;b4++){if((!(a2==hang&&b4==lie))&&b[a2][b4]!=0){tree.add(new Integer(b[a2][b4]));}}}arrayAdd(array,tree);}else if(3<=hang&&hang<=5&&3<=lie&&lie<=5){ for(int a=0;a<9;a++){if(a!=lie&&b[hang][a]!=0){tree.add(new Integer(b[hang][a]));}}for(int b1=0;b1<9;b1++){if(b1!=hang&&b[b1][lie]!=0){tree.add(new Integer(b[b1][lie]));}}for(int a2=3;a2<6;a2++){for(int b4=3;b4<6;b4++){if((!(a2==hang&&b4==lie))&&b[a2][b4]!=0){tree.add(new Integer(b[a2][b4]));}}}arrayAdd(array,tree);}else if(3<=hang&&hang<=5&&6<=lie&&lie<=8){ for(int a=0;a<9;a++){if(a!=lie&&b[hang][a]!=0){tree.add(new Integer(b[hang][a]));}}for(int b1=0;b1<9;b1++){if(b1!=hang&&b[b1][lie]!=0){tree.add(new Integer(b[b1][lie]));}}for(int a2=3;a2<6;a2++){for(int b4=6;b4<9;b4++){if((!(a2==hang&&b4==lie))&&b[a2][b4]!=0){tree.add(new Integer(b[a2][b4]));}}}arrayAdd(array,tree);}else if(6<=hang&&hang<=8&&0<=lie&&lie<=2){ for(int a=0;a<9;a++){if(a!=lie&&b[hang][a]!=0){tree.add(new Integer(b[hang][a]));}}for(int b1=0;b1<9;b1++){if(b1!=hang&&b[b1][lie]!=0){tree.add(new Integer(b[b1][lie]));}}for(int a2=6;a2<9;a2++){for(int b4=0;b4<3;b4++){if((!(a2==hang&&b4==lie))&&b[a2][b4]!=0){tree.add(new Integer(b[a2][b4]));}}}arrayAdd(array,tree);}else if(6<=hang&&hang<=8&&3<=lie&&lie<=5){ for(int a=0;a<9;a++){if(a!=lie&&b[hang][a]!=0){tree.add(new Integer(b[hang][a]));}}for(int b1=0;b1<9;b1++){if(b1!=hang&&b[b1][lie]!=0){tree.add(new Integer(b[b1][lie]));}}for(int a2=6;a2<9;a2++){for(int b4=3;b4<6;b4++){if((!(a2==hang&&b4==lie))&&b[a2][b4]!=0){tree.add(new Integer(b[a2][b4]));}}}arrayAdd(array,tree);}else if(6<=hang&&hang<=8&&6<=lie&&lie<=8){ for(int a=0;a<9;a++){if(a!=lie&&b[hang][a]!=0){tree.add(new Integer(b[hang][a]));}}for(int b1=0;b1<9;b1++){if(b1!=hang&&b[b1][lie]!=0){tree.add(new Integer(b[b1][lie]));}}for(int a2=6;a2<9;a2++){for(int b4=6;b4<9;b4++){if((!(a2==hang&&b4==lie))&&b[a2][b4]!=0){tree.add(new Integer(b[a2][b4]));}}}arrayAdd(array,tree);}return array;}public void run() {for(int a=0;a<9;a++){for(int b1=0;b1<9;b1++){if(b[a][b1]!=0){boo[a][b1]=true;}else{boo[a][b1]=false;}}}boolean flag=true;ArrayList<Integer>[][] yinyong=new ArrayList[9][9]; int hang=0;int lie=0;while(lie<9){if(flag==true){hang=0;}while(hang<9){if(b[hang][lie]==0){if(flag){ArrayList<Integer> list=Maybe(hang,lie);yinyong[hang][lie]=list;}if(yinyong[hang][lie].isEmpty()){Huigui(boo,hang,lie);hang=shanghang;lie=shanglie;b[hang][lie]=0;lie--;flag=false;break;}//if(list.isEmpty())else{b[hang][lie]=yinyong[hang][lie].get(0);yinyong[hang][lie].remove(0);flag=true;boolean r=true;for(int a1=0;a1<9;a1++){for(int b1=0;b1<9;b1++){if(r==false){break;}if(b[a1][b1]==0){r=false;}}}if(r){for(int a1=0;a1<9;a1++){for(int b1=0;b1<9;b1++){System.out.print("b["+a1+"]["+b1+"]"+b[a1][b1]+","); Myframe.filed[a1][b1].setText(b[a1][b1]+"");}}}}}//if(int[hang][lie]==0)else{flag=true;}hang++;}lie++;}}}。
简单实现java数独游戏
简单实现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",RMATION_MESSAGE); }else{JOptionPane.showMessageDialog(null, "Your answer is wrong!","Result",RMATION_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",RMATION_MESSAGE); }}class messageListenerClass implements ActionListener{public void actionPerformed(ActionEvent e){JOptionPane.showMessageDialog(null, "made by wyx","Message",RMATION_MESSAGE);}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
java程序计算数独游戏
java程序计算数独游戏兴趣来了,写了个简单的数独游戏计算程序,未做算法优化。
通过⽂件来输⼊⼀个⼆维数组,9⾏,每⾏9个数组,数独游戏中需要填空的地⽅⽤0来表⽰。
结果也是打印⼆维数组。
1import java.io.File;2import java.util.List;3//代表数独中的⼀个单元格位置4public class Cell {56// 所在⾏7public int row;8// 所在列9public int colum;10// 值11public int value;1213public static int rowMax = 9;1415public static int columMax = 9;1617public static Cell[][] pan = new Cell[rowMax][columMax];1819// 初期化数独游戏20public static void init() {21// 数独盘上的值输⼊下⾯⽂件中,共9⾏,每⾏9个数字22// 0表⽰需要计算的空着的区域,23// eg:24// -----------------------25// 00830910026// 90006000427// 00750480028// 03600054029// 00100060030// 04200097031// 00590730032// 60001000833// 00460820034// -------------------------35 File f = new File("conf/sd.txt");36 List<List<Integer>> list = SDUtil.initQiPan(f);37for (int i = 0; i < rowMax; i++) {38for (int j = 0; j < columMax; j++) {39 pan[i][j] = new Cell(i, j);40 pan[i][j].value = list.get(i).get(j);41 }42 }43 }4445// 取得下⼀个需要计算的位置46public Cell getNext() {47 Cell next = null;48int row = 0;49int colum = 0;50if (this.row + 1 < rowMax) {51 row = this.row + 1;52 colum = this.colum;53 } else if (this.colum + 1 < columMax) {54 row = 0;55 colum = this.colum + 1;56 } else {57return null;58 }59 next = pan[row][colum];60return next;61 }6263private Cell(int row, int colum) {64this.row = row;65this.colum = colum;66 }6768 }1import java.io.BufferedReader;2import java.io.File;3import java.io.FileReader;4import java.util.ArrayList;5import java.util.List;67public class SDUtil {89//把配置⽂件转换成⼆维列表10public static List<List<Integer>> initQiPan(File f) {11 List<List<Integer>> list = new ArrayList<List<Integer>>();12try {13 BufferedReader br = new BufferedReader(new FileReader(f));14 String s;15while ((s = br.readLine()) != null) {16 s = s.trim();17char[] car = s.toCharArray();18 List<Integer> l = new ArrayList<Integer>();19for (int i = 0; i < 9; i++) {20 l.add(Integer.parseInt("" + car[i]));21 }22 list.add(l);23 }24 br.close();25 } catch (Exception e) {26 e.printStackTrace();27 }28return list;29 }30 }1import java.util.ArrayList;2import java.util.Arrays;3import java.util.List;45public class ShuDu {67static List<String> allNum = Arrays.asList("1", "2", "3", "4", "5", "6", 8 "7", "8", "9");910public static void main(String[] args) {11 begin();1213 }1415public static void begin() {16//初期化,数独中原有的数字装⼊17 Cell.init();18//第⼀个位置取得19 Cell beginCell = Cell.pan[0][0];20//计算21 insertCell(beginCell);22 }2324//打印结果25public static void printOkValue() {26for (int i = 0; i < Cell.rowMax; i++) {27for (int j = 0; j < Cell.columMax; j++) {28 System.out.print(Cell.pan[i][j].value + " ");29 }30 System.out.println();31 }32 }3334//计算并插⼊正确的值(主要逻辑⽅法)35public static boolean insertCell(Cell cell) {36if (cell.value == 0) {37 List<String> canList = getCanInList(cell.row, cell.colum);38if (canList.size() == 0) {39return false;40 }41for (String can : canList) {42 cell.value = Integer.parseInt(can);43 Cell nextCell = cell.getNext();44if (nextCell != null) {45boolean b = insertCell(nextCell);46if (b) {47return true;48 }49 } else {50 printOkValue();51 System.exit(0);52 ;53 }54 }55 cell.value = 0;56 } else {57 Cell nextCell = cell.getNext();58if (nextCell != null) {59boolean b = insertCell(nextCell);60if (b) {61return true;62 }63 } else {64 printOkValue();65 System.exit(0);66 ;67 }68 }6970return false;71 }7273//取得所在位置的所有可能数字列表74public static List<String> getCanInList(int row, int colum) {75 List<String> canList = new ArrayList<String>();76 canList.addAll(allNum);77 lineValidate(canList, row, colum, Cell.columMax);78 columValidate(canList, row, colum, Cell.rowMax);79 blockValidate(canList, row, colum);80return canList;81 }8283//⾏验证84public static void lineValidate(List<String> set, int row, int colum,85int max) {86for (int i = 0; i < max; i++) {87 String value = Cell.pan[row][i].value + "";88if (value.equals("0")) {89continue;90 }91 set.remove(value);92 }93 }9495//列验证96public static void columValidate(List<String> set, int row, int colum,97int max) {98for (int i = 0; i < max; i++) {99 String value = Cell.pan[i][colum].value + "";100if (value.equals("0")) {101continue;102 }103 set.remove(value);104 }105 }106107//所求位置所在的9个块验证108public static void blockValidate(List<String> canList, int row, int colum) { 109int blockRow = row / 3 * 3;110int blockColum = colum / 3 * 3;111for (int i = 0 + blockRow; i < 3 + blockRow; i++) {112for (int j = 0 + blockColum; j < 3 + blockColum; j++) {113 String value = Cell.pan[i][j].value + "";114if (value.equals("0")) {115continue;116 }117 canList.remove(value);118 }119 }120 }121 }。
java数独小游戏课程设计
java数独小游戏课程设计一、课程目标知识目标:1. 学生能理解数独游戏的规则和基本概念;2. 学生掌握运用Java语言实现数独小游戏的基本算法;3. 学生了解数独问题求解过程中涉及的逻辑推理和问题分析方法。
技能目标:1. 学生能够运用所学知识,编写Java程序完成数独小游戏的开发;2. 学生通过数独游戏实践,培养逻辑思维和问题解决能力;3. 学生学会使用调试工具,优化程序性能,提高代码质量。
情感态度价值观目标:1. 学生培养对编程的兴趣和热情,激发学习Java语言的积极性;2. 学生通过团队合作完成项目,提升团队协作能力和沟通能力;3. 学生在解决问题的过程中,培养面对困难勇于挑战的精神和坚持不懈的品质。
分析课程性质、学生特点和教学要求:1. 课程性质:本课程为Java语言编程实践课程,通过数独小游戏的设计与实现,让学生将理论知识与实际应用相结合。
2. 学生特点:学生已经具备一定的Java基础,了解基本语法和编程规范,但对复杂算法和实际项目开发尚缺乏经验。
3. 教学要求:注重培养学生的编程实践能力,鼓励学生独立思考和团队协作,提高解决实际问题的能力。
二、教学内容1. 数独游戏基本概念与规则介绍- 数独游戏的历史背景- 数独游戏的规则说明- 数独解题策略概述2. Java编程基础回顾- Java基本数据类型- Java控制结构(循环、分支)- Java数组的使用3. 数独小游戏算法设计- 数独游戏棋盘的表示方法- 数独游戏生成算法- 数独游戏解题算法4. Java数独小游戏编程实践- 开发环境配置与使用- 数独游戏棋盘类设计- 数独游戏控制类设计- 数独游戏用户界面设计5. 程序调试与优化- 代码调试技巧- 性能优化策略- 代码规范与重构6. 项目展示与评价- 团队合作成果展示- 项目评价标准与反馈- 学生互评与教师评价教学内容安排与进度:第一课时:数独游戏基本概念与规则介绍,Java编程基础回顾第二课时:数独小游戏算法设计,数独游戏棋盘类设计第三课时:数独游戏控制类设计,数独游戏用户界面设计第四课时:程序调试与优化,项目展示与评价教学内容与教材关联性:本教学内容与教材中Java语言编程、数组、控制结构等章节密切相关,通过数独小游戏项目实践,让学生巩固所学知识,并提高实际应用能力。
java数独课程设计
java数独课程设计一、课程目标知识目标:1. 理解数独游戏的规则及解题策略;2. 掌握Java编程语言的基本语法和数组的使用;3. 学会使用嵌套循环和条件判断实现数独解题过程的编程表示;4. 了解数独问题在计算机科学中的应用。
技能目标:1. 能够运用所学知识编写简单的数独解题程序;2. 能够通过调试和修改代码,优化数独解题算法;3. 能够运用数独解题过程锻炼逻辑思维和问题解决能力;4. 能够与同伴合作交流,共同完成数独课程的实践任务。
情感态度价值观目标:1. 培养学生对编程的兴趣和热情,增强对计算机科学的认识;2. 培养学生面对问题时的耐心和毅力,勇于克服困难;3. 培养学生团队合作意识,学会倾听、尊重他人意见;4. 培养学生认识到编程在生活中的实际应用,激发创新精神。
本课程针对高年级学生,结合Java编程语言和数独游戏,以提高学生的编程能力和逻辑思维能力为核心。
通过分析课程性质、学生特点和教学要求,将课程目标分解为具体的学习成果,为后续教学设计和评估提供依据。
在教学过程中,注重理论与实践相结合,鼓励学生动手实践和合作交流,实现课程目标的达成。
二、教学内容1. 数独游戏规则及解题策略介绍- 数独游戏的历史与规则- 常见数独解题技巧:唯一数字法、排除法、唯一候选数法等2. Java基本语法与数组- Java变量、数据类型和运算符- 控制结构:顺序结构、分支结构、循环结构- 数组的概念、声明、初始化和使用3. 数独解题程序的编写- 嵌套循环和条件判断在数独解题中的应用- 数独解题算法的实现:回溯法、递归等- 代码优化与调试4. 实践任务与案例分析- 简单数独解题程序编写与测试- 数独解题算法优化实践- 团队合作完成数独项目5. 课后拓展与应用- 数独游戏在计算机科学领域的应用- 探索数独解题的优化算法- Java编程在解决实际问题中的应用本教学内容依据课程目标,结合课本内容,制定详细的教学大纲。
在教学过程中,按照教学内容的安排和进度,引导学生从数独游戏入门,逐步掌握Java编程语言及其在数独解题中的应用。
JAVA数独(九宫格)游戏软件设计报告(推荐文档)
data[i][j]=k; row[i][k]=1; col[j][k]=1;
sql[(i+2)/3][(j+2)/3][k]=1;
if( DFS()==1 )
return 1;
2
2.1数独游戏分析
数独游戏组成元素:
单元格:数独中最小的单元,标准数独中共有81个;
行:横向9个单元格的集合;
列:纵向9个单元格的集合;
宫:粗黑线划分的区域,标准数独中为3×3的9个单元格的集合;
已知数:数独初始盘面给出的数字;
候选数:每个空单元格中可以填入的数字。
基本解法:
利用1~9的数字在每一行、每一列、每一宫都只能出现一次的规则进行解题的方法。使用单元排除法的目的就是要在某一单元(即行,列或区块)中找到能填入某一数字的唯一位置,换句话说,就是把单元中其他的空白位置都排除掉。
网格布局:
panel_txt.add(panel[i]); //添加组件
int m=(i+2)/3*3-2; //生成九个3*3的网格,并添加数字
int n=((i-1)%3+1)*3-2;
for(int j=m;j<=m+2;j++){
for(int k=n;k<=n+2;k++){
panel[i].add(text[j][k]);
static int hard=2; //默认初始难度为2
static int datahard[]={2,3,5}; //不同的难度
数独游戏-如何用代码实现(思路分析)
数独游戏-如何⽤代码实现(思路分析)数独游戏-如何⽤代码实现最近开始喜欢起来玩数独,在⼿机上找来⼏个数独⼩游戏玩着玩着突然想起我是个程序员.........那我何不⾃⼰写⼀个数独软件,⽹上查了⼀下数独有6,670,903,752,021,072,936,960(约有6.67×10的21次⽅)种组合。
我xxxx.......算了算了不想那么多了,先⾃⼰尝试做⼀个简单的下⾯的是我设计思路⾸先给没有玩过的同学普及⼀下数独:数独(shù dú)是源⾃18世纪瑞⼠的⼀种数学游戏。
是⼀种运⽤纸、笔进⾏演算的逻辑游戏。
玩家需要根据9×9盘⾯上的已知数字,推理出所有剩余空格的数字,并满⾜每⼀⾏、每⼀列、每⼀个粗线宫(3*3)内的数字均含1-9,不重复那么第⼀件事考虑如何如何⽣成⼀个9*9并且每⼀⾏,每⼀列,每⼀宫都不重复的⼆维数组?突然我灵机⼀动,如果..我⼿写个⼆维数组怎么样.int[][] arrray1 = new int[9][];arrray1[0] = new int[9] { 5, 6, 4, 8, 9, 7, 2, 3, 1 };arrray1[1] = new int[9] { 9, 7, 8, 3, 1, 2, 6, 4, 5 };arrray1[2] = new int[9] { 3, 1, 2, 6, 4, 5, 9, 7, 8 };arrray1[3] = new int[9] { 6, 4, 5, 9, 7, 8, 3, 1, 2 };arrray1[4] = new int[9] { 7, 8, 9, 1, 2, 3, 4, 5, 6 };arrray1[5] = new int[9] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };arrray1[6] = new int[9] { 4, 5, 6, 7, 8, 9, 1, 2, 3 };arrray1[7] = new int[9] { 8, 9, 7, 2, 3, 1, 5, 6, 4 };arrray1[8] = new int[9] { 2, 3, 1, 5, 6, 4, 8, 9, 7 };嗯~ o( ̄▽ ̄)o感觉也不是不可以,如果每⾏扣去4个的话 C94 有126种那⼀共应该有1134种组合上⾯的数组是固定的如果在写⼏组数组呢?好像是可以有更多的组合但是成本太⾼,并且要找到每⼀宫每⼀列都不重复的组合也需要花费些时间⽽且也失去了乐趣,换⼀个⾓度想如果不能变当前这个⼆维数组,可不可以通过其他⽅式来改变这个数组,可以使⽤⼀个⼀位数组同样是1-9的数字,通过判断⼆维数组中和⼀维数组相等的数据并取下⼀个位置的值,⽬的就是让⼀维数组把⼆维数组中的值循环变⼀下,因为⼀维数组也是1-9的不重复数字因此不会影响到⾏和列及宫的组合,⼤家可以⾃⾏验证⼀下.private static int[][] creatSudokuArray(int[][] seedArray, List<int> randomList){for (int i = 0; i < 9; i++){for (int j = 0; j < 9; j++){for (int k = 0; k < 9; k++){if (seedArray[i][j] == randomList[k]){seedArray[i][j] = randomList[(k + 1) % 9];break;}}}}return seedArray;}这样⽣成的数独也就有9!=362880 在通过扣掉若⼲个格⼦那最终的结果OK 数独⽣成了那下⾯具体就是需要去画⼀个9*9的矩阵并且把⽣成的数独填充进去然后扣掉部分我这⾥使⽤的是winform实现的具体填充代码就不说了下⾯会给贴出github的源码地址⼤家可以去下载,主要还是说思路.扣数据部分也是⽤随机数来操作的单纯的去掉⼏个感觉太死板了,附代码/// <summary>/// ⽣成数独选择难度/// </summary>/// <param name="a"></param>private void printArray(int[][] a){int length = 4;switch (boBox1.Text){case "简单":length = 4;break;case "中等":length = 5;break;case "困难":length = 6;break;}Random random = new Random();for (int i = 0; i < 9; i++){for (int j = 0; j < 9; j++){int randomNum = random.Next(9);if (randomNum > length){tbArray[i, j].Text = a[i][j].ToString();}else{tbArray[i, j].ReadOnly = false;}}}}最后就是要去验证⾃⼰填进去的数字是否满⾜数独的要求那么我们就需要每⼀⾏,每⼀列,每⼀宫的检查,⾏和列很简单只要验证当前⾏或者列是否有重复数据或者去重之后的长度是否⼩于9即可,相信⼤家可以通过各种语⾔来实现了把,下⾯贴出我的代码/// <summary>/// 校验⾏/// </summary>public bool rowCheck(){for (int y = 0; y < 9; y++)List<int> lines = new List<int>();for (int x = 0; x < 9; x++){string value = tbArray[x, y].Text;if (!String.IsNullOrEmpty(value)){lines.Add(Convert.ToInt32(value));}else{MessageBox.Show("请确认是否填写完毕");return false;}}if (lines.Distinct().Count() < 9){MessageBox.Show("验证失败,请检查完重新提交");return false;}}return true;}/// <summary>/// 校验列/// </summary>public bool cellCheck(){for (int y = 0; y < 9; y++){List<int> lines = new List<int>();for (int x = 0; x < 9; x++){string value = tbArray[y, x].Text;if (!string.IsNullOrEmpty(value)){lines.Add(Convert.ToInt32(value));}else{MessageBox.Show("请确认是否填写完毕");return false;}}if (lines.Distinct().Count() < 9){MessageBox.Show("验证失败,请检查完重新提交");return false;}}return true;}那么每⼀宫怎么检验呢?其实和⾏列的⽅法相识我们可以吧每⼀宫的数据计算出来放到⼀个数组中最后相同的⽅式去判断即可 /// <summary>/// 校验九宫格每⼀宫是否有重复/// </summary>public bool palaceCheck(){int[,] newArrary = block();for (int y = 0; y < 9; y++){List<int> lines = new List<int>();for (int x = 0; x < 9; x++){lines.Add(newArrary[x, y]);}if (lines.Distinct().Count() < 9){MessageBox.Show("验证失败,请检查完重新提交");return false;}}return true;}//将每块的数字保存⾄⼀个⼆维数组public int[,] block(){int[,] b = new int[9, 9];for (int i = 0; i < 9; i++)for (int j = 0; j < 9; j++)//将数独从左⾄右从上⾄下分为9块,求该单元格属于第⼏块,将该块数字保存⾄b第⼏⾏ int rowOfB = i / 3 * 3 + j / 3;//每块有9个数字,求该数字属于第⼏个,保存⾄b第⼏列int columnOfB = i % 3 * 3 + j % 3;b[rowOfB, columnOfB] = Convert.ToInt32(tbArray[i, j].Text);}return b;}整个的实现思路就完成了,下⾯的就是具体优化了,下⾯是我的最终效果源码:⼩伙伴们有更好的⽅式可以分享出来⼤家⼀起讨论。
LeetCode——36.有效的数独(Java)
LeetCode——36.有效的数独(Java)题⽬描述题⼲:请你判断⼀个 9x9 的数独是否有效。
只需要根据以下规则,验证已经填⼊的数字是否有效即可。
数字 1-9 在每⼀⾏只能出现⼀次。
数字 1-9 在每⼀列只能出现⼀次。
数字 1-9 在每⼀个以粗实线分隔的 3x3 宫内只能出现⼀次。
(请参考⽰例图)数独部分空格内已填⼊了数字,空⽩格⽤ '.' 表⽰。
注意:⼀个有效的数独(部分已被填充)不⼀定是可解的。
只需要根据以上规则,验证已经填⼊的数字是否有效即可。
⽰例 1:输⼊:board =[["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]]输出:true⽰例 2:输⼊:board =[["8","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]]输出:false解释:除了第⼀⾏的第⼀个数字从 5 改为 8 以外,空格内其他数字均与⽰例1 相同但由于位于左上⾓的 3x3 宫内有两个 8 存在, 因此这个数独是⽆效的。
数独程序设计
数独程序设计数独是一种源自日本的数字逻辑游戏,其规则是在一个9x9的网格中填入数字1到9,使得每行、每列以及每个3x3的子网格内都包含1到9的所有数字,且不重复。
设计一个数独程序,需要考虑如何生成数独谜题、如何验证数独解的正确性以及如何实现自动解决数独谜题的算法。
数独程序设计概述数独程序设计可以分为以下几个主要部分:1. 界面设计:用户与程序交互的界面,包括输入谜题、显示谜题、提交解和显示解等。
2. 谜题生成:算法生成数独谜题,通常需要保证谜题有一个唯一的解。
3. 解的验证:算法验证用户提交的数独解是否正确。
4. 自动解题算法:算法自动解决数独谜题,常见的有回溯法等。
界面设计界面设计应简洁明了,提供必要的输入输出功能。
用户可以通过文本框输入数独谜题的初始布局,也可以通过图形界面直接点击格子输入数字。
提交解后,程序应能即时反馈解的正确性。
谜题生成生成数独谜题的算法通常包括以下步骤:- 随机生成一个完整的数独解。
- 逐步移除一些数字,直到剩余的数字数量达到所需的难度级别。
- 确保移除数字后的谜题仍然有一个唯一的解。
生成算法需要使用到数独解的唯一性检测,这可以通过回溯法等算法来实现。
解的验证验证数独解的正确性,需要检查以下条件:- 每一行的数字1到9是否都出现且只出现一次。
- 每一列的数字1到9是否都出现且只出现一次。
- 每一个3x3的子网格内的数字1到9是否都出现且只出现一次。
自动解题算法自动解题算法中,回溯法是一种常用的方法,其基本思想是:1. 从左到右,从上到下遍历数独的每一个格子。
2. 对于每一个空格子,尝试填入1到9的数字。
3. 每填入一个数字后,检查当前的数独布局是否满足数独的规则。
4. 如果当前布局满足规则,则递归地尝试填入下一个空格子。
5. 如果当前布局不满足规则,或者已经尝试了所有可能的数字,则回溯到上一个空格子,尝试填入下一个数字。
6. 如果所有格子都被正确填满,则找到了一个解。
程序实现在程序实现时,可以使用多种编程语言,如Python、Java或C++。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java版数独算法实现文章分类:移动开发数独的历史:数独前身为“九宫格”,最早起源于中国。
数千年前,我们的祖先就发明了洛书,其特点较之现在的数独更为复杂,要求纵向、横向、斜向上的三个数字之和等于15,而非简单的九个数字不能重复。
儒家典籍《易经》中的“九宫图”也源于此,故称“洛书九宫图”。
而“九宫”之名也因《易经》在中华文化发展史上的重要地位而保存、沿用至今。
1783年,瑞士数学家莱昂哈德·欧拉发明了一种当时称作“拉丁方块”(Latin Square)的游戏,这个游戏是一个n×n的数字方阵,每一行和每一列都是由不重复的n个数字或者字母组成的。
19世纪70年代,美国的一家数学逻辑游戏杂志《戴尔铅笔字谜和词语游戏》(Dell Puzzle Mαgαzines)开始刊登现在称为“数独”的这种游戏,当时人们称之为“数字拼图”(Number Place),在这个时候,9×9的81格数字游戏才开始成型。
1984年4月,在日本游戏杂志《字谜通讯Nikoil》(《パズル通信ニコリ》)上出现了“数独”游戏,提出了“独立的数字”的概念,意思就是“这个数字只能出现一次”或者“这个数字必须是惟一的”,并将这个游戏命名为“数独”(sudoku)。
实现方法:Java代码1import java.util.Random;23public class ShuDu {4/** 存储数字的数组*/5private static int[][] n = new int[9][9];6/** 生成随机数字的源数组,随机数字从该数组中产生*/7private static int[] num = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };89public static int[][] generateShuDu(){10// 生成数字11for (int i = 0; i < 9; i++) {12// 尝试填充的数字次数13int time = 0;14// 填充数字15for (int j = 0; j < 9; j++) {16// 产生数字17n[i][j] = generateNum(time);18// 如果返回值为0,则代表卡住,退回处理19// 退回处理的原则是:如果不是第一列,则先倒退到前一列,否则倒退到前一行的最后一列20if (n[i][j] == 0) {21// 不是第一列,则倒退一列22if (j > 0) {23j -= 2;24continue;25} else {// 是第一列,则倒退到上一行的最后一列26i--;27j = 8;28continue;29}30}31// 填充成功32if (isCorret(i, j)) {33// 初始化time,为下一次填充做准备34time = 0;35} else { // 继续填充36// 次数增加137time++;38// 继续填充当前格39j--;40}41}42}43return n;44}4546/**47* 是否满足行、列和3X3区域不重复的要求48*49* @param row50* 行号51* @param col52* 列号53* @return true代表符合要求54*/55private static boolean isCorret(int row, int col) {56return (checkRow(row) & checkLine(col) & checkNine(row, col)); 57}5859/**60* 检查行是否符合要求61*62* @param row63* 检查的行号64* @return true代表符合要求65*/66private static boolean checkRow(int row) {67for (int j = 0; j < 8; j++) {68if (n[row][j] == 0) {69continue;70}71for (int k = j + 1; k < 9; k++) {72if (n[row][j] == n[row][k]) {73return false;74}75}76}77return true;78}7980/**81* 检查列是否符合要求82*83* @param col84* 检查的列号85* @return true代表符合要求86*/87private static boolean checkLine(int col) { 88for (int j = 0; j < 8; j++) {89if (n[j][col] == 0) {90continue;91}92for (int k = j + 1; k < 9; k++) {93if (n[j][col] == n[k][col]) {94return false;95}96}97}98return true;99}100101/**102* 检查3X3区域是否符合要求103*104* @param row105* 检查的行号106* @param col107* 检查的列号108* @return true代表符合要求109*/110private static boolean checkNine(int row, int col) { 111// 获得左上角的坐标112int j = row / 3 * 3;113int k = col / 3 * 3;114// 循环比较115for (int i = 0; i < 8; i++) {116if (n[j + i / 3][k + i % 3] == 0) {117continue;118}119for (int m = i + 1; m < 9; m++) {120if (n[j + i / 3][k + i % 3] == n[j + m / 3][k + m % 3]) {121return false;122}123}124}125return true;126}127128/**129* 产生1-9之间的随机数字规则:生成的随机数字放置在数组8-time下标的位置,随着time的增加,已经尝试过的数字将不会在取到130* 说明:即第一次次是从所有数字中随机,第二次时从前八个数字中随机,依次类推,这样既保证随机,也不会再重复取已经不符合要求的数字,提高程序的效率131* 这个规则是本算法的核心132*133* @param time134* 填充的次数,0代表第一次填充135* @return136*/137private static Random r=new Random();138private static int generateNum(int time) {139// 第一次尝试时,初始化随机数字源数组140if (time == 0) {141for (int i = 0; i < 9; i++) {142num[i] = i + 1;143}144}145// 第10次填充,表明该位置已经卡住,则返回0,由主程序处理退回146if (time == 9) {147return 0;148}149// 不是第一次填充150// 生成随机数字,该数字是数组的下标,取数组num中该下标对应的数字为随机数字151// int ranNum = (int) (Math.random() * (9 - time));//j2se152int ranNum=r.nextInt(9 - time);//j2me153// 把数字放置在数组倒数第time个位置,154int temp = num[8 - time];155num[8 - time] = num[ranNum];156num[ranNum] = temp;157// 返回数字158return num[8 - time];159}160161public static void main(String[] args) {162int[][] shuDu=generateShuDu();163// 输出结果164for (int i = 0; i < 9; i++) {165for (int j = 0; j < 9; j++) {166System.out.print(shuDu[i][j] + " ");167}168System.out.println();169}170}171}数独算法源代码点击: 发布日期:2007-9-21 13:19:00 进入论坛数独算法相信很多人没有见过吧,呵呵,一起来看看学习下吧。
/*** 数独程序*/public class ShuDu {/**存储数字的数组*/static int[][] n = new int[9][9];/**生成随机数字的源数组,随机数字从该数组中产生*/static int[] num = {1,2,3,4,5,6,7,8,9};public static void main(String[] args) {//生成数字for(int i = 0;i < 9;i++){//尝试填充的数字次数int time = 0;//填充数字for(int j = 0;j < 9;j++){//产生数字n[i][j] = generateNum(i,j,time);//如果返回值为0,则代表卡住,退回处理//退回处理的原则是:如果不是第一列,则先倒退到前一列,否则倒退到前一行的最后一列if(n[i][j] == 0){//不是第一列,则倒退一列if(j > 0){j-=2;continue;}else{//是第一列,则倒退到上一行的最后一列i--;j = 8;continue;}}//填充成功if(isCorret(i,j)){//初始化time,为下一次填充做准备time = 0;}else{ //继续填充//次数增加1time++;//继续填充当前格j--;}}}//输出结果for(int i = 0;i < 9;i++){for(int j = 0;j < 9;j++){System.out.print(n[i][j] + " ");}System.out.println();}}/*** 是否满足行、列和3X3区域不重复的要求* @param row 行号* @param col 列号* @return true代表符合要求*/public static boolean isCorret(int row,int col){return (checkRow(row) & checkLine(col) & checkNine(row,col));}/*** 检查行是否符合要求* @param row 检查的行号* @return true代表符合要求*/public static boolean checkRow(int row){for(int j = 0;j < 8;j++){if(n[row][j] == 0){continue;}for(int k =j + 1;k< 9;k++){if(n[row][j] == n[row][k]){return false;}}}return true;}/*** 检查列是否符合要求* @param col 检查的列号* @return true代表符合要求*/public static boolean checkLine(int col){for(int j = 0;j < 8;j++){if(n[j][col] == 0){continue;}for(int k =j + 1;k< 9;k++){if(n[j][col] == n[k][col]){return false;}}}return true;}/*** 检查3X3区域是否符合要求* @param row 检查的行号* @param col 检查的列号* @return true代表符合要求*/public static boolean checkNine(int row,int col){//获得左上角的坐标int j = row / 3 * 3;int k = col /3 * 3;//循环比较for(int i = 0;i < 8;i++){if(n[j + i/3][k + i % 3] == 0){continue;}for(int m = i+ 1;m < 9;m++){if(n[j + i/3][k + i % 3] == n[j + m/3][k + m % 3]){return false;}}}return true;}/*** 产生1-9之间的随机数字* 规则:生成的随机数字放置在数组8-time下标的位置,随着time的增加,已经尝试过的数字将不会在取到* 说明:即第一次次是从所有数字中随机,第二次时从前八个数字中随机,依次类推,* 这样既保证随机,也不会再重复取已经不符合要求的数字,提高程序的效率* 这个规则是本算法的核心* @param row 需要填充的数字所在的行* @param col 需要填充的数字所在的列* @param time 填充的次数,0代表第一次填充* @return*/public static int generateNum(int row,int col,int time){//第一次尝试时,初始化随机数字源数组if(time == 0){for(int i = 0;i < 9;i++){num[i] = i + 1;}}//第10次填充,表明该位置已经卡住,则返回0,由主程序处理退回if(time == 9){return 0;}//不是第一次填充//生成随机数字,该数字是数组的下标,取数组num中该下标对应的数字为随机数字int ranNum = (int)(Math.random() * (9 - time));//把数字放置在数组倒数第time个位置,int temp = num[8 - ranNum];num[8 - ranNum] = num[ranNum];num[ranNum] = temp;//返回数字return num[8 - ranNum];}}本文来自: 中国自学编程网() 详细出处参考:/html/20070921/27316_8.html。