java课程设计九宫格数独.docx
- 文档编号:30266952
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:29
- 大小:274.35KB
java课程设计九宫格数独.docx
《java课程设计九宫格数独.docx》由会员分享,可在线阅读,更多相关《java课程设计九宫格数独.docx(29页珍藏版)》请在冰豆网上搜索。
java课程设计九宫格数独
中南民族大学管理学院
学生课程设计报告
课题名称:
java课程设计
选题名称:
九宫格数独
年级:
2009
专业:
信息管理与信息系统
学号:
09071248
姓名:
指导教师:
完成地点:
管理学院综合实验室
完成日期:
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、软件系统的功能
可弹出游戏界面,方便用户操作,界面易于用户理解。
可以选择游戏开始或重新开局。
可以判断正误,能给出正确答案,当输入的内容不符合要求时,弹出对话框,提示输入错误。
当结果不正确时,弹出对话框,提示答案错误。
答案正确时。
弹出对话框,显示答案正确。
在九宫格数独游戏界面和弹出的消息提示界面有相关的最小化、最大化、关闭等按钮可以操作。
3、对性能的要求
(1)具有较强的实用性
(2)易于理解和应用
(3)对程序的配置要求不高,能广泛应用
三、问题分解
1、分析找出问题域中的对象,并将对象归类,注意筛选掉不必要的对象或类。
对象:
属于ShuDu1主类的对象成员:
MenuBar、Menu、MenuItem、JComboBox
属于ShuDuAns类的对象:
JTextField
属于String类的对象:
atext[i][j]
属于JtextField类的对象:
text[i][j]、
属于JPanel类的对象:
apanel[]、panel[]
类:
包括上述所有类及父类Jframe。
2、确定类的属性。
ShuDu1:
publicString:
public
JtextField:
privateJPanel:
private
Jframe:
public
3、确定对象之间的关系,包括依赖、泛化、关联、实现等等。
Jframe与主类ShuDu1之间:
泛化
texts[](JtextField)与atext[](String)之间:
依赖
String与ShuDu1之间:
依赖
Resizable、Editable、Visible与texts[]之间:
实现
i、j与text[i][j]、atext[i][j]之间:
关联
类设计
类名
角色
变量(属性)
行为
ShuDu1
表示一个数独
MenuaBar:
添加菜单项,
setSize():
设置尺寸等
add():
添加文本及组件
setMenuBar():
设置难易等级菜单
ShuDuAns
设置答案窗口
setSize():
设置尺寸等
JPanel():
设置面板布局
PublicvoidactionPerformed(ActionEvente)
单击事件处理方法
单击实践
JOptionPaneshowMessageDialog():
弹出提示信息框
接口名
属性
ActionListener
addActionListener():
注册单击事件监听器
ItemListener
四、系统设计(类设计、数据设计、方法设计、算法设计等)
类的设计(对象的设计)(类图、对象图)
程序流程图
NO
答案不唯一,数独不成立
答案唯一吗
YES
java程序中数独的算法设计
staticintDFS(){
for(inti=1;i<=9;i++){
for(intj=1;j<=9;j++){
if(data[i][j]==0){
for(intk=1;k<=9;k++){
if(row[i][k]==0&&col[j][k]==0&&sql[(i+2)/3][(j+2)/3][k]==0){
data[i][j]=k;
row[i][k]=1;
col[j][k]=1;
sql[(i+2)/3][(j+2)/3][k]=1;
if(DFS()==1)
return1;
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)
return0;
}
}
}
}
return1;
}
staticvoidset_data_zero(){//数独的初始化
for(inti=0;i<=9;i++){
for(intj=0;j<=9;j++){
data[i][j]=0;
}
}
}
staticvoidsetnum(){//数独数字的设置
setzero();
set_data_zero();
for(inti=1;i<=9;i++){//尝试填充的次数
intn=(int)(Math.random()*100)+1;//添加任意整数
intj=i*3-((i+2)/3*8-6);
data[i][j]=n%9+1;//产生数字
intk=data[i][j];
row[i][k]=1;
col[j][k]=1;
sql[(i+2)/3][(j+2)/3][k]=1;
}
DFS();
}
算法核心:
第一次次是从所有数字中随机,第二次时从前八个数字中随机,依次类推,这样既保证随机,也不会再重复取已经不符合要求的数字,提高程序的效率
程序的相关分析
importjava.awt.*;//这个一般在程序开始时用,即置入包。
importjavax.awt.event.*;//置入处理由awt组件产生的事件,有别于String事件
importjavax.swing.*;//置入最常用包,最常用的pachage,包含了各种swing组件的类
publicclass:
在java中用publicclass可以定义一个java程序的入口类,在asp用classClassName可以定义一个类
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);//单击窗口按钮时,结束程序运行;
newJPanel(newFlowLayout());//流式布局;GridLayout()//网格布局
texts[i].setEditable(false);//只能显示,不允许编辑;
static:
声明静态成员变量
五、系统实现(编码)
编码如下:
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
importjavax.swing.*;
importjava.util.*;
publicclassShuDu1extendsJFrameimplementsActionListener,ItemListener{//框架窗口响应单击事件
privateMenuBarmenubar=newMenuBar();//私有成员变量
privateMenumenu_file=newMenu("File");//定义File菜单按钮
privateMenumenu_edit=newMenu("Result");
privateMenuItemitem_ans=newMenuItem("Answer");//定义菜单项
privateMenuItemitem_sol=newMenuItem("Submit");
privateMenuItemitem_rem=newMenuItem("Restar");
privateMenuItemitem_next=newMenuItem("Star");
privateMenuItemitem_exit=newMenuItem("Exit");
privateJComboBoxbox=newJComboBox();
staticintdata[][]=newint[10][10];//新建10*10的二维数组
staticintansdata[][]=newint[10][10];//存放正确答案的二维数组
staticintrow[][]=newint[10][10];
staticintcol[][]=newint[10][10];
staticintsql[][][]=newint[4][4][10];
staticJTextFieldtext[][]=newJTextField[10][10];
staticStringatext[][]=newString[10][10];
staticinthard=2;
staticintdatahard[]={2,3,5};//不同的难度
classShuDuAnsextendsJFrame{//类声明;设置答案窗口
privateJTextFieldatext[][]=newJTextField[10][10];
publicShuDuAns(){//构造类
super("Answer");//设置框架窗口标题
this.setSize(300,300);//设置框架尺寸
this.setLocation(200,200);//设置框架显示在屏幕的位置
this.setVisible(true);//组件设为可见
this.setResizable(false);//窗口大小不能改变
JPanelapanel_but=newJPanel(newFlowLayout());//将面板设为流布局
JPanelapanel_txt=newJPanel(newGridLayout(3,3,2,2));//将面板内部设为网格布局,参数指定为3行3列,并设置大小
JPanelapanel[]=newJPanel[10];
for(inti=1;i<=9;i++){//尝试填充的次数
apanel[i]=newJPanel(newGridLayout(3,3));//设置3行3列的网格布局
apanel_txt.add(apanel[i]);//依次添加组件,添加宫格
intm=(i+2)/3*3-2;
intn=((i-1)%3+1)*3-2;
for(intj=m;j<=m+2;j++){
for(intk=n;k<=n+2;k++){
atext[j][k]=newJTextField(Integer.toString(data[j][k]));//设置为整数
atext[j][k].setHorizontalAlignment(JTextField.CENTER);//文本设置为水平居中
atext[j][k].setEditable(false);//不可编辑,只能显示
apanel[i].add(atext[j][k]);//添加数字
}
}
}
this.add(apanel_txt);//为当前类添加宫格
}
}
staticintDFS(){//静态成员方法
for(inti=1;i<=9;i++){
for(intj=1;j<=9;j++){
if(data[i][j]==0){
for(intk=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)
return1;
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)
return0;//都设置完,结束
}
}
}
}
return1;
}
staticvoidset_data_zero(){//数独初始化
for(inti=0;i<=9;i++){
for(intj=0;j<=9;j++){
data[i][j]=0;//0表示数字未给出
}
}
}
staticvoidsetnum(){//设置数字
setzero();//未给出的数字,需玩家填入
set_data_zero();//初始化数独
for(inti=1;i<=9;i++){//填充次数
intn=(int)(Math.random()*100)+1;//随机添加任意整数
intj=i*3-((i+2)/3*8-6);
data[i][j]=n%9+1;//产生数字
intk=data[i][j];//设置间隔
row[i][k]=1;
col[j][k]=1;
sql[(i+2)/3][(j+2)/3][k]=1;
}
DFS();
}
staticvoidsetzero(){//数独空格初始化
for(inti=0;i<=9;i++){
for(intk=0;k<=9;k++){
row[i][k]=0;
col[i][k]=0;
}
for(intj=0;j<=9;j++){
for(intk=0;k<=9;k++){
sql[(i+2)/3][(j+2)/3][k]=0;
}
}
}
}
staticvoidsettext(){//设置数独游戏中的数字
for(inti=1;i<=9;i++){
for(intj=1;j<=9;j++){
//inthard=2;//hard代表难度
intn=(int)(Math.random()*100)+1;//随机数
if(n%hard==0){//根据选择的难易程度设置数独
text[i][j]=newJTextField(Integer.toString(data[i][j]));
text[i][j].setEditable(false);//不可编辑,只能显示
}
else{
text[i][j]=newJTextField();//其他难度,新建文本行
}
text[i][j].setHorizontalAlignment(JTextField.CENTER);//水平居中
atext[i][j]=text[i][j].getText();//设置组件
}
}
}
staticintgettext(){//玩家填入数字
for(inti=1;i<=9;i++){
for(intj=1;j<=9;j++){
try{//异常处理
intk=Integer.parseInt(text[i][j].getText());//第一个文本行输入操作
ansdata[i][j]=k;
}
catch(NumberFormatExceptionnfe){//捕获PerseInt()方法声明的异常对象
JOptionPane.showMessageDialog(null,"数据中包括非数字,请重新输入!
");//提示出错信息
return0;
}
}
}
return1;
}
staticintans(){//设置答案窗口的面板格局
setzero();//空格初始化
for(inti=1;i<=9;i++){
for(intj=1;j<=9;j++){
intk=ansdata[i][j];
if(k>9||k<1){
return0;
}
if(row[i][k]==1||col[j][k]==1||sql[(i+2)/3][(j+2)/3][k]==1){
return0;
}
row[i][k]=1;
col[j][k]=1;
sql[(i+2)/3][(j+2)/3][k]=1;
}
}
return1;
}
publicShuDu1(){//数独游戏布局
super("ShuDuGame");//窗口标题
this.setSize(470,500);//设置窗口尺寸
this.setLocation(260,130);//窗口位置
this.setVisible(true);//显示窗口
this.setDefaultCloseOperation(EXIT_ON_CLOSE);//单击窗口按钮时,结束程序运行
this.setResizable(false);//窗口大小不可变
JPanelpanel_but=newJPanel(newFlowLayout());
JPanelpanel_txt=newJPanel(newGridLayout(3,3,2,2));//将面板设置为3行3列网格布局,并设置大小
JPanelpanel[]=newJPanel[10];
for(inti=1;i<=9;i++){//设置9个面板
panel[i]=newJPanel(newGridLayout(3,3));//将面板设置为3行3列网格布局
panel_txt.add(panel[i]);//添加组件
intm=(i+2)/3*3-2;//生成九个3*3的网格,并添加数字
intn=((i-1)%3+1)*3-2;
for(intj=m;j<=m+2;j++){
for(intk=n;k<=n+2;k++){
panel[i].add(text[j][k]);
}
}
}
this.add(panel_but,"North");//为当前类添加框架
this.add(panel_txt);//添加文本
menubar.add(menu_file);//添加主菜单
menu_file.add(item_next);//添加下拉菜单选项
menu_file.add(item_ans);
menu_file.add(menu_edit);
menu_file.add(item_exit);
menu_edit.add(item_sol);
menu_edit.add(item_rem);
item_exit.addActionListener(this);//注册单击事件监听器,委托当前对象处理事件
item_next.addActionListener(this);
item_ans.addActionListener(this);
item_sol.addActionListener(this);
item_rem.addActionListener(this);
this.setMenuBar(menubar);//设置难易程度等级菜单
Objectpro[]={"Easy","Common","Difficulty"};
box=newJComboBox(pro);//单击事件处理方法,实现ActionListener接口
if(hard==datahard[0]){
box.setSelectedIndex(0);
}
if(hard==datahard[1]){
box.setSelectedIndex
(1);
}
if(hard==datahard[2]){
box.setSelectedIndex
(2);
}
panel_but.add(box);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 课程设计 九宫 格数独