JAVA数独九宫格游戏软件设计报告推荐文档.docx

上传人:b****1 文档编号:14238083 上传时间:2023-06-21 格式:DOCX 页数:27 大小:372.77KB
下载 相关 举报
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第1页
第1页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第2页
第2页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第3页
第3页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第4页
第4页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第5页
第5页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第6页
第6页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第7页
第7页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第8页
第8页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第9页
第9页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第10页
第10页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第11页
第11页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第12页
第12页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第13页
第13页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第14页
第14页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第15页
第15页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第16页
第16页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第17页
第17页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第18页
第18页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第19页
第19页 / 共27页
JAVA数独九宫格游戏软件设计报告推荐文档.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

JAVA数独九宫格游戏软件设计报告推荐文档.docx

《JAVA数独九宫格游戏软件设计报告推荐文档.docx》由会员分享,可在线阅读,更多相关《JAVA数独九宫格游戏软件设计报告推荐文档.docx(27页珍藏版)》请在冰点文库上搜索。

JAVA数独九宫格游戏软件设计报告推荐文档.docx

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[]

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2