当前位置:文档之家› java课程设计九宫格数独

java课程设计九宫格数独

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

计算机与信息工程系《数独游戏的设计与实现》课程设计

2013-2014学年第二学期《面向对象程序设计》

课程设计报告

题目:九空格数独游戏的设计与实现

专业:计算机科学与技术

班级:12级计科(1)班

姓名:程龙军

指导教师:陈磊

成绩:

计算机与信息工程系

2014年 6 月 6 日

目录

一、题目描述 (3)

二、设计分析 (3)

1、基本解法 (3)

2、软件系统的功能 (4)

3、对性能的要求 (4)

三、设计思路 (5)

1、分析找出问题域中的对象 (5)

2、确定类的属性 (5)

3、确定对象之间的关系 (5)

四、系统设计 (6)

五、源代码 (13)

六、系统设计和软件发布 (24)

1、程序运行情况 (24)

2、软件的发布 (28)

3、分析讨论 (29)

七、难点及关键技术分析 (30)

八、心得体会 (30)

九、参考文献 (31)

一、题目(问题)描述

在9×9格的大九宫格中有9个3×3格的小九宫格,并提供一定数量的数字。根据这些数字,利用逻辑和推理,在其它的空格上填入1到9的数字。每个数字在每个小九宫格内只能出现一次,每个数字在每行、每列也只能出现一次。这种游戏只需要逻辑思维能力,与数字运算无关。虽然玩法简单,但数字排列方式却千变万化,所以不少教育者认为数独是锻炼脑筋的好方法。

二、设计分析

1、基本解法:

利用1 ~ 9 的数字在每一行、每一列、每一宫都只能出现一次的规则进行解题的方法。

实际寻找解的过程为:

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

那么要如何排除其余的空格呢?当然还是不能忘了游戏规则,由于

1-9的数字在每一行、每一列、每一个九宫格都要出现且只能出现一次,所以:

如果某行中已经有了某一数字,则该行中的其他位置不可能再出现这一数字

如果某列中已经有了某一数字,则该列中的其他位置不可能再出现这一数字

如果某区块中已经有了某一数字,则该区块中的其他位置不可能再出现这一数字。

图1-1

单元格:数独中最小的单元,标准数独中共有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: public String: public

JtextField:private JPanel:private

Jframe:public

3、确定对象之间的关系(包括依赖、泛化、关联、实现等等)Jframe与主类ShuDu1之间:泛化

texts[ ](JtextField)与atext [ ](String)之间:依赖

String与ShuDu1之间:依赖

Resizable、Editable、Visible与texts[ ]之间:实现

i、j与text[i][j]、atext[i][j]之间:关联

类设计

表1-1

四、系统设计(类设计、数据设计、方法设计、算法设计等)类的设计(对象的设计)(类图、对象图)

图1-2

图1-3

java 程序中数独的算法设计

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();

}

算法核心:第一次次是从所有数字中随机,第二次时从前八个数字中随机,依次类推,这样既保证随机,也不会再重复取已经不符合要求的数字,提高程序的效率

程序的相关分析

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只能在类中被调用.如果定义了privat e,就不能被外部类所访问了

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()//网格布局

texts[i].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 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];

static String atext[][]=new String[10][10];

static int hard=2;

static int datahard[]={2,3,5}; // 不同的难度

class ShuDuAns extends JFrame{ //类声明;设置答案窗口

private JTextField atext[][]=new JTextField[10][10];

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 JPanel[10];

for(int i=1;i<=9;i++){ //尝试填充的次数

apanel[i]=new JPanel(new GridLayout(3,3)); //设置3行3列的网格布局

apanel_txt.add(apanel[i]); //依次添加组件,添加宫格

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); //为当前类添加宫格

}

}

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 ){ //行、列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 )

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; //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();

}

static void setzero(){ //数独空格初始化

for(int i=0;i<=9;i++){

for(int k=0;k<=9;k++){

row[i][k]=0;

col[i][k]=0;

}

for(int j=0;j<=9;j++){

for(int k=0;k<=9;k++){

sql[(i+2)/3][(j+2)/3][k]=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){ //根据选择的难易程度设置数独

text[i][j]=new JTextField(Integer.toString(data[i][j]));

text[i][j].setEditable(false); //不可编辑,只能显示

}

else{

text[i][j]=new JTextField(); //其他难度,新建文本行

}

text[i][j].setHorizontalAlignment(JTextField.CENTER); //水平居中atext[i][j]=text[i][j].getText(); //设置组件

}

}

}

