




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机与信息工程系数独游戏的设计与实现课程设计学号2013-2014学年 第二学期1208010106 面向对象程序设计课程设计报告题目:九空格数独游戏的设计与实现专业:计算机科学与技术班级:12级计科(1)班姓名:程龙军指导教师:陈磊成绩: 计算机与信息工程系 2014年 6 月 6 日 目录一、题目描述3二、设计分析31、基本解法32、软件系统的功能43、 对性能的要求4三、设计思路51、 分析找出问题域中的对象52、确定类的属性53、确定对象之间的关系5四、系统设计6五、源代码13六、系统设计和软件发布241、程序运行情况242、软件的发布283、分析讨论29七、难点及关键技术分析30八、心得体会30九、参考文献31一、题目(问题)描述在99格的大九宫格中有9个33格的小九宫格,并提供一定数量的数字。根据这些数字,利用逻辑和推理,在其它的空格上填入1到9的数字。每个数字在每个小九宫格内只能出现一次,每个数字在每行、每列也只能出现一次。 这种游戏只需要逻辑思维能力,与数字运算无关。虽然玩法简单,但数字排列方式却千变万化,所以不少教育者认为数独是锻炼脑筋的好方法。二、设计分析1、基本解法:利用1 9 的数字在每一行、每一列、每一宫都只能出现一次的规则进行解题的方法。 实际寻找解的过程为: 使用单元排除法的目的就是要在某一单元(即行,列或区块)中找到能填入某一数字的唯一位置,换句话说,就是把单元中其他的空白位置都排除掉。 那么要如何排除其余的空格呢?当然还是不能忘了游戏规则,由于1-9的数字在每一行、每一列、每一个九宫格都要出现且只能出现一次,所以: 如果某行中已经有了某一数字,则该行中的其他位置不可能再出现这一数字 如果某列中已经有了某一数字,则该列中的其他位置不可能再出现这一数字 如果某区块中已经有了某一数字,则该区块中的其他位置不可能再出现这一数字。图1-1单元格:数独中最小的单元,标准数独中共有81个;行:横向9个单元格的集合;列:纵向9个单元格的集合;宫:粗黑线划分的区域,标准数独中为33的9个单元格的集合;已知数:数独初始盘面给出的数字;候选数:每个空单元格中可以填入的数字。2、软件系统的功能可弹出游戏界面,方便用户操作,界面易于用户理解。可以选择游戏开始或重新开局。可以判断正误,能给出正确答案,当输入的内容不符合要求时,弹出对话框,提示输入错误。当结果不正确时,弹出对话框,提示答案错误。答案正确时。弹出对话框,显示答案正确。在九宫格数独游戏界面和弹出的消息提示界面有相关的最小化、最大化、关闭等按钮可以操作。3、 对性能的要求(1) 具有较强的实用性(2) 易于理解和应用(3) 对程序的配置要求不高,能广泛应用三、设计思路1、 分析找出问题域中的对象并将对象归类,注意筛选掉不必要的对象或类。对象:属于ShuDu1主类的对象成员: MenuBar、Menu、MenuItem、JComboBox属于ShuDuAns类的对象:JTextField属于String类的对象:atextij 属于JtextField类的对象:textij、属于JPanel类的对象:apanel 、panel 类:包括上述所有类及父类Jframe。2、确定类的属性ShuDu1: public String: publicJtextField:private JPanel:privateJframe:public3、确定对象之间的关系(包括依赖、泛化、关联、实现等等)Jframe与主类ShuDu1之间:泛化texts (JtextField)与atext (String)之间:依赖String与ShuDu1之间:依赖Resizable、Editable、Visible与texts 之间:实现i、j与textij、atextij之间:关联类设计类名角色变量(属性)行为ShuDu1表示一个数独MenuaBar:添加菜单项,setSize():设置尺寸等add():添加文本及组件setMenuBar():设置难易等级菜单ShuDuAns设置答案窗口setSize():设置尺寸等JPanel( ):设置面板布局Public void actionPerformed(ActionEvent e)单击事件处理方法单击实践JOptionPaneshowMessageDialog():弹出提示信息框接口名属性ActionListeneradd ActionListener():注册单击事件监听器ItemListener表1-1四、系统设计(类设计、数据设计、方法设计、算法设计等)类的设计(对象的设计)(类图、对象图)游戏界面name正确答案数据操作难易程度菜单选项菜单选项nameStartAnswerResultExit难易程度EasyCommomDifficultynamename正确答案图1-2YES答案不唯一,数独不成立NO答案唯一吗根据不同层次创建数字选择格子data(i,j),填入数值数独只有一个正确答案吗YES开始生成九宫格NO数独游戏已设置好解决难题的方法,解出正确答案的数字data(i,j)=0,其余的为空值,新的数独产生了玩家填入数字j+=m+2弹出对话框,要求重新输入所有表格已填完YESNO是否有非法字符可选择提交,判断正误NOYES是否符合正确答案弹出对话框,提示答案正确弹出对话框,提示答案错误。再接再厉图1-3java 程序中数独的算法设计static int DFS() for(int i=1;i=9;i+) for(int j=1;j=9;j+) if(dataij=0) for(int k=1;k=9;k+) if( rowik=0 & coljk=0 & sql(i+2)/3(j+2)/3k=0 ) dataij=k; rowik=1; coljk=1; sql(i+2)/3(j+2)/3k=1; if( DFS()=1 ) return 1; else dataij=0; rowik=0; coljk=0; sql(i+2)/3(j+2)/3k=0; if(k=9) return 0; return 1; static void set_data_zero() /数独的初始化 for(int i=0;i=9;i+) for(int j=0;j=9;j+) dataij=0; static void setnum() /数独数字的设置 setzero(); set_data_zero(); for(int i=1;i=9;i+) /尝试填充的次数 int n =(int)(Math.random()*100)+1; /添加任意整数 int j=i*3-(i+2)/3*8-6); dataij=n%9+1; /产生数字 int k=dataij; rowik=1; coljk=1; sql(i+2)/3(j+2)/3k=1; DFS(); 算法核心:第一次次是从所有数字中随机,第二次时从前八个数字中随机,依次类推,这样既保证随机,也不会再重复取已经不符合要求的数字,提高程序的效率 程序的相关分析import java.awt.*; /这个一般在程序开始时用,即置入包。import javax.awt.event.*;/置入处理由awt组件产生的事件,有别于String事件import javax.swing.*;/置入最常用包,最常用的pachage,包含了各种swing组件的类public class:在 java 中用 public class 可以定义一个java 程序的入口类,在 asp 用 class ClassName 可以定义一个类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);/单击窗口按钮时,结束程序运行; new JPanel(new FlowLayout();/流式布局;GridLayout()/网格布局textsi.setEditable(false);/只能显示,不允许编辑;static :声明静态成员变量五、源代码编码如下:import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import java.util.*; public class ShuDu1 extends JFrame implements ActionListener,ItemListener /框架窗口响应单击事件 private MenuBar menubar=new MenuBar(); /私有成员变量 private Menu menu_file=new Menu(File); /定义File菜单按钮 private Menu menu_edit=new Menu(Result); private MenuItem item_ans=new MenuItem(Answer); /定义菜单项 private MenuItem item_sol=new MenuItem(Submit); private MenuItem item_rem=new MenuItem(Restar); private MenuItem item_next=new MenuItem(Star); private MenuItem item_exit=new MenuItem(Exit); private JComboBox box=new JComboBox(); static int data=new int1010; /新建10*10的二维数组 static int ansdata=new int1010; /存放正确答案的二维数组 static int row=new int1010; static int col=new int1010; static int sql=new int4410; static JTextField text=new JTextField1010; static String atext=new String1010; static int hard=2; static int datahard=2,3,5; / 不同的难度 class ShuDuAns extends JFrame /类声明;设置答案窗口 private JTextField atext=new JTextField1010; public ShuDuAns() /构造类 super(Answer); /设置框架窗口标题 this.setSize(300,300); /设置框架尺寸 this.setLocation(200,200); /设置框架显示在屏幕的位置 this.setVisible(true); /组件设为可见 this.setResizable(false); /窗口大小不能改变 JPanel apanel_but=new JPanel(new FlowLayout(); /将面板设为流布局 JPanel apanel_txt=new JPanel(new GridLayout(3,3,2,2); /将面板内部设为网格布局,参数指定为3行3列,并设置大小 JPanel apanel=new JPanel10; for(int i=1;i=9;i+) /尝试填充的次数 apaneli=new JPanel(new GridLayout(3,3); /设置3行3列的网格布局 apanel_txt.add(apaneli); /依次添加组件,添加宫格 int m=(i+2)/3*3-2; int n=(i-1)%3+1)*3-2; for(int j=m;j=m+2;j+) for(int k=n;k=n+2;k+) atextjk=new JTextField(Integer.toString(datajk); /设置为整数 atextjk.setHorizontalAlignment(JTextField.CENTER); /文本设置为水平居中 atextjk.setEditable(false); /不可编辑,只能显示 apaneli.add(atextjk); /添加数字 this.add(apanel_txt); /为当前类添加宫格 static int DFS() /静态成员方法 for(int i=1;i=9;i+) for(int j=1;j=9;j+) if(dataij=0) for(int k=1;k=9;k+) if( rowik=0 & coljk=0 & sql(i+2)/3(j+2)/3k=0 ) /行、列3*3区域的检验 dataij=k; rowik=1; coljk=1; sql(i+2)/3(j+2)/3k=1; /九宫的间隔 if( DFS()=1 ) return 1; else dataij=0; rowik=0; coljk=0; sql(i+2)/3(j+2)/3k=0; /宫内格子间的间 隔 if(k=9) return 0; /都设置完,结束 return 1; static void set_data_zero() /数独初始化 for(int i=0;i=9;i+) for(int j=0;j=9;j+) dataij=0; /0表示数字未给出 static void setnum() /设置数字 setzero(); /未给出的数字,需玩家填入 set_data_zero(); /初始化数独 for(int i=1;i=9;i+) /填充次数 int n =(int)(Math.random()*100)+1; /随机添加任意整数 int j=i*3-(i+2)/3*8-6); dataij=n%9+1; /产生数字 int k=dataij; /设置间隔 rowik=1; coljk=1; sql(i+2)/3(j+2)/3k=1; DFS(); static void setzero() /数独空格初始化 for(int i=0;i=9;i+) for(int k=0;k=9;k+) rowik=0; colik=0; for(int j=0;j=9;j+) for(int k=0;k=9;k+) sql(i+2)/3(j+2)/3k=0; static void settext() /设置数独游戏中的数字 for(int i=1;i=9;i+) for(int j=1;j=9;j+) /int hard=2; /hard代表难度 int n =(int)(Math.random()*100)+1; /随机数 if(n%hard=0) /根据选择的难易程度设置数独 textij=new JTextField(Integer.toString(dataij); textij.setEditable(false); /不可编辑,只能显示 else textij=new JTextField(); /其他难度,新建文本行 textij.setHorizontalAlignment(JTextField.CENTER); /水平居中 atextij=textij.getText(); /设置组件 static int gettext() /玩家填入数字 for(int i=1;i=9;i+) for(int j=1;j=9;j+) try /异常处理 int k=Integer.parseInt(textij.getText(); /第一个文本行输入操作 ansdataij=k; catch(NumberFormatException nfe) /捕获PerseInt( )方法声明的异常对象 JOptionPane.showMessageDialog(null,数据中包括非数字,请重新输入!); /提示出错信息 return 0; return 1; static int ans() /设置答案窗口的面板格局 setzero(); /空格初始化 for(int i=1;i=9;i+) for(int j=1;j9 | k1 ) return 0; if( rowik=1 | coljk=1 | sql(i+2)/3(j+2)/3k=1 ) return 0; rowik=1; coljk=1; sql(i+2)/3(j+2)/3k=1; return 1; public ShuDu1() /数独游戏布局 super(ShuDu Game); /窗口标题 this.setSize(470,500); /设置窗口尺寸 this.setLocation(260,130); /窗口位置 this.setVisible(true); /显示窗口 this.setDefaultCloseOperation(EXIT_ON_CLOSE); /单击窗口按钮时,结束程序运行 this.setResizable(false); /窗口大小不可变 JPanel panel_but=new JPanel(new FlowLayout(); JPanel panel_txt=new JPanel(new GridLayout(3,3,2,2); /将面板设置为3行3列网格布局,并设置大小 JPanel panel=new JPanel10; for(int i=1;i=9;i+) /设置9个面板 paneli=new JPanel(new GridLayout(3,3); /将面板设置为3行3列网格布局 panel_txt.add(paneli); /添加组件 int m=(i+2)/3*3-2; /生成九个3*3的网格,并添加数字 int n=(i-1)%3+1)*3-2; for(int j=m;j=m+2;j+) for(int k=n;k=n+2;k+) paneli.add(textjk); 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); /设置难易程度等级菜单 Object pro= Easy , Common , Difficulty ; box=new JComboBox(pro); /单击事件处理方法,实现ActionListener接口 if(hard=datahard0) box.setSelectedIndex(0); if(hard=datahard1) box.setSelectedIndex(1); if(hard=datahard2) box.setSelectedIndex(2); panel_but.add(box); box.addItemListener(this); public void actionPerformed(ActionEvent e) /单击事件处理方法,实现ActionListener接口 if( e.getSource()=item_exit ) /退出,e.getSource()获得当前事件源组件比较引用 System.exit(0); if( e.getSource()=item_sol ) /提交 if(gettext()=1) if(ans()=1) JOptionPane.showMessageDialog(null,答案正确,恭喜!); else JOptionPane.showMessageDialog(null,答案错误,请再接再厉!); /弹出提示框,显示信息 if( e.getSource()=item_rem ) /重来 for(int i=1;i=9;i+) for(int j=1;j=9;j+) textij.setText(atextij); if( e.getSource()=item_ans ) /答案 new ShuDuAns(); if( e.getSource()=item_next ) /开局 setnum(); settext(); this.setVisible(false); new ShuDu1(); public void itemStateChanged(ItemEvent e) /改变难易程度,事件的处理方法 if(box.getSelectedIndex()=0) / easy hard=datahard0; if(box.getSelectedIndex()=1) / normal hard=datahard1; if(box.getSelectedIndex()=2) / hard hard=datahard2; public static void main(String args) /声明main方法 setnum(); settext(); new ShuDu1(); 六、系统设计和软件发布1、程序运行情况程序正常的响应按钮事件。运行显示:图1-4若框中没有填入数字,则显示消息提示:图1-5这是程序进行的异常处理,使用try-catch,捕捉输入整数的方法抛出的异常对象。此时只要按确定,框内都输入数字即可。显示正确答案窗口:图1-6提交后,若答案错误,弹出答案错误提示框图1-7提交后,答案正确,弹出答案正确提示框图1-8不同的难易程度:图1-9图1-102、软件的发布三种发布程序的方式:1、Packaging Programs in IAR Files2、Deploying Applications with Java Web start3、Creating and Deploying Applets with Java Plug-in按第一种方式进行发布如在D:/java/ShuDu1.clacc打包成jar文件发布步骤:(1)、在D:/java中生成一个文件mainclass.my(如图所示)它里面可以只有一行文字Main-Class :Text1,冒号后必须有空格,该行文字必须以回车键结束(2)、使用如下命令将mainclass.mf并入一个JAR文件的manifest,生成app.jar:Jar cmf mainclass.mf app.jar ShuDu1.clss图1-11生成app.jar:(3)、使用命令行运行ShuDu1.class:java -jar app.jar 或者在jar文件的图标上双击也可以图1-123、分析讨论运行结果基本上完成了实验题目所要求的功能。使用方便明了,设计上有层次,立体感强。可是九宫格数独小游戏和网络上的游戏软件仍有很
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 波峰焊技术员试题及答案
- ISO 9001(DIS)-2026重大变化之1:“质量文化和道德行为”专题深度专业解读与应用指导材料(雷泽佳编制-2025A0)
- 农业银行2025金融科技岗笔试题及答案安徽地区
- 农业银行2025乐山市秋招笔试英语题专练及答案
- 中国银行2025六盘水市秋招结构化面试经典题及参考答案
- 2025年3D打印技术的骨骼修复技术
- 2025年3D打印技术的材料科学与制造工艺
- 建设银行2025吐鲁番市信息科技岗笔试题及答案
- 辅导员业务知识培训课件
- 农业银行2025黄石市秋招笔试创新题型专练及答案
- 医疗机构患者信息管理制度
- 云南省公路工程试验检测费用指导价
- 安全生产管理制度-普货运输
- 建设项目日照分析报告
- 2024八年级数学上册第12章一次函数12.1函数第1课时上课课件新版沪科版
- 一年级新生家长会课件(共25张课件)
- 第八届全国职工职业技能大赛(网络和信息安全管理员)安徽选拔赛试题及答案
- 2024年秋新译林版英语三年级上册 Unit 3第1课时 Cartoon time 教学课件
- (部编版)统编版小学语文教材目录(一至六年级上册下册齐全)
- 送教上门记录24篇
- 2025届广东省佛山市南海区数学七上期末统考试题含解析
评论
0/150
提交评论