JAVA数独九宫格游戏软件设计报告推荐文档.docx
《JAVA数独九宫格游戏软件设计报告推荐文档.docx》由会员分享,可在线阅读,更多相关《JAVA数独九宫格游戏软件设计报告推荐文档.docx(27页珍藏版)》请在冰豆网上搜索。
JAVA数独九宫格游戏软件设计报告推荐文档
佛山科学技术学院
《可视化编程技术》课程设计报告
数独(九宫格)游戏软件设计
学生姓名:
卫泶媚
学号:
2012914201
年级专业:
12级教育技术学2班
指导老师:
容汝佳
学院:
教育科学学院
广东★佛山
提交日期:
2014年6月
1.前言______________________________2
2.概要设计____________________________3
2.1数独游戏分析_________________________3
2.2数独游戏界面设计_______________________5
2.3数独游戏程序功能_______________________5
3.详细设计___________________________7
3.1类设计___________________________7
3.2数独算法设计_________________________9
4.程序代码____________________________10
5.参考资料____________________________19
6.心得体会____________________________20
摘要:
本程序是个简单的数独游戏界面,在9×9的大九宫格中有9个3×3的小九宫格,游戏根据玩家选择的难易程度提供不同数量的数字。
根据已给出的数字,利用逻辑和推理,在其余空格上填入1至9的数字。
每个数字在每个小九宫格内每行、每列只能出现一次。
虽然玩法简单,但数字排列方式却千变万化,是锻炼逻辑推理能力的好方法。
另外,设有“答案”和“玩法说明”窗口为玩家提供参考和帮助。
玩家完成所有数字的填写后,可进行提交,游戏系统会根据所填写的结果弹出相应的对话框。
关键字:
java游戏软件,数独(九宫格),界面布局
1前言
经济在发展,科学在发展,人也在发展。
在学习JAVA语言后,我决定使用Java语言编写一个简单的数独游戏,来锻炼人们的逻辑推理能力和思维活跃度,同时,也能满足人们日常空余时间的娱乐需要。
数独热潮已经在全球蔓延已久,随着数独游戏不断地发展完善,数独也越来越受到家长和孩子的青睐,认为数独不仅仅只是游戏,而是开发智力的一种方法。
在孩子游戏娱乐的同时还能得到逻辑思维的锻炼,又何乐而不为呢?
JAVA语言是一种纯面向对象的编程语言,自1995年诞生至今,已经得到飞速的发展,涉及计算机应用的方方面面,如浏览器应用、桌面应用、个人数字代理等等,Java语言面向对象、跨平台、安全性、多线程等特性,奠定了其作为网络应用开发首选工具的基础。
另外,本数独游戏程序框架结构清晰明朗,便于读者理解以及为以后增添新功能打下良好的基础;同时,虽然这是一个较为普通的数独游戏程序,但是具有较强的实用性,而且对程序的配置要求不高,能够广泛应用。
2概要设计
2.1数独游戏分析
数独游戏组成元素:
单元格:
数独中最小的单元,标准数独中共有81个;
行:
横向9个单元格的集合;
列:
纵向9个单元格的集合;
宫:
粗黑线划分的区域,标准数独中为3×3的9个单元格的集合;
已知数:
数独初始盘面给出的数字;
候选数:
每个空单元格中可以填入的数字。
基本解法:
利用1~9的数字在每一行、每一列、每一宫都只能出现一次的规则进行解题的方法。
使用单元排除法的目的就是要在某一单元(即行,列或区块)中找到能填入某一数字的唯一位置,换句话说,就是把单元中其他的空白位置都排除掉。
游戏布局:
①JPanelpanel_txt=newJPanel(newGridLayout(3,3,2,2));
//将面板设置为3行3列网格布局,并设置大小
②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]);
}
}
}
2.2数独游戏界面设计
2.3数独游戏程序功能
功能1:
弹出游戏界面,可直接开始进行数独游戏,也可以在游戏过程中选择菜单栏中“文件”——“新局”,进行新一局的游戏,或者是“文件”——“重来”,重新开始当前局。
功能2:
判断答案的正误。
游戏当前局完成后,可选择菜单栏中“文件”——“提交”,系统会根据玩家在当前局所填写的结果,弹出相应的对话框。
当输入的内容不符合要求时,弹出对话框:
当结果不正确时,弹出对话框:
当答案正确时,弹出对话框:
功能3:
选择菜单栏中“文件”——“答案”,会弹出当前局数独游戏的正确答案的新窗口,给玩家提供参考。
功能4:
选择菜单栏中“帮助”——“说明”,会弹出次数独游戏玩法的相关说明的新窗口,给玩家提供帮助。
另外,选择菜单栏中“帮助”——“作者”,会弹出对话框,显示此程序作者的相关信息。
功能5:
选择菜单栏中“文件”——“退出”,会自动关闭当前的数独游戏界面,退出系统。
功能6:
玩家可根据自身的情况或兴趣,在数独游戏界面上方的下拉列表中选择适合自己的难度(难度共分为3级,分别是“简单”,“一般”和“困难”),然后选择重新开局,游戏的难度会进行相应的变化。
功能7:
在九宫格数独游戏界面和弹出的消息提示界面以及答案显示窗口和玩法说明窗口有相关的最小化、最大化、关闭等按钮可以操作,玩家可根据需要自行选择相关操作。
3详细设计
3.1类设计
类名
角色
变量(属性)
行为
ShuDu1
一个数独
MenuaBar:
添加菜单项
setSize()设尺寸
add()添加文本及组件
setMenuBar()设置难易等级菜单
ShuDuAns
答案窗口
setSize()设置尺寸
JPanel()设置面板布局
Another
说明窗口
PublicvoidactionPerformed(ActionEvente)
单击事件处理方法
单击实践
JOptionPaneshow
MessageDialog():
弹出提示信息框
接口名
属性
ActionListener
addActionListener():
注册单击事件监听器
ItemListener
类的对象:
属于ShuDu1主类的对象成员:
MenuBar、Menu、MenuItem、JComboBox
属于ShuDuAns类的对象:
JTextField
属于String类的对象:
atext[i][j]
属于JtextField类的对象:
text[i][j]、
属于JPanel类的对象:
apanel[]、panel[]
类:
包括上述所有类及父类Jframe。
类的属性:
ShuDu1:
public
String:
public
JtextField:
private
JPanel:
private
Jframe:
public
程序流程图:
3.2数独算法设计
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();
}
算法核心:
数独游戏中的数字第一次是从所有数字中随机,第二次时从前八个数字中随机,依此类推,这样的数独算法既保证了随机性,也不会重复取已经不符合要求的数字,大大地提高程序的效率。
4程序代码
importjava.awt.*;//置入包
importjava.awt.event.*;//置入处理由awt组件产生的事件
importjava.io.*;
importjavax.swing.*;
importjava.util.*;
publicclassShuDu1extendsJFrameimplementsActionListener,ItemListener{//框架窗口响应单击事件
privateMenuBarmenubar=newMenuBar();//私有成员变量
privateMenumenu_file=newMenu("文件");//定义“文件”菜单按钮
privateMenumenu_help=newMenu("帮助");//定义“帮助”菜单按钮
privateMenuItemitem_ans=newMenuItem("答案");//定义菜单项
privateMenuItemitem_sol=newMenuItem("提交");
privateMenuItemitem_rem=newMenuItem("重来");
privateMenuItemitem_next=newMenuItem("新局");
privateMenuItemitem_exit=newMenuItem("退出");
privateMenuItemitem_auther=newMenuItem("作者");
privateMenuItemitem_explain=newMenuItem("说明");
privateJComboBoxbox=newJComboBox();//创建具有默认数据模型的复选框组件box
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];//创建二维数组文本框组件text
staticStringatext[][]=newString[10][10];
staticinthard=2;//默认初始难度为2
staticintdatahard[]={2,3,5};//不同的难度
classShuDuAnsextendsJFrame{//类声明;设置答案窗口
privateJTextFieldatext[][]=newJTextField[10][10];
publicShuDuAns(){//构造类
super("答案");//设置框架窗口标题
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];//创建面板数组apanel
for(inti=1;i<=9;i++){//尝试填充的次数
apanel[i]=newJPanel(newGridLayout(3,3));//给面板数组apanel添加GridLayout布局管理器,设置3行3列的网格布局
apanel_txt.add(apanel[i]);//将面板数组apanel添加到有GridLayout布局管理器的面板apanel_txt中,依次添加组件,添加宫格
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);//为当前类添加宫格
}
}
classAnotherextendsJFrame{
Another(){
this.setTitle("玩法说明");
this.setSize(500,400);
this.setAlwaysOnTop(true);
this.setVisible(true);
setLayout(newGridLayout(4,1));
Paneloperate=newPanel();
JLabellabel1,label2,label3,label4;
label1=newJLabel("1.在空格上填入1到9的数字,每个数字在每个小九宫格、每行、每列只能出现一次。
");
label2=newJLabel("2.玩家可自由选择难易程度,然后重新开局;或选择重来。
");
label3=newJLabel("3.玩家可打开文件菜单栏中的答案窗口,进行参考。
");
label4=newJLabel("4.玩家完成游戏后,可进行提交,同时根据所填写的结果弹出相应的提示对话框。
");
add(label1);
add(label2);
add(label3);
add(label4);
}
}
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,"所填入的数据中包括非数字字符或未完整填写,请重新输入!
","提示",JOptionPane.PLAIN_MESSAGE);//提示出错信息
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("数独游戏");//窗口标题
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[]