java课程设计九宫格数独.docx

上传人:b****1 文档编号:1753880 上传时间:2022-10-23 格式:DOCX 页数:26 大小:274.09KB
下载 相关 举报
java课程设计九宫格数独.docx_第1页
第1页 / 共26页
java课程设计九宫格数独.docx_第2页
第2页 / 共26页
java课程设计九宫格数独.docx_第3页
第3页 / 共26页
java课程设计九宫格数独.docx_第4页
第4页 / 共26页
java课程设计九宫格数独.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

java课程设计九宫格数独.docx

《java课程设计九宫格数独.docx》由会员分享,可在线阅读,更多相关《java课程设计九宫格数独.docx(26页珍藏版)》请在冰豆网上搜索。

java课程设计九宫格数独.docx

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、软件系统的功能

可弹出游戏界面,方便用户操作,界面易于用户理解。

可以选择游戏开始或重新开局。

可以判断正误,能给出正确答案,当输入的内容不符合要求时,弹出对话框,提示输入错误。

当结果不正确时,弹出对话框,提示答案错误。

答案正确时。

弹出对话框,显示答案正确。

在九宫格数独游戏界面和弹出的消息提示界面有相关的最小化、最大化、关闭等按钮可以操作。

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{//类声明;设置答案窗

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1