JAVA数独(九宫格)游戏软件设计报告

  • 格式:doc
  • 大小:454.50 KB
  • 文档页数:20

佛山科学技术学院《可视化编程技术》课程设计报告数独(九宫格)游戏软件设计学生姓名:***学号: **********年级专业:12级教育技术学2班指导老师:***学院:教育科学学院广东★佛山提交日期:2014年6月目录1. 前言______________________________2 2.概要设计____________________________32.1 数独游戏分析_________________________3 2.2 数独游戏界面设计_______________________52.3 数独游戏程序功能_______________________53. 详细设计___________________________7 3.1类设计___________________________73.2 数独算法设计_________________________94.程序代码____________________________105.参考资料____________________________196.心得体会____________________________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 的数字在每一行、每一列、每一宫都只能出现一次的规则进行解题的方法。

使用单元排除法的目的就是要在某一单元(即行,列或区块)中找到能填入某一数字的唯一位置,换句话说,就是把单元中其他的空白位置都排除掉。

游戏布局:①JPanel panel_txt=new JPanel(new GridLayout(3,3,2,2));//将面板设置为3行3列网格布局,并设置大小②for(int i=1;i<=9;i++){ //设置9个面板panel[i]=new JPanel(new GridLayout(3,3)); //将面板设置为3行3列网格布局:panel_txt.add(panel[i]); //添加组件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++){panel[i].add(text[j][k]);}}}2.2数独游戏界面设计2.3数独游戏程序功能功能1:弹出游戏界面,可直接开始进行数独游戏,也可以在游戏过程中选择菜单栏中“文件”——“新局”,进行新一局的游戏,或者是“文件”——“重来”,重新开始当前局。

功能2:判断答案的正误。

游戏当前局完成后,可选择菜单栏中“文件”——“提交”,系统会根据玩家在当前局所填写的结果,弹出相应的对话框。

当输入的内容不符合要求时,弹出对话框:当结果不正确时,弹出对话框:当答案正确时,弹出对话框:功能3:选择菜单栏中“文件”——“答案”,会弹出当前局数独游戏的正确答案的新窗口,给玩家提供参考。

功能4:选择菜单栏中“帮助”——“说明”,会弹出次数独游戏玩法的相关说明的新窗口,给玩家提供帮助。

另外,选择菜单栏中“帮助”——“作者”,会弹出对话框,显示此程序作者的相关信息。

功能5:选择菜单栏中“文件”——“退出”,会自动关闭当前的数独游戏界面,退出系统。

功能6:玩家可根据自身的情况或兴趣,在数独游戏界面上方的下拉列表中选择适合自己的难度(难度共分为3级,分别是“简单”,“一般”和“困难”),然后选择重新开局,游戏的难度会进行相应的变化。

功能7:在九宫格数独游戏界面和弹出的消息提示界面以及答案显示窗口和玩法说明窗口有相关的最小化、最大化、关闭等按钮可以操作,玩家可根据需要自行选择相关操作。

3详细设计3.1类设计类的对象:属于ShuDu1主类的对象成员: MenuBar、Menu、MenuItem、JComboBox 属于ShuDuAns类的对象:JTextField属于String类的对象:atext[i][j]属于JtextField类的对象:text[i][j]、属于JPanel类的对象:apanel[ ]、panel[ ]类:包括上述所有类及父类Jframe。

类的属性:ShuDu1: publicString: publicJtextField:privateJPanel:privateJframe:public程序流程图:3.2数独算法设计static int DFS(){for(int i=1;i<=9;i++){for(int j=1;j<=9;j++){if(data[i][j]==0){for(int k=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 )return 1;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)return 0;}}}}return 1;}static void set_data_zero(){ //数独的初始化for(int i=0;i<=9;i++){for(int j=0;j<=9;j++){data[i][j]=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);data[i][j]=n%9+1; //产生数字int k=data[i][j]; row[i][k]=1; col[j][k]=1;sql[(i+2)/3][(j+2)/3][k]=1;}DFS();}算法核心:数独游戏中的数字第一次是从所有数字中随机,第二次时从前八个数字中随机,依此类推,这样的数独算法既保证了随机性,也不会重复取已经不符合要求的数字,大大地提高程序的效率。

4程序代码import java.awt.*; //置入包import java.awt.event.*; //置入处理由awt组件产生的事件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("文件"); //定义“文件”菜单按钮private Menu menu_help=new Menu("帮助"); //定义“帮助”菜单按钮private MenuItem item_ans=new MenuItem("答案"); //定义菜单项private MenuItem item_sol=new MenuItem("提交");private MenuItem item_rem=new MenuItem("重来");private MenuItem item_next=new MenuItem("新局");private MenuItem item_exit=new MenuItem("退出");private MenuItem item_auther=new MenuItem("作者");private MenuItem item_explain=new MenuItem("说明");private JComboBox box=new JComboBox(); //创建具有默认数据模型的复选框组件box static int data[][]=new int[10][10]; //新建10*10的二维数组static int ansdata[][]=new int[10][10]; //新建存放正确答案的二维数组static int row[][]=new int[10][10];static int col[][]=new int[10][10];static int sql[][][]=new int[4][4][10];static JTextField text[][]=new JTextField[10][10]; //创建二维数组文本框组件textstatic String atext[][]=new String[10][10];static int hard=2; //默认初始难度为2static int datahard[]={2,3,5}; // 不同的难度class ShuDuAns extends JFrame{ //类声明;设置答案窗口private JTextField atext[][]=new JTextField[10][10];public ShuDuAns(){ //构造类super("答案"); //设置框架窗口标题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 JPanel[10]; //创建面板数组apanelfor(int i=1;i<=9;i++){ //尝试填充的次数apanel[i]=new JPanel(new GridLayout(3,3)); //给面板数组apanel添加GridLayout 布局管理器,设置3行3列的网格布局apanel_txt.add(apanel[i]); //将面板数组apanel添加到有GridLayout布局管理器的面板apanel_txt中,依次添加组件,添加宫格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++){atext[j][k]=new JTextField(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); //为当前类添加宫格}}class Another extends JFrame{Another(){this.setTitle("玩法说明");this.setSize(500,400);this.setAlwaysOnTop(true);this.setVisible(true);setLayout(new GridLayout(4,1));Panel operate=new Panel();JLabel label1,label2,label3,label4;label1=new JLabel("1.在空格上填入1到9的数字,每个数字在每个小九宫格、每行、每列只能出现一次。