java课程设计九宫格数独Word文档下载推荐.docx
《java课程设计九宫格数独Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《java课程设计九宫格数独Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
三、问题分解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
设置答案窗口
JPanel():
设置面板布局
PublicvoidactionPerformed(ActionEvente)
单击事件处理方法
单击实践
JOptionPaneshowMessageDialog():
弹出提示信息框
接口名
属性
ActionListener
addActionListener():
注册单击事件监听器
ItemListener
四、系统设计(类设计、数据设计、方法设计、算法设计等)
类的设计(对象的设计)(类图、对象图)
程序流程图
NO
答案不唯一,数独不成立
答案唯一吗
YES
java程序中数独的算法设计
staticintDFS(){
for(inti=1;
i<
=9;
i++){
for(intj=1;
j<
j++){
if(data[i][j]==0){
for(intk=1;
k<
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;
staticvoidset_data_zero(){//数独的初始化
for(inti=0;
for(intj=0;
staticvoidsetnum(){//数独数字的设置
setzero();
set_data_zero();
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];
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.event.*;
importjava.io.*;
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{//类声明;
设置答案窗