static int gettext(){ //玩家填入数字

for(int i=1;i<=9;i++){

for(int j=1;j<=9;j++){

try{ //异常处理

int k=Integer.parseInt(text[i][j].getText()); //第一个文本行输入操作

ansdata[i][j]=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;j<=9;j++){

int k=ansdata[i][j];

if( k>9 || k<1 ){

return 0;

}

if( row[i][k]==1 || col[j][k]==1 || sql[(i+2)/3][(j+2)/3][k]==1 ){

return 0;

}

row[i][k]=1;

col[j][k]=1;

sql[(i+2)/3][(j+2)/3][k]=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 JPanel[10];

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]);

}

}

}

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==datahard[0]){

box.setSelectedIndex(0);

九宫格数独及答案(18道)

题目:1、 6 1 3 2 5 8 1 7 7 3 4 9 6 7 8 3 2 9 5 5 7 3 9 1 9 7 8 2 4 6 4 1 2 5 2、 1 8 3 2 5 7 1 5 9 6 4 7 4 8 5 9 3 1 4 5 1 4 3 6 3 6 7 4 6 7 9 8 5 2 3

3 7 4 6 2 4 1 5 3 9 6 7 4 3 6 8 7 3 5 9 7 2 7 1 8 2 4 1 6 8 9 4 5 3 4、 8 5 2 1 9 4 1 2 3 3 7 4 5 3 4 9 4 2 6 3 1 3 9 7 6 8 5 1 8 4 3 6 2 7 8 9

8 1 6 7 4 2 1 5 3 9 6 2 4 5 1 3 8 9 7 5 5 7 3 9 5 6 3 9 3 1 2 5 5 8 4 6、 1 2 6 8 9 6 4 1 8 5 2 3 7 7 5 2 3 4 6 3 8 1 9 5 4 2 8 1 7 3 2 3 5 9 7 6

4 7 5 8 6 5 3 2 1 7 6 3 6 7 2 4 9 8 4 6 4 5 1 9 1 5 2 2 8 4 5 3 5 9 7 1 8、 7 9 2 5 7 6 5 8 1 4 7 4 1 3 6 1 8 9 9 8 6 5 8 9 1 1 6 3 2 6 3

7 1 3 6 5 7 3 5 1 5 3 4 8 4 7 1 2 9 7 2 4 2 7 3 3 4 6 5 9 2 10、 1 3 4 8 6 9 5 6 5 9 6 2 1 1 7 2 3 4 1 6 7 9 2 5 8 4 9 7 6

最新九宫格数独题目大全.pdf

难度系数 3 完成时间_____分钟 9 2 1 5 4 3 5 7 8 6 9 6 2 1 4 9 5 9 4 2 1 6 3 5 难度系数 3 完成时间_____分钟 7 1 8 5 5 8 1 9 7 4 6 7 3 5 2 7 1 3 5 6 9 8 5 2 4 9 6 8

2 2 8 7 5 9 1 4 1 6 2 3 1 7 8 4 5 4 9 3 8 6 5 6 难度系数 3 完成时间_____分钟 4 5 2 7 9 6 3 4 2 5 3 1 4 5 9 6 4 1 3 6 7 9 4 8

7 6 8 4 7 4 9 3 7 2 8 4 3 6 8 9 4 6 3 5 7 2 2 5 难度系数 3 完成时间_____分钟 1 7 6 5 9 1 5 8 7 9 1 3 2 8 6 1 8 7 3 7 4 8 6 3

9 2 3 7 8 3 9 7 1 7 6 6 4 7 5 6 8 2 1 9 8 4 3 1 5 难度系数 3 完成时间_____分钟 3 9 4 9 5 2 7 2 5 3 9 1 4 7 4 8 5 7 9 1 1 8 5 3

8 1 3 6 5 1 7 9 5 3 6 9 3 2 4 7 5 8 4 5 6 8 4 6 难度系数 3 完成时间_____分钟 5 3 6 9 2 7 4 2 1 3 5 2 8 6 6 7 9 1 7 1 4 4 3 9 2

8 6 3 4 7 3 1 6 9 3 2 6 3 5 2 8 4 1 6 8 1 7 9 1 5 难度系数 3 完成时间_____分钟 8 3 3 9 1 1 8 2 7 2 5 3 1 3 8 3 5 6 4 1 6 8 4 8 9 5 6

相关主题
文本预览
相关文档 最新文档