计算机与信息工程系《数独游戏的设计与实现》课程设计
static void set_data_zero(){ //数独的初始化 for(int i=0;i<=9;i++){ for(int j=0;j<=9;j++){ data[i][j]=0; } } }
static void setnum(){ //数独数字的设置 setzero(); set_data_zero();
for(int i=1;i<=9;i++){ //尝试填充的次数
int n =(int)(Math.random()*100)+1; //添加任意整数 int j=i*3-((i+2)/3*8-6); data[i][j]=n%9+1; //产生数字
int k=data[i][j]; row[i][k]=1; col[j][k]=1;
sql[(i+2)/3][(j+2)/3][k]=1; } DFS(); }
算法核心:第一次次是从所有数字中随机,第二次时从前八个数字中随机,依次类推,这样既保证随机,也不会再重复取已经不符合要求的数字,提高程序的效率
第 11 页 共 31 页
计算机与信息工程系《数独游戏的设计与实现》课程设计
程序的相关分析
import java.awt.*; //这个一般在程序开始时用,即置入包。
import javax.awt.event.*;//置入处理由awt组件产生的事件,有别于String事件
import javax.swing.*;//置入最常用包,最常用的pachage,包含了各种swing组件的类
public class:在 java 中用 public class 可以定义一个java 程序的入口类,在 asp 用 class ClassName 可以定义一个类
private:在Java中是一个关键字,表示私有成员,private 是类中的一个属性 用它定义的feild和method只能在类中被调用.如果定义了private,就不能被外部类所访问了
this:java中this有两种用法1、代表当前类;2、在构造函数中的使用 如:
this.setSize(300,300);//
设置窗体的长宽各为:440, 140//它们的计量单位是像素 this.setVisible(true);//显示窗口
this.setResizable(false);//窗口大小不能改变
this.setDefaultCloseOperation(EXIT_ON_CLOSE);//单击窗口按钮时,结束程序运行;
new JPanel(new FlowLayout());//流式布局;GridLayout()//网格布局 texts[i].setEditable(false);//只能显示,不允许编辑; static :声明静态成员变量
第 12 页 共 31 页
计算机与信息工程系《数独游戏的设计与实现》课程设计
五、源代码
编码如下: import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import java.util.*;
public class ShuDu1 extends JFrame implements ActionListener,ItemListener{ 框架窗口响应单击事件
private MenuBar menubar=new MenuBar(); //私有成员变量 private Menu menu_file=new Menu(\); //定义File菜单按钮 private Menu menu_edit=new Menu(\);
private MenuItem item_ans=new MenuItem(\); //定义菜单项 private MenuItem item_sol=new MenuItem(\); private MenuItem item_rem=new MenuItem(\); private MenuItem item_next=new MenuItem(\); private MenuItem item_exit=new MenuItem(\); private JComboBox box=new JComboBox();
static int data[][]=new int[10][10]; //新建10*10的二维数组 static int ansdata[][]=new int[10][10]; //存放正确答案的二维数组 static int row[][]=new int[10][10]; static int col[][]=new int[10][10]; static int sql[][][]=new int[4][4][10];
static JTextField text[][]=new JTextField[10][10]; static String atext[][]=new String[10][10]; static int hard=2;
第 13 页 共 31 页
// 计算机与信息工程系《数独游戏的设计与实现》课程设计
static int datahard[]={2,3,5}; // 不同的难度
class ShuDuAns extends JFrame{ //类声明;设置答案窗口 private JTextField atext[][]=new JTextField[10][10]; public ShuDuAns(){ //构造类
super(\); //设置框架窗口标题 this.setSize(300,300); //设置框架尺寸
this.setLocation(200,200); //设置框架显示在屏幕的位置 this.setVisible(true); //组件设为可见 this.setResizable(false); //窗口大小不能改变
JPanel apanel_but=new JPanel(new FlowLayout()); //将面板设为流布局 JPanel apanel_txt=new JPanel(new GridLayout(3,3,2,2)); //将面板内部设为网格布局,参数指定为3行3列,并设置大小 JPanel apanel[]=new JPanel[10];
for(int i=1;i<=9;i++){ //尝试填充的次数
apanel[i]=new JPanel(new GridLayout(3,3)); //设置3行3列的网格布局 apanel_txt.add(apanel[i]); //依次添加组件,添加宫格 int m=(i+2)/3*3-2; int n=((i-1)%3+1)*3-2; for(int j=m;j<=m+2;j++){ for(int k=n;k<=n+2;k++){
atext[j][k]=new JTextField(Integer.toString(data[j][k])); //设置为整数 atext[j][k].setHorizontalAlignment(JTextField.CENTER); //文本设置为水平居中
atext[j][k].setEditable(false); //不可编辑,只能显示 apanel[i].add(atext[j][k]); //添加数字 } } }
第 14 页 共 31 页
计算机与信息工程系《数独游戏的设计与实现》课程设计
this.add(apanel_txt); //为当前类添加宫格 } }
static int DFS(){ //静态成员方法 for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++){ if(data[i][j]==0){
for(int k=1;k<=9;k++){ if(
row[i][k]==0
&&
col[j][k]==0
&&
sql[(i+2)/3][(j+2)/3][k]==0 ){ //行、列3*3区域的检验 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; else{
data[i][j]=0; row[i][k]=0; col[j][k]=0;
sql[(i+2)/3][(j+2)/3][k]=0; //宫内格子间的间 隔
} } if(k==9)
return 0; //都设置完,结束 } } }
第 15 页 共 31 页