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

合集下载

“数独游戏”的开发实验报告

“数独游戏”的开发实验报告

”的开发实验报告数独游戏”“数独游戏一、实验目的通过“数独游戏”Android应用程序的开发,掌握一个实际应用项目的开发流程和知识。

二、开发步骤(一)设计用户界面1、创建启动界面(1) 使用Eclipse插件创建一个Android应用程序(2) 修改res/layout/main.xml文件,使用不同的文本和几个按钮替换原标签(3) 在res/values/strings.xml中定义要用到的字符串(4)2、模式切换为使横向模式下人能正常显示,可为横向模式创建一个不同的布局。

创建名为res/layout-land/main.xml文件,该文件采用TableLayout布局方式创建两列按钮。

3、实现About对话框(1) 为About按钮活动创建一个布局文件res/layout/about.xml(2) 在About,java中定义About活动,重写onCreate()方法和并调用setContentView()方法(3) 将About对话框的标题及对话框中包含的文本内容添加到res/values/strings.xml中(4)(5)4、应用主题可以在res/values/styles.xml中定义自定义主题,但在此只需利用一个预定义主题,在Android.Manifest.xml中修改About的定义,使其具有主题特性(property)。

5、添加菜单实现在按下Mune按钮时弹出菜单(1) 在res/values/strings.xml中定义要用到的字符串(2) 在res/menu/menu.xml中定义菜单(3) 将上面定义的菜单加到Sudoku类中,并导入以下包:import android.view.Menu;import android.view.MenuInflater;import android.MenuItem;(4) 重写Sudoku类中的onCreateOptionsMenu()方法6、添加设置在Sudoku程序中添加两个设置,一个用于播放背景音乐,一个用于显示提示信息。

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的数字在每一行、每一列、每一个九宫格都要出现且只能出现一次,所以:如果某行中已经有了某一数字,则该行中的其他位置不可能再出现这一数字如果某列中已经有了某一数字,则该列中的其他位置不可能再出现这一数字如果某区块中已经有了某一数字,则该区块中的其他位置不可能再出现这一数字。

数独游戏报告

数独游戏报告

数独游戏院系:班级:组长:组员:指导教师:2010 年12 月29 日数据结构课程设计任务书一、题目:数独游戏二、设计要求(1)XXX(组长)、XXX(组员)和 XXX(组员)组成设计小组。

(2)小组成员分工协作完成,要求每个成员有自己相对独立的模块,同时要了解其他组员完成的内容。

(3)查阅相关资料,自学具体课题中涉及到的新知识。

(4)根据实现的功能,划分出合理的对象类,明确对象类间的关系。

为每个对象类设计正确的属性和方法,为每个方法设计合理的方法体。

(5)编程简练,程序功能齐全,能正确运行。

(6)课题完成后提交课程设计报告,格式规范,内容详实。

其主要内容包括:1-封皮、2-课程设计任务书,3-指导教师评语与成绩、4-目录、5-需求分析、6-概要设计、7-详细设计(含主要代码)、8-调试分析与测试结果、9-用户使用说明、10-附录或参考资料。

报告用A4纸打印,中文字体为宋体,西文字体用Time New Roma,小四号字,行距采用“固定值”18磅,首行缩进2字符。

(7)课程设计报告内容的说明:需求分析-分析课题需要实现的功能以及要用到的知识点,分析课题涉及的对象间的关系;概要设计-根据实现的功能;详细设计-具体的功能的实现以及主要程序代码;调试分析与测试结果-用多组测试用例调试分析系统的正确性、完备性等各项性能指标,写出测试结果;用户使用说明-编写该系统的使用说明书;附录或参考资料-完整的程序代码以及查阅资料的参考文献。

三、课程设计工作量由于是设计小组团结协作完成设计任务,一般每人的程序量在200行有效程序行左右,不得抄袭。

四、课程设计工作计划2010年12月21日,指导教师讲课,学生根据题目准备资料;2010年12月21日~2010年12月27日,设计小组进行总体方案设计和任务分工;每人完成自己承担的程序模块并通过独立编译;2010年12月28日~2010年12月29日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;同时撰写报告。

数独游戏在Java开发环境下使用Swing库进行开发

数独游戏在Java开发环境下使用Swing库进行开发

数独游戏在Java开发环境下使用Swing库进行开发数独游戏是一种智力益智类游戏,通过填写9×9的方格中的数字,使得每一行、每一列和每一个宫都包含了1到9的所有数字,而且在每一行、每一列和每一个宫中都没有重复数字。

在本文中,将介绍如何使用Java开发环境下的Swing库来实现一个简单的数独游戏。

Swing库是Java中用于创建图形用户界面(GUI)的一套组件。

通过使用Swing库,我们可以轻松创建各种用户界面,包括按钮、文本框、标签等,以及处理用户交互。

在这个数独游戏的开发中,我们将使用Swing库来创建一个可交互的数独游戏界面,并实现数独游戏的逻辑。

首先,我们需要创建一个窗口来容纳数独游戏界面。

这可以通过Swing库中的JFrame类来实现。

JFrame类表示一个顶层窗口,我们可以在其中添加其他的Swing组件。

通过设置JFrame的标题、大小和关闭操作,我们可以创建一个适用于数独游戏的窗口。

接下来,我们将创建一个9×9的网格来表示数独游戏的方格。

在Swing库中,可以使用JPanel类来创建一个面板,并将其设置为GridLayout布局。

GridLayout布局可以将面板分割为固定数量的行和列,适合用于显示网格。

我们将在这个面板中添加81个文本框来表示数独方格,以及一个按钮用于提供重置游戏的功能。

当用户点击某个数独方格时,我们将使该方格成为焦点,并允许用户在键盘上输入数字。

为了实现这一功能,我们可以为所有的文本框添加一个事件监听器,并在焦点变化时记录当前焦点的位置。

通过处理用户键盘输入事件,我们可以将输入的数字显示在方格中,并验证该数字的合法性。

在数独游戏中,我们需要检查每一行、每一列和每一个宫中是否包含了1到9的所有数字,并且没有重复数字。

我们可以通过创建相应的检查函数来实现这一功能。

当用户完成数独游戏并点击验证按钮时,我们将使用这些检查函数来验证用户填写的数字是否正确。

数独游戏课程设计报告

数独游戏课程设计报告

数独游戏课程设计报告将“数独”智力游戏的难度划分与创建问题分解为建立终盘和初盘、难度评分、游戏创建。

首先采用行列变换的方法建立终盘,然后隐去部分数字并检验解唯一性,得到初盘。

在已得到初盘的基础上,根据求解时初级方法和高级方法使用的次数确定难度评分,从而依据分数对题目的难度进行划分,以此创建不同等级难度的“数独”游戏。

最后通过实验验证了模型的实用性。

下面是的数独游戏课程设计报告,欢迎来参考!“数独”是18世纪瑞士数学家欧拉发明。

该游戏是在9×9的单元网格中进行,这些网格被分9行、9列和3×3个九宫格。

单元网格中已有若干数字,其余均为空格。

玩家需要推理出所有剩余空格的数字,并满足每一行、每一列、每一个小九宫格内的数字均含1-9且不重复。

每一道合格的“数独”谜题都有且仅有唯一答案。

目前,“数独”作为一种智力游戏已经风靡世界,国内外许多学者已对数独的求解算法做了深入研究,例如递归法[1]、回溯候选数法[2]、枚举算法[3]等,但在数独的难度划分与创建方面的研究还很少。

由于影响“数独”难度的因素有很多,就问题本身而言,难度因素包括最高难度的技巧、各种技巧所用次数、是否有隐藏及隐藏的深度和广度的技巧组合、当前盘面可逻辑推导出的个数等等;就玩家而言,了解的技巧数量、熟练程度、观察力等也属于难度划分应考虑的因素。

因此,单单利用空格数或求解时间对题目难度进行划分是不全面的,其难度指标定义过于主观,讨论也不够细致,无法真正划分难度的级别。

本文首先创建符合要求的“数独”终盘,然后在终盘的基础上生成具有数独特性的初盘,根据求解时初级方法和高级方法使用的次数确定难度评分,从而依据分数对题目的难度进行划分,以此创建不同等级难度的“数独”游戏。

1终盘和初盘生成首先运用初等行、列变换,构造一个新的简单明了的终盘生成算法,具体步骤如下:Step1:从行的角度出发,在第一行随机输入1-9的数字。

以一个小九宫为单位,将相邻三个数字作为一个集体进行交替,由此获得第二行的数字,再由第二行的数字根据前述方法变换得到第三行的数字。

《Java语言程序设计》大作业报告九宫格游戏

《Java语言程序设计》大作业报告九宫格游戏

if(replay==JOptionPane.YES_OPTION){
Game G=new Game();
1. 运行结果及分析
因为是字节流储存,所以显示是字符
1. 设计经验总结 刚刚开始感觉很难,因为对图形界面太不了解了,有的函数和类都不知道,所以超级难入手,但是当看网上的代码和同学的多了之后也就知道该怎么编了,一旦入手,后 面的就感觉没有那么难了,现在编完了就感觉图形界面也就那么回事,都是固定的模式,模块添加也很简单,虽然还是有很多不懂的地方但是相比于做大作业之前已经有 很多的提高了,还认识了很多不认识的组件,同学们都用了不同的方法,我用的是网格布局然后添加button,感觉这样界面友好一点。弹出的对话框可以JOptionPane而不 是再定义JDialog,文件的读写方法很多,选一种自己理解的就好。 总的来说学到了很多知识,更加巩固了本来就很薄弱的java。 附:源程序
Buttons[i-1][j].setEnabled(true);
Buttons[i][j].setText("");
Buttons[i][j].setEnabled(false);
number_path++;
}
if(j+1!=3&&Buttons[i][j+1].getText()==""){
Buttons[i][j+1].setText(Buttons[i][j].getText());
e1.printStackTrace();
}
if(number_path>best_recond){
JOptionPane.showConfirmDialog(this,"你太厉害了!!这么难都能赢!!!才用了"+Integer.toString(number_path)+"步!!然而并没有打破记录。历史最佳成绩是:"+Integer.toString(best_recond));

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

JAVA数独(九宫格)游戏软件设计报告(推荐文档)
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;
2
2.1数独游戏分析
数独游戏组成元素:
单元格:数独中最小的单元,标准数独中共有81个;
行:横向9个单元格的集合;
列:纵向9个单元格的集合;
宫:粗黑线划分的区域,标准数独中为3×3的9个单元格的集合;
已知数:数独初始盘面给出的数字;
候选数:每个空单元格中可以填入的数字。
基本解法:
利用1~9的数字在每一行、每一列、每一宫都只能出现一次的规则进行解题的方法。使用单元排除法的目的就是要在某一单元(即行,列或区块)中找到能填入某一数字的唯一位置,换句话说,就是把单元中其他的空白位置都排除掉。
网格布局:
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]);
static int hard=2; //默认初始难度为2
static int datahard[]={2,3,5}; //不同的难度

数独游戏的设计与开发毕业设计

数独游戏的设计与开发毕业设计

摘要本文介绍了利用C++语言编写数独游戏的方法。

游戏的开发设计使用了vs2010作为开发工具,根据数独游戏特有的规则特点对游戏进行设计。

并且游戏在开发的过程中使用了微软的MFC开源框架,在数独游戏的界面上做了一定的处理。

本文首先对游戏进行了简单的介绍,对游戏的计算机实现进行分析。

最后通过部分游戏截图和数据表格来介绍了游戏的开发设计过程和游戏的基本操作。

并根据软件工程的方法,从需求分析、概要设计、详细设计、编码实现等方面阐述了游戏的开发流程,并通过游戏界面的截图、数据表格等体现了我的设计思路。

关键字:数独 C++ MFC 毕业设计T AbstractThis paper describes the use of C + + method number written language alone game. Game development and design using vs2010 as a development tool, according to the Sudoku rules specific to the characteristics of the game design. And the game uses Microsoft's MFC source framework development process, in Sudoku interface to do some processing. This paper first gives a brief introduction to the game, the game's computer-implemented analysis. Finally, some games screenshots and data tables to introduce the basic operation of the game development and game design process. And in accordance with the method of software engineering, from requirements analysis, aspects of the outline design, detailed design, coding realization expounded the game development process, and through screenshots game interface, data tables, etc. embodies my design ideas.Keywords: Sudoku C++ MFC graduation目录1 引言 (1)1.1 简介 (1)1.2 数独的起源 (1)1.3 数独的发展 (1)2 开发环境及开发工具 (2)2.1 C++语言简介 (2)2.2 MFC语言简介 (2)3.系统的需求分析 (2)3.1现行系统概况描述...............................................,23.2需求分析 (2)4.系统开发可行性分析 (2)5.系统分析 (2)6.系统设计 (3)6.1设计思路 (3)6.2系统主要类设计 (3)6.2.1 GamePad类 (3)6.2.2 SudokuDlg类 (4)6.2.3 Sudokugame类 (5)7.系统主要技术特色 (11)8.结论 (11)9.参考文献 (12)10.致谢 (12)1.引言1.1简介数独游戏是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数学智力拼图游戏。

数独实训报告

数独实训报告

一、实训背景数独是一种起源于18世纪的数字谜题游戏,因其简单易学、变化无穷的特点,深受广大玩家的喜爱。

近年来,随着人工智能技术的不断发展,数独求解算法也日益成熟。

为了提高我们的编程能力和逻辑思维能力,本次实训选择了数独求解算法作为实训内容。

二、实训目的1. 理解数独游戏的基本规则和求解方法。

2. 掌握数独求解算法的设计与实现。

3. 提高编程能力和逻辑思维能力。

4. 分析和解决实际问题。

三、实训内容1. 数独游戏规则数独游戏在一个9x9的网格中,分为9个3x3的小区域。

游戏的目标是在空白格中填入1至9的数字,使得每一行、每一列以及每一个3x3的小区域内的数字都不重复。

2. 数独求解算法(1)穷举法穷举法是最简单的数独求解算法,通过尝试将1至9的数字填入空白格,然后检查是否满足数独规则。

如果满足,则得到一个解;如果不满足,则回溯到上一个数字,尝试下一个数字。

(2)回溯法回溯法是一种递归算法,通过递归尝试将数字填入空白格,如果当前填入的数字满足规则,则继续递归填下一个数字;如果不满足规则,则回溯到上一个数字,尝试下一个数字。

(3)约束传播法约束传播法是一种启发式算法,通过约束条件来缩小空白格的候选数字。

具体步骤如下:① 遍历所有空白格,统计每个格子的候选数字。

② 对于每个空白格,检查其所在的行、列和3x3小区域,排除已存在的数字。

③ 更新空白格的候选数字,重复步骤②,直到所有空白格的候选数字为空或只有一个数字。

3. 算法实现本次实训采用Java语言实现数独求解算法,具体步骤如下:(1)定义数独类,包含棋盘、空白格列表、候选数字列表等属性。

(2)实现穷举法、回溯法和约束传播法。

(3)在主函数中,读取数独题目,调用求解算法,输出解。

四、实训结果本次实训成功实现了数独求解算法,并测试了多个数独题目。

实验结果表明,算法能够快速求解一般难度的数独题目,对于一些较难的题目,也可以在较短时间内找到解。

五、总结与反思1. 通过本次实训,我们掌握了数独游戏的基本规则和求解方法,提高了编程能力和逻辑思维能力。

java综合实验报告

java综合实验报告

3、对性能的要求 、
(1)具有较强的实用性 ) (2)易于理解和应用 ) (3)对程序的配置要求不高, )对程序的配置要求不高, 能广泛应用
4、应用环境的要求 、
JDK 成功安装,设置环境变量 成功安装, (JAVA_HOME=C:\ProgramFiles\Java\jdk1.6.0_10 classpath= .;C:\Program Files\Java\jdk1.6.0_10\lib; Path= C:\Program Files\Java\jdk1.6.0_10\bin;) )
利用1 的数字在每一行、 利用 ~ 9 的数字在每一行、 每一列、 每一列、每一宫都只能出 现一次的规则进行解题的 方法。 方法。 可弹出游戏界面,方便用户操作, 可弹出游戏界面,方便用户操作, 界面易于用户理解。 界面易于用户理解。可以选择游 戏开始或重新开局。 戏开始或重新开局。可以判断正 能给出正确答案, 误,能给出正确答案,当输入的 内容不符合要求时,弹出对话框, 内容不符合要求时,弹出对话框, 提示输入错误。当结果不正确时, 提示输入错误。当结果不正确时, 弹出对话框,提示答案错误。 弹出对话框,提示答案错误。答 案正确时。弹出对话框, 案正确时。弹出对话框,显示答 案正确。 案正确。在九宫格数独游戏界面 和弹出的消息提示界面有相关的 最小化、最大化、 最小化、最大化、关闭等按钮可 以操作。 以操作。
//类声明 类声明; 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行3列,并设置大小 JPanel apanel[]=new JPanel[10];

Java实现数独小游戏

Java实现数独小游戏

Java实现数独⼩游戏本⽂实例为⼤家分享了Java实现数独⼩游戏的具体代码,供⼤家参考,具体内容如下题⽬要求:制作⼀个数独游戏。

数据游戏拼图由⼀个3*3的九宫格组成,每个格式⼜分成⼀个⼩九宫格,共九九⼋⼗⼀个⼩格⼦。

游戏规则:游戏开始前会有⼀些格式了写好了1-9的数,在剩下的格式⾥填写1-9的数,直到把所有格式填满,要求任何⼀⾏或⼀列或者任⼀个⼩九宫中没有相同的数字。

拼图⽰例如下:任务要求:(1)可以根据在九宫格中初始给出的数字个数设定游戏难度,如初始给出30个数设定为难、35个数设定为中等难度、40个数设定为容易。

(2)对于初始给出的数据要能验证题⽬的合法性(即验证给出数据本⾝是否符合游戏规则,⾏、列及⼩九宫中不能出现重复数字1-9),对玩游戏中填⼊的数字在提交后要能验证其正确性(任何⼀⾏或⼀列或者任⼀个⼩九宫中没有相同的数字)。

(3)程序能保存玩家的信息、游戏记录以及成绩(最⾼分),并能够在游戏结束时查看玩家排名。

⼯作流程如下:该数独游戏需要连接数据库,登录⽤户和保存数据记录,连接数据库创建表等暂不作显⽰。

主要数独游戏部分(除去登录页⾯,注册页⾯,查看排名页⾯不做显⽰)分为Main(⽣成数独,将⽣成100个数独保存在⽂件中,也可以不保存,每次⽣成数独都为⼀次新的数独不做记录,效率较差)和Play(数独显⽰页⾯,同时包括填写数独和判断数独是否正确)两类。

1、Main类package shudu;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.GridLayout;import java.awt.SystemColor;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.util.Random;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;public class Main {private int[][] Arry; //得到⼀个9*9的数独private int[][] shudu; //挖空arry数组中的数字private int[][] answer; //存储数独答案private int[][] game; //最终数独private int grade;private int[] row; //每⼀⾏的个数private int[] col; //每⼀列的个数private int[] places; //每⼀个九宫格的个数private boolean flag=false;//读取⽂件名private String filename=new String("C:\\Users\\liaolilan\\Desktop\\shudu.txt");public static void main(String[] args){Main mainer=new Main();// mainer.UI();}public void UI(){for(int k=0;k<100;k++){this.Arry=new int[9][9];this.shudu=new int[9][9];this.game=new int[9][9];this.answer=new int[9][9];this.row=new int[9];this.col=new int[9];this.places=new int[9];this.grade=grade;flag=false;//初始化数组for(int i=0;i<9;i++)row[i]=col[i]=places[i]=9;//调试// this.answer=new int[9][9]; //最终答案存储再arry中rand();//先产⽣15个随机数加上随机位置,⼀定需要随机⽣成,不然就会⼀直都是⼀个数组 for(int i=0;i<9;i++){for(int j=0;j<9;j++)System.out.print(Arry[i][j]);System.out.println();}dfs(Arry,0);//获得⼀个数组答案d// diger(grade);//挖空数组//将100个数独写⼊⽂件中try{String data = "";File file =new File(filename);//if file doesnt exists, then create itif(!file.exists()){file.createNewFile();}//true = append fileFileWriter fileWritter = new FileWriter(filename,true);BufferedWriter bufferWritter = new BufferedWriter(fileWritter);bufferWritter.write(k+1+"\r\n");for(int i=0;i<9;i++){data="";for(int j=0;j<9;j++){data=data+answer[i][j]+"";}System.out.println(data);}bufferWritter.close();System.out.println("Done");}catch(IOException e){e.printStackTrace();}}}//随机给数public void rand(){int t=0;//t=14不随机性太⾼,容易产⽣没有解的数独,经过参考资料发现,当t=6的时候,⼏乎100%有解 while(t<6){int x=new Random().nextInt(9);int y=new Random().nextInt(9);int i=new Random().nextInt(9)+1;if(Arry[x][y]==0){if(istrue(Arry,x,y,i)){ //判断数是否能填Arry[x][y]=i;t++;}}}}//判断在arry[x][y]上是否能放numpublic boolean istrue(int arry[][],int x,int y,int num){//横竖是否有numfor(int i=0;i<9;i++){if(arry[x][i]==num||arry[i][y]==num)return false;}for(int i=(x/3)*3;i<(x/3+1)*3;i++)for(int j=(y/3)*3;j<(y/3+1)*3;j++)if(arry[i][j]==num)return false;return true;}//根据前⾯放的数获得⼀个正确的答案,dfs获取public void dfs(int arry[][],int n){if(n<81){if(flag==true) return;int x=n/9;//x第N个数的横坐标int y=n%9;//y第N个数的纵坐标if(arry[x][y]==0){//若第N个数为0,没有被填过,则判断0~9是否能被填for(int i=1;i<10;i++){if(istrue(arry,x,y,i)){//第N个数可以填i,填⼊然后dfsarry[x][y]=i;dfs(arry,n+1);//dfs回溯arry[x][y]=0;}}}else{dfs(arry,n+1);}}else{//获得第⼀个结果,flag置trueflag=true;//将获得的数组放⼊shudu中然后再挖空//if(all==false){for(int i=0;i<9;i++)for(int j=0;j<9;j++)shudu[i][j]=answer[i][j]=arry[i][j];System.out.println("###################");for(int i=0;i<9;i++){for(int j=0;j<9;j++)System.out.print(arry[i][j]);System.out.println();}}}//为了避免数独⽆解,保证数独有唯⼀解//挖空数组,分难易程度,,grade为挖空个数//是否有⼀个⾏、列、九宫格已经为空boolean emptyrow=false,emptycol=false,emptyplaces=false;public void diger(int grade,int level){this.shudu=new int[9][9];this.game=new int[9][9];this.answer=new int[9][9];this.row=new int[9];this.col=new int[9];this.places=new int[9];this.grade=grade;File file=new File(filename);BufferedReader reader = null;try {System.out.println("以⾏为单位读取⽂件内容,⼀次读⼀整⾏:");reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8")); // reader = new BufferedReader(new FileReader(file));String tempString = null;int line = 1,k=0;boolean flag=false;// ⼀次读⼊⼀⾏,直到读⼊null为⽂件结束while ((tempString = reader.readLine()) != null&&k<9) {// 显⽰⾏号System.out.println(" line " + line + ": " + tempString);if(tempString.equals(level+"")){flag=true;continue;}if(flag==true){for(int i=0;i<9;i++)answer[k][i]=tempString.charAt(i)-48;k++;}line++;}reader.close();} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e1) {}}}for(int i=0;i<9;i++)for(int j=0;j<9;j++)shudu[i][j]=answer[i][j];int t=grade;while(t>0){//随机抽到x,yint x=new Random().nextInt(9);int y=new Random().nextInt(9);//若x,y没有被挖空则挖空x,yif(shudu[x][y]!=0){row[x]--;col[y]--;places[(y/3)*3+x/3]--;if((row[x]==0&&emptyrow)||(col[y]==0&&emptycol)||(places[(y/3)*3+x/3]==0&&emptyplaces)) {System.out.println(x+" "+y+" 不可以");continue;}else{shudu[x][y]=0;t=t-1;}if(row[x]==0)emptyrow=true;if(col[y]==0)emptycol=true;if(places[(y/3)*3+x/3]==0)emptyplaces=true;}}//获得最终游戏数独for(int i=0;i<9;i++)for(int j=0;j<9;j++)game[i][j]=shudu[i][j];}//获得最终游戏数独public int[][] getArr(){for(int i=0;i<9;i++){for(int j=0;j<9;j++){System.out.print(game[i][j]);if(game[i][j]==0)t++;}System.out.println();}System.out.println("###################");System.out.println("挖空数为:"+t);return this.game;}//获得答案数独public int[][] getAnswer(){for(int i=0;i<9;i++){for(int j=0;j<9;j++)System.out.print(answer[i][j]);System.out.println();}System.out.println("###################");return this.answer;}}2、Play类package shudu;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.GridLayout;import java.awt.SystemColor;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.FocusEvent;import java.awt.event.FocusListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.util.ArrayList;import java.util.List;import java.util.Timer;import java.util.TimerTask;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;import javax.swing.border.Border;import erDao;import shudu.Main;import er;//游戏界⾯的设计public class Play {//设置全局变量,九宫格JTextField[][] numberFields=new JTextField[9][9]; //游戏数独数组int[][] gamearr=new int[9][9];//游戏答案数组int[][] answerarr=new int[9][9];Color green=new Color(93, 200, 138);Color lightGray = new Color(217, 217, 217);Color blue = new Color(102, 183, 255);//挖空数!private int grade=40;//过去的private int usedgrade=0;//计时器Timer time;JLabel timeLabel;TimerTask task;//⽤标签表⽰游戏进展JLabel labelsc=new JLabel();//创建字体,之后所有的字体为该字体Font f=new Font("⽅正仿宋简体", Font.BOLD, 25);//选择九宫格中的格⼦的坐标int sx=10;int sy=10;//是否已经看过答案private boolean isanswer;//⽤户名JLabel username=new JLabel();JLabel usergrade=new JLabel();private int gamegrade=0;//游戏分数//登录login loger=new login();User user=er;//读取⽂件名private String filename=new String("C:\\Users\\liaolilan\\Desktop\\SuDoKu.txt");//以前游戏数组private int[][] usedgame=new int[9][9];//以前的游戏时间private int usedtim=1;//判断是不是新⽤户//是否为新⽤户private boolean isnew=true;//保存⽤户名存在在第⼏⾏private int act=-1;//关卡JLabel levels=new JLabel();int levs=1;//窗⼝private JFrame jf ;public Play(){//制作游戏界⾯System.out.println(user.getUsername()+" "+user.getUserpwd()+" "+user.getUsergrade());jf = new JFrame();jf.setTitle("数独游戏");jf.setBounds(400, 0, 1100, 1000);jf.setResizable(false);//不允许窗⼝最⼤化jf.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//不执⾏任何操作;要求程序在已注册的 WindowListener 对象的 windowClosing ⽅法中处理该操作 jf.setLocationRelativeTo(null);//居中,不⽤定位窗⼝⼤⼩jf.setVisible(true);//打开时,判断是否上⼀局游戏jf.addWindowListener(new WindowAdapter() {@Overridepublic void windowOpened(WindowEvent arg0) {//如果是新⽤户,保存数组//保存记录,读取⽂件,读出⽂件,在开始游戏的时候读出File file=new File(filename);BufferedReader reader = null;try {System.out.println("以⾏为单位读取⽂件内容,⼀次读⼀整⾏:");reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8"));// reader = new BufferedReader(new FileReader(file));String tempString = null;int line = 1;// ⼀次读⼊⼀⾏,直到读⼊null为⽂件结束while ((tempString = reader.readLine()) != null) {// 显⽰⾏号if(tempString.equals(user.getUsername())){act=line;isnew=false;}else if(isnew==false){//关卡levs=Integer.valueOf(tempString);System.out.println(levs);break;}line++;}reader.close();} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e1) {}}}newGame(grade,levs);}});//关闭时,保存关卡记录jf.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent arg0) {BufferedReader reader = null;//保存记录,读取⽂件,读出⽂件,在开始游戏的时候读出File file=new File(filename);int num=0;//第⼏⾏boolean flag=false;System.out.println("act:"+act);List list = new ArrayList();try{reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8"));// reader = new BufferedReader(new FileReader(file));String str = null;// ⼀次读⼊⼀⾏,直到读⼊null为⽂件结束while ((str = reader.readLine())!= null) {++num;System.out.println(num+"⾏:"+str);if(isnew==false&&(num==act||num==act+1)){System.out.println(str);continue;}list.add(str);}}catch(IOException e){e.printStackTrace();}System.out.println("list size:"+list.size());System.out.println("删除成功");//重新写⼊try{FileWriter fileWritter = new FileWriter(filename);BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), "utf-8")); //BufferedWriter bw= new BufferedWriter(fileWritter);for( int i=0;i<list.size();i++ ){System.out.println("list["+i+"]"+list.get(i));bw.write(list.get(i).toString());bw.newLine();}String data = user.getUsername();//⽤户名,保存⽤户所通过的关卡?bw.write(data+"\r\n");//关卡bw.write(levs+"\r\n");System.out.println("Done");bw.flush();bw.close();}catch(IOException e){e.printStackTrace();}System.exit(0);}});JPanel bodyPanel=new JPanel();bodyPanel.setBackground(lightGray);jf.add(bodyPanel,BorderLayout.CENTER);bodyPanel.setLayout(new GridLayout(9,9,0,0));//右边布局,难易程度,计时,重新开始,换⼀题等选择按钮 JPanel rightPanel=new JPanel();//宽度⼤⼩设置rightPanel.setPreferredSize(new Dimension(200, 789));jf.add(rightPanel, BorderLayout.EAST);//显⽰⽤户名和当前分数username.setText("⽤户名: "+user.getUsername());username.setFont(f);rightPanel.add(username);usergrade.setText("总分数: "+user.getUsergrade());usergrade.setFont(f);rightPanel.add(usergrade);//显⽰当前关卡levels.setText("关卡: "+levs);levels.setFont(f);rightPanel.add(levels);//难度选择,默认为容易JLabel label1=new JLabel("请选择模式");label1.setFont(f);rightPanel.add(label1);//容易,中等,难String[] btnstr={"容易","中等","难"};for(int i=0;i<3;i++){JButton btn=new JButton(btnstr[i]);btn.setFont(f);btn.setBackground(lightGray);btn.setPreferredSize(new Dimension(120,60));//为难度按钮加上监听器btn.addActionListener(new funactionListener());rightPanel.add(btn);//加监听器}//功能按钮JLabel label2=new JLabel("功能按钮 ");label2.setFont(f);rightPanel.add(label2);//换⼀题JButton changebtn=new JButton("换⼀题");changebtn.setFont(f);changebtn.setPreferredSize(new Dimension(120,60));changebtn.setBackground(lightGray);changebtn.setForeground(Color.black);changebtn.addActionListener(new funactionListener());rightPanel.add(changebtn);//重做JButton newbtn=new JButton("重玩");newbtn.setFont(f);newbtn.setPreferredSize(new Dimension(120,60));newbtn.setBackground(lightGray);newbtn.setForeground(Color.BLACK);newbtn.addActionListener(new funactionListener());rightPanel.add(newbtn);//答案JButton answerbtn=new JButton("答案");answerbtn.setFont(f);answerbtn.setPreferredSize(new Dimension(120,60));answerbtn.setBackground(Color.red);answerbtn.setForeground(Color.WHITE);answerbtn.addActionListener(new funactionListener());rightPanel.add(answerbtn);//计时JLabel label3=new JLabel(" 计时 ");label3.setFont(f);rightPanel.add(label3);timeLabel=new JLabel("00:00");timeLabel.setFont(f);//放⼀个游戏进展rightPanel.add(labelsc);labelsc.setVisible(false);//下⾯布局JPanel lastPanel=new JPanel();jf.add(lastPanel,BorderLayout.SOUTH);lastPanel.setPreferredSize(new Dimension(1333, 100));lastPanel.setLayout(new GridLayout(0, 10, 0, 0));//放选择按钮JButton[] setNum=new JButton[10];for(int i=0;i<10;i++){if(i==9){setNum[i]=new JButton("清除");//加清除的监听器}else{setNum[i]=new JButton(i+1+"");//加按钮的监听器}setNum[i].setFont(f);setNum[i].setForeground(Color.WHITE);setNum[i].setBackground(green);setNum[i].setPreferredSize(new Dimension(90,70));setNum[i].setFocusPainted(false);//加下⽅按钮监听器setNum[i].addActionListener(new buttonaction());lastPanel.add(setNum[i]);}//对中间布局进⾏控制//组件边框Border centernBorder = BorderFactory.createMatteBorder(1, 1, 1, 1, Color.GRAY);Border rightAndBottomBorder = BorderFactory.createMatteBorder(1, 1, 4, 4, Color.GRAY); Border bottomBorder = BorderFactory.createMatteBorder(1, 1, 4, 1, Color.GRAY);Border rightBorder = BorderFactory.createMatteBorder(1, 1, 1, 4, Color.GRAY);//循环设置组件JTextField,九宫格//numberFields = new JTextField[9][9];for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {//System.out.println(i+j+"");numberFields[i][j] = new JTextField();//不可编辑numberFields[i][j].setEditable(false);numberFields[i][j].setFont(new Font("微软雅⿊", Font.BOLD, 35));numberFields[i][j].setHorizontalAlignment(JTextField.CENTER);numberFields[i][j].setBackground(Color.WHITE);numberFields[i][j].setForeground(Color.BLACK);//加边框!if (i == 2 && j == 2 || i == 2 && j == 5 || i == 5 && j == 2 || i == 5 && j == 5) {numberFields[i][j].setBorder(rightAndBottomBorder);} else if (j == 2 || j == 5) {numberFields[i][j].setBorder(rightBorder);} else if (i == 2 || i == 5) {numberFields[i][j].setBorder(bottomBorder);} else {numberFields[i][j].setBorder(centernBorder);}//对每个格⼦加上名称来标识numberFields[i][j].setName(Integer.toString(i) + Integer.toString(j));//对每个格⼦加上监听器numberFields[i][j].addFocusListener(new textfocusaction());;bodyPanel.add(numberFields[i][j]);}}}//开始新游戏public void newGame(int grade,int level){isanswer=false;//显⽰总分数usergrade.setText("总分数: "+user.getUsergrade());//显⽰当前关卡levels.setText("关卡:"+levs+"");Main maker=new Main();maker.diger(grade, level);gamearr=maker.getArr();answerarr=maker.getAnswer();for(int i=0;i<9;i++){for(int j=0;j<9;j++)System.out.println();}System.out.println("###################");//先清空九宫格for(int i=0;i<9;i++)for(int j=0;j<9;j++){if(gamearr[i][j]!=0){numberFields[i][j].setText(gamearr[i][j]+"");numberFields[i][j].setBackground(lightGray);numberFields[i][j].setForeground(Color.BLACK);//加监听器!}else{numberFields[i][j].setText("");numberFields[i][j].setBackground(Color.WHITE);numberFields[i][j].setForeground(Color.BLACK);}}//开始计时startTime();}//游戏开始计时public void startTime(){//游戏开始计时!time = new Timer();task = new TimerTask() {int count = usedtim;@Overridepublic void run() {timeLabel.setText(gettime(count));count++;}};time.schedule(task, 1000L, 1000L); // 开始游戏时⾃动计时 }//时间重新计时public void restartTime(){//删除time记录,要使⽤过才能删除time.cancel();time=new Timer();timeLabel.setText("00:00");task = new TimerTask() {int count = 1;@Overridepublic void run() {timeLabel.setText(gettime(count));count++;}};time.schedule(task, 1000L, 1000L);}//将时间转换成分:秒public String gettime(int count){String second = null;String minute = null;if (count / 60 < 10) {minute = "0" + (count / 60);} else {minute = "" + (count / 60);}if (count % 60 < 10) {second = ":0" + count % 60;} else {second = ":" + count % 60;}return minute + second;}//重玩该关public void again(){//重新设置for(int i=0;i<9;i++)for(int j=0;j<9;j++){if(gamearr[i][j]!=0){numberFields[i][j].setBackground(lightGray);//加监听器!}}}//输出答案!!public void answer(){//gamearr中为0的地⽅放答案!!for(int i=0;i<9;i++)for(int j=0;j<9;j++){if(gamearr[i][j]==0){numberFields[i][j].setText(answerarr[i][j]+"");numberFields[i][j].setForeground(Color.RED);}}}//清空九宫格重新对获取新数独public void resetfields(){for(int i=0;i<9;i++)for(int j=0;j<9;j++){numberFields[i][j].setText("");numberFields[i][j].setBackground(Color.WHITE);}}//下⾯为各事件的处理//右边处理数独按钮监听器(难度类别监听,换⼀题,重玩,答案) class funactionListener implements ActionListener{//难度监听器String btnstr;@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubbtnstr=e.getActionCommand();if(btnstr.equals("容易")){grade=40;//若选择按钮难度为容易,重新开始游戏resetfields();newGame(grade,levs);restartTime();}else if(btnstr.equals("中等")){grade=45;//若选择按钮难度为中等,重新开始游戏resetfields();newGame(grade,levs);restartTime();}else if(btnstr.equals("难")){//同上grade=50;resetfields();newGame(grade,levs);restartTime();}else if(btnstr.equals("换⼀题")){resetfields();newGame(grade,levs);restartTime();}//重新开始计分else if(btnstr.equals("重玩")){resetfields();again();restartTime();}//将分归零else if(btnstr.equals("答案")){answer();time.cancel();isanswer=true;}}}//九宫格数组的监听器class textfocusaction implements FocusListener{//该各⾃获得焦点@Overridepublic void focusGained(FocusEvent e) {// TODO Auto-generated method stubJTextField jt=(JTextField) e.getSource();//点击之前还原颜⾊replace();sameNumber(jt);}//该格⼦失去焦点,将颜⾊还原@Overridepublic void focusLost(FocusEvent e) {// TODO Auto-generated method stublabelsc.setVisible(false);replace();}}//处理获得焦点的⽂本格⼦public void sameNumber(JTextField jt){String name=jt.getName();System.out.println(name);int x=Integer.parseInt(name.substring(0,1));int y=Integer.parseInt(name.substring(1));String number=jt.getText();//System.out.println(x+" "+y);if(gamearr[x][y]!=0){sx=10;sy=10;}else{sx=x;sy=y;System.out.println(sx+" "+sy);//格⼦为空if(number.equals("")){//使该⾏该列和该⼩九宫格的颜⾊置blue,提醒⽤户for(int i=0;i<9;i++){numberFields[i][sy].setBackground(blue);numberFields[sx][i].setBackground(blue);}for(int i=(sx/3)*3;i<((sx/3)+1)*3;i++)for(int j=(sy/3)*3;j<((sy/3)+1)*3;j++)numberFields[i][j].setBackground(blue);numberFields[sx][sy].setBackground(green);}//格⼦不为空,使与格⼦相同的数显⽰粉⾊else{for(int i=0;i<9;i++)for(int j=0;j<9;j++)if(numberFields[i][j].getText().equals(number))numberFields[i][j].setBackground(Color.pink);}}}//使格⼦颜⾊还原public void replace(){if(sx<10&&sy<10){for(int i=0;i<9;i++){if(gamearr[i][sy]!=0)numberFields[i][sy].setBackground(lightGray);elsenumberFields[i][sy].setBackground(Color.WHITE);if(gamearr[sx][i]!=0)numberFields[sx][i].setBackground(lightGray);elsenumberFields[sx][i].setBackground(Color.WHITE);}for(int i=(sx/3)*3;i<((sx/3)+1)*3;i++)for(int j=(sy/3)*3;j<((sy/3)+1)*3;j++)if(gamearr[i][j]!=0)numberFields[i][j].setBackground(lightGray);elsenumberFields[i][j].setBackground(Color.WHITE);for(int i=0;i<9;i++)for(int j=0;j<9;j++)if(numberFields[i][j].getText().equals(numberFields[sx][sy].getText())&&!(i==sx&&j==sy)){ if(gamearr[i][j]!=0)numberFields[i][j].setBackground(lightGray);elsenumberFields[i][j].setBackground(Color.WHITE);}}}//为下⽅的按钮增加监听器class buttonaction implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubString btnstr;btnstr=e.getActionCommand();replace();//如果按钮为清除,则将格⼦置空if(btnstr.equals("清除")&&(sx<10&&sy<10)){numberFields[sx][sy].setText("");numberFields[sx][sy].setBackground(Color.white);}//若为其他的,在格⼦中放⼊值else if(sx<10&&sy<10){numberFields[sx][sy].setText(btnstr);numberFields[sx][sy].setForeground(Color.blue);numberFields[sx][sy].setBackground(Color.white);//判断值放的是否正确,若不正确,则将该值和相冲突的格⼦背景颜⾊置为红⾊ jugewrong(btnstr);}}}//判断值放的是否正确,若不正确,则将该值和相冲突的格⼦背景颜⾊置为红⾊ public void jugewrong(String number){boolean flag=false; //该值是否正确//⾏列是否有相同的for(int i=0;i<9;i++){if(i!=sy&&(numberFields[sx][i].getText().equals(number))){numberFields[sx][i].setBackground(Color.red);flag=true;}if(i!=sx&&(numberFields[i][sy].getText().equals(number))){numberFields[i][sy].setBackground(Color.red);flag=true;}}//⼩九宫格内是否有已经存在过这个值for(int i=(sx/3)*3;i<((sx/3)+1)*3;i++)for(int j=(sy/3)*3;j<((sy/3)+1)*3;j++){if(!(i==sx&&j==sy)&&(numberFields[i][j].getText().equals(number))){numberFields[i][j].setBackground(Color.red);flag=true;}}if(flag){labelsc.setText("已有该数字,请检查!");labelsc.setFont(new Font("⽅正仿宋简体", Font.BOLD, 21));labelsc.setForeground(Color.RED);labelsc.setVisible(true);}else{//挑战成功后if(isanswer==false&&gamesc()){//关卡加⼀levs++;time.cancel();String runtime=new String();runtime=timeLabel.getText();System.out.println(runtime);//转换成秒int tim=((runtime.charAt(0)-48)*10+(runtime.charAt(1))-48)*60+(runtime.charAt(3)-48)*10+runtime.charAt(4)-48;//计分规则System.out.println(tim);if(grade==40){if(tim<=180)gamegrade=80;else if(tim<=600)gamegrade=70;else if(tim<=1800)gamegrade=60;elsegamegrade=50;}else if(grade==45){if(tim<=180)gamegrade=90;else if(tim<=600)gamegrade=85;else if(tim<=1800)gamegrade=75;elsegamegrade=65;}else{if(tim<=180)gamegrade=100;else if(tim<=600)gamegrade=90;else if(tim<=1800)gamegrade=85;elsegamegrade=80;}user.setUsergrade(user.getUsergrade()+gamegrade);System.out.println(user.getUsergrade());UserDao dao=new UserDao();dao.modifyuser(user);//弹出⼀个成功的对话框!Object[] options = { "查看排名", "继续挑战"};//查看排名是0,继续挑战是1int x = JOptionPane.showOptionDialog(null, "挑战成功!分数为"+gamegrade, "挑战成功!",JOptionPane.DEFAULT_OPTION, RMATION_MESSAGE, null, options, options[0]);System.out.println(x);if(x==0){rank ranker;ranker=new rank();//newGame(grade);}else{newGame(grade,levs);}}}}//判断点完之后数独是否成功!public boolean gamesc(){for(int i=0;i<9;i++)for(int j=0;j<9;j++){System.out.println(numberFields[i][j].getText());System.out.println("点击!");if(numberFields[i][j].getText().equals("")){// System.out.println("111失败!");return false;}for(int k=0;k<9;k++)if((k!=j&&numberFields[i][k].getText().equals(numberFields[i][j].getText()))||(k!=i&&numberFields[k][j].getText().equals(numberFields[i][j].getText()))){ numberFields[i][j].setBackground(Color.RED);numberFields[i][k].setBackground(Color.red);return false;}for(int m=(i/3)*3;m<(i/3+1)*3;m++)for(int n=(j/3)*3;n<(j/3+1)*3;n++)if(!(m==i&&n==j)&&(numberFields[m][n].getText().equals(numberFields[i][j].getText()))){return false;}}System.out.println("成功!");return true;}}最后⽣成数独页⾯的效果如下:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

java数独小游戏课程设计

java数独小游戏课程设计

java数独小游戏课程设计一、课程目标知识目标:1. 学生能理解数独游戏的规则和基本概念;2. 学生掌握运用Java语言实现数独小游戏的基本算法;3. 学生了解数独问题求解过程中涉及的逻辑推理和问题分析方法。

技能目标:1. 学生能够运用所学知识,编写Java程序完成数独小游戏的开发;2. 学生通过数独游戏实践,培养逻辑思维和问题解决能力;3. 学生学会使用调试工具,优化程序性能,提高代码质量。

情感态度价值观目标:1. 学生培养对编程的兴趣和热情,激发学习Java语言的积极性;2. 学生通过团队合作完成项目,提升团队协作能力和沟通能力;3. 学生在解决问题的过程中,培养面对困难勇于挑战的精神和坚持不懈的品质。

分析课程性质、学生特点和教学要求:1. 课程性质:本课程为Java语言编程实践课程,通过数独小游戏的设计与实现,让学生将理论知识与实际应用相结合。

2. 学生特点:学生已经具备一定的Java基础,了解基本语法和编程规范,但对复杂算法和实际项目开发尚缺乏经验。

3. 教学要求:注重培养学生的编程实践能力,鼓励学生独立思考和团队协作,提高解决实际问题的能力。

二、教学内容1. 数独游戏基本概念与规则介绍- 数独游戏的历史背景- 数独游戏的规则说明- 数独解题策略概述2. Java编程基础回顾- Java基本数据类型- Java控制结构(循环、分支)- Java数组的使用3. 数独小游戏算法设计- 数独游戏棋盘的表示方法- 数独游戏生成算法- 数独游戏解题算法4. Java数独小游戏编程实践- 开发环境配置与使用- 数独游戏棋盘类设计- 数独游戏控制类设计- 数独游戏用户界面设计5. 程序调试与优化- 代码调试技巧- 性能优化策略- 代码规范与重构6. 项目展示与评价- 团队合作成果展示- 项目评价标准与反馈- 学生互评与教师评价教学内容安排与进度:第一课时:数独游戏基本概念与规则介绍,Java编程基础回顾第二课时:数独小游戏算法设计,数独游戏棋盘类设计第三课时:数独游戏控制类设计,数独游戏用户界面设计第四课时:程序调试与优化,项目展示与评价教学内容与教材关联性:本教学内容与教材中Java语言编程、数组、控制结构等章节密切相关,通过数独小游戏项目实践,让学生巩固所学知识,并提高实际应用能力。

java实现9宫格及九宫格求解的程序

java实现9宫格及九宫格求解的程序
ll:packed array[0..9,0..9,-1..11] of longint; //存储每个空格可能出现的数字 提高程序效率
function max(a,b:longint):longint;
begin
if b>a then exit(b)
else exit(a);
end;
function choose2(x:longint):longint;
{int i,j;
for(i=0;i<9;i++)
{for(j=0;j<9;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
void ini_logo(int logo[10][9][9],int arr[9][9]) /*初始化标志数组*/
{int i,j,k,p,r,s,t;
{
for(int l=0; l<3; l++)
{
int sum2=0;
int sum1=0;
for(int k1=0; k1<3; k1++)
{
sum1+=g[3*m+k1][3*n+l];
}
sum2+=sum1;
if(sum2!=45)
{
i=-1;
System.out.println("此次产生的数组有错!");
if(bol[i][randomNum])//判断产生的随机数不是0
continue; //跳出这次的循环进行下次循环
g[i][k]=randomNum;

数独实验报告范文

数独实验报告范文

数独实验报告范文实验报告:数独问题的求解1. 引言数独问题是一种经典的逻辑智力游戏,也是一种常见的求解问题。

本实验旨在实现一个数独求解器,通过编程算法来解决数独问题。

2. 实验设计我们使用Python语言来编写数独求解器。

主要的算法设计如下:(1)回溯法回溯法是一种可行性搜索法,通过逐步试探和搜索,在每一步选择一个未被占用的位置,并将一个符合条件的数值填入该位置,然后继续向下搜索。

如果出现冲突(当前位置填入的数值与已有数字冲突),则返回上一步,选择其他的数字。

通过递归的方式实现回溯法。

(2)剪枝在求解过程中,我们可以通过一些限制条件进行剪枝,减少无效的搜索。

例如,每一行、每一列和每个3x3的子九宫格中,数字不能重复。

3. 实验过程首先,我们通过一个二维数组来表示数独的初始状态。

其中,已经填入的数字用具体的数字表示,未填入的位置用0表示。

然后,我们使用回溯法来求解数独问题。

具体过程如下:(1)在未填入数字的位置选择一个未被占用的位置。

(2)将一个符合条件的数字填入该位置。

(3)判断是否满足数独的规则:每一行、每一列和每个3x3的子九宫格中,数字不能重复。

(4)如果满足规则,则继续向下搜索;否则,返回上一步,选择其他的数字。

(5)如果所有的位置都被填满,则说明数独问题已经解决。

(6)继续搜索下一个未被占用的位置。

4. 实验结果通过我们实现的数独求解器,可以成功地求解各种难度的数独问题。

只要数独问题有解,我们的求解器就能够找到其中一种解法。

实验结果表明,我们的算法设计是正确且有效的。

5. 实验总结本实验实现了一个数独求解器,通过回溯法和剪枝算法来解决数独问题。

实验结果表明,我们的求解器能够成功求解各种难度的数独问题,并且能够在较短的时间内得到结果。

通过本次实验,我们深入理解了回溯法的原理和应用,也提高了编程技巧和问题解决能力。

6. 参考文献无相关参考文献。

数独实验报告

数独实验报告

数独实验报告数独实验报告引言:数独是一种经典的逻辑推理游戏,通过填写数字来完成一个9x9的方格。

它不仅能够增强我们的逻辑思维能力,还能够培养我们的耐心和专注力。

在本次实验中,我们将探索数独的解题方法,并分析其中的数学原理。

一、数独的规则及解题方法数独的规则非常简单,每个9x9的方格被划分为9个3x3的小方格,每个小方格内都需要填入1-9的数字,使得每一行、每一列和每个小方格内的数字都不重复。

解题方法有很多种,其中最基本的是“唯一候选数法”。

这种方法通过观察每个格子中可能的数字,找出唯一的候选数来填入。

另外,还有“唯余数法”、“交叉排除法”等高级解题技巧,它们通过不断推理和排除可能性来逐步确定每个格子的数字。

二、实验过程及结果我们选择了一道难度较高的数独题目作为实验对象,通过手动填写和使用计算机程序求解两种方式进行对比。

首先,我们手动填写数独。

开始时,我们使用唯一候选数法填写了一部分数字,但随着难度的增加,我们不得不尝试更高级的解题技巧。

通过使用唯余数法和交叉排除法,我们逐渐填满了整个数独方格。

整个过程中,我们需要不断思考和试错,但最终成功解出了数独。

接下来,我们使用计算机程序求解数独。

我们编写了一个基于回溯算法的程序,通过递归地尝试每个可能的数字,并根据数独规则进行剪枝,最终找到了数独的解。

与手动填写相比,计算机程序的求解速度更快,几乎可以瞬间得到结果。

三、数学原理分析数独的解题方法背后蕴含着一些数学原理。

首先是唯一候选数法,它利用了每个格子中可能的数字唯一这一事实,通过观察和推理找出唯一的候选数。

这涉及到了集合论和排列组合的知识。

其次是唯余数法,它通过观察每一行、每一列和每个小方格的可能数字,找出在某个格子中唯一的数字。

这利用了数独规则中每行、每列和每个小方格内数字不重复的特点,涉及到了概率论和逻辑推理的知识。

最后是交叉排除法,它通过观察某个格子的候选数和与之相关的格子的候选数,排除掉不可能的数字。

数独游戏设计与源码

数独游戏设计与源码

数据结构大型作业实验报告书设计题目:“数独”游戏设计与求解一.题目说明数独的游戏规则:1、在9×9的大九宫格内,已给定若干数字,其他宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字。

2、必须满足的条件:每一行与每一列都有1到9的数字,每个小九宫格里也有1到9的数字,并且一个数字在每行、每列及每个小九宫格里只能出现一次,既不能重复也不能少。

3、每个数独游戏都可根据给定的数字为线索,推算解答出来。

按照数独的游戏规则,用计算机实现已知数独的求解和数独题目的出题。

二.数据结构说明数据结构一维数组、二维数组以及类似于“栈”的数据结构。

主要操作有:进栈,出栈,栈顶元素的操作等等三.抽象数据类型(Abstract Data Type 简称ADT) 五个全局变量数组,其中两个二维数组,三个一维数组。

int a[10][10]接受输入数据,空白处则初始化为0。

之所以把数组范围设计为10*10,是为了程序的可读性。

符合人的习惯思维。

int sd[82]在实现“回溯”算法的时候,因为要用到栈的数据结构,所以把a[10][10]二维数组中的数据转换储存进sd[82]一维数组。

方便处理题目以及保存最后结果。

int fix[82]对应于sd[82],记录哪些位置已经确定。

确定则fix值为1,未确定为0。

int possible[82][10]第一维对应着sd[82]中的每一个,第二维的下标为每个位置的可能值。

有可能则为第二维的下标,不可能则为-1。

int stack[82]类似于“栈”数据结构的数组,实现“回溯”算法的关键所在。

回溯之前,把所有fix 值为0的数据存如stack 数组中,即进栈。

回溯中逐渐确定这些位置的数值,无法确定者(即1--9都不适合的)则应回退到前一位置,修改其fix 值,以此类推。

直至stack 中所有的值都确定下来(即题目完成),或者回退到了最初点的前一位置(说明题目有误)。

四.算法设计程序可以考虑人工智能的算法。

JAVA数独

JAVA数独

5
数独题目的变换
经过以上5个步骤可以发现:只需要提供4个位置的 数字就可以得出一个唯一解的数独谜题。另外通过以下 形式的变换方式,仍然可以得出唯一解的数独谜题。 行列变换:将同一四宫格内的行列变换,例如,将 第1,2列互掉;第3,4列互掉;第1,2行互掉;第3,4列互 掉。 数字替换:例如数字1换4;数字2换3。 标准的3×3个九宫格的数独谜题的推出原理与此相 同,但过程复杂,在此不再赘述。
推导数独题目的方法如下:
任意选取一个方格,并将此空格内的数字挖掉。例如将(3,3)
1
位置的数字4挖掉,如图3-2所示。
2
观察B区得四宫格可以发现,不管(2,2)位置的数字4是否存在, 为确定(4,1)位置挖掉的数字4,(3,1)位置的数字2必须存在, 如图3-3所示。
推导数独题目的方法如下:
3
观察A区得四宫格,由于(3,1)位置的数字2已存在,为了要找到 (1,2)位置的数字2,则(2,2)位置的数字4必须存在,如图3-4 所示。
利用回溯法求解数独
回溯法相对于其他穷举的特点在于,不必把问题的每一层的 所有可能解都遍历一遍,只要当前的可能解不满足约束条件就抛弃 该解,寻求下一个可能解,而不必求解其余的下层解。当当前层得 所有可能解都不满足约束条件,则回溯到上一层,抛弃上一层的当 前可能解。 从以上分析中结合数独问题的规则,得出数独问题的约束条件为: 每一格的数值范围仅限1-9 每一格内的数字在当前行不允许重复 每一格内的数字在当前列不允许重复 每一格内的数字在当前小宫格内不允许重复 由此,回溯法通过约束条件的筛选,在所有解中除掉不可能 的解,从而获得问题的一个或者全部解。具体实现方法和代码会在 后面章节详细说明。
• • • • •
游戏的类结构

数独游戏的设计与实现

数独游戏的设计与实现

数独游戏的设计与实现数独游戏的规则:1.游戏会从⼀个部分带有数字的九宫格开始。

在9×9的⼤九宫格(即3格宽×3格⾼)⽅阵⾥,每⼀格⼜细分为⼀个⼩九宫格。

2.游戏开始,已给定若⼲数字,其它宫位留⽩,玩家需要⾃⼰按照逻辑推敲出剩下的空格⾥是什么数字。

3.填数字时必须满⾜以下条件:在空⽩的⼩格⼦⾥填上1~9中的数字,使得每个数字在“九宫格”的每⾏、每列、每个⼩九宫格中均只出现⼀次。

数独游戏的分析与实现: 1.游戏中的每个格⼦可能的数字有1-9。

2. 游戏开始显⽰的数字,通过⼀份完整的数独,将部分格⼦设为空⽩,得到游戏初始值。

3.游戏中的每个空⽩格⼦可以填写的数字是:同⼀⾏未出现的数字,同⼀列未出现的数字,同⼀个3x3的九宫格中未出现的数字三部分的交集。

4.游戏中的每个格⼦的三种状态:答案数字(即正确的数字),初始化数字(即游戏开始是数字,显⽰有数字或者空⽩),当前数字(即玩家填写前,后的数字)。

5.游戏完成的条件是满⾜规则中说明的情况。

游戏设计:1.绘制游戏界⾯。

【activity_main.xml】2.绘制游戏框架,⼤九宫格和⼩九宫格。

【Kuangjia.java中】(1)⽤屏幕的宽width和⾼height分别除于9即可得到九宫格中每个单元格的宽度和⾼度。

(2)⽤ onDraw⽅法⽣成⽤于绘制背景⾊的画笔并设置画笔的颜⾊和设置横向、纵向的单元格线的颜⾊、背景⾊并绘制横向单元格线和纵向单元格线。

(3)在values⽂件夹中新建color的XML⽂件并设置好四种颜⾊,以后的颜⾊设置就可以直接调⽤这⾥的颜⾊。

【color.xml】3.游戏格⼦中数字绘制,且字体在格⼦中居中显⽰。

【Kuangjia.java中】(1)⽤paint中的⽅法绘制数字,设置数字的颜⾊为⿊⾊并把数字设置居中显⽰。

(2)⽤FontMetrics fm = paint.getFontMetrics();即FontMetrics⽅法真正实现⽂字在矩形框当中居中显⽰。

数独游戏的设计与开发毕业设计

数独游戏的设计与开发毕业设计

摘要本文介绍了利用C++语言编写数独游戏的方法。

游戏的开发设计使用了vs2010作为开发工具,根据数独游戏特有的规则特点对游戏进行设计。

并且游戏在开发的过程中使用了微软的MFC开源框架,在数独游戏的界面上做了一定的处理。

本文首先对游戏进行了简单的介绍,对游戏的计算机实现进行分析。

最后通过部分游戏截图和数据表格来介绍了游戏的开发设计过程和游戏的基本操作。

并根据软件工程的方法,从需求分析、概要设计、详细设计、编码实现等方面阐述了游戏的开发流程,并通过游戏界面的截图、数据表格等体现了我的设计思路。

关键字:数独 C++ MFC 毕业设计T AbstractThis paper describes the use of C + + method number written language alone game. Game development and design using vs2010 as a development tool, according to the Sudoku rules specific to the characteristics of the game design. And the game uses Microsoft's MFC source framework development process, in Sudoku interface to do some processing. This paper first gives a brief introduction to the game, the game's computer-implemented analysis. Finally, some games screenshots and data tables to introduce the basic operation of the game development and game design process. And in accordance with the method of software engineering, from requirements analysis, aspects of the outline design, detailed design, coding realization expounded the game development process, and through screenshots game interface, data tables, etc. embodies my design ideas.Keywords: Sudoku C++ MFC graduation目录1 引言 (1)1.1 简介 (1)1.2 数独的起源 (1)1.3 数独的发展 (1)2 开发环境及开发工具 (2)2.1 C++语言简介 (2)2.2 MFC语言简介 (2)3.系统的需求分析 (2)3.1现行系统概况描述...............................................,23.2需求分析 (2)4.系统开发可行性分析 (2)5.系统分析 (2)6.系统设计 (3)6.1设计思路 (3)6.2系统主要类设计 (3)6.2.1 GamePad类 (3)6.2.2 SudokuDlg类 (4)6.2.3 Sudokugame类 (5)7.系统主要技术特色 (11)8.结论 (11)9.参考文献 (12)10.致谢 (12)1.引言1.1简介数独游戏是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数学智力拼图游戏。

数据结构课程设计之九宫格实验报告

数据结构课程设计之九宫格实验报告

九宫问题一、简介1.设计目的:通过实践掌握用广度优先搜索解决问题的方法2.问题的描述:在一个3*3的九宫中,有1—8这8个数,及一个空格随机的摆放在其中的格子里。

如下面左图所示。

要求实现这样的问题:将九宫问题调整为如右图所示的形式。

调整的规则是:每次只能将与空格(上、下或左、右)相邻的一个数字平移到空格中。

要求:问你通过移动中间的空格是否能达到右图所示的状态,如果能,则输出所走的路径,如果不能,则输出:unsolvable。

最好能画出九宫的图形形式,并在其上动态的演示移动过程。

二、数据结构的设计:1:为了了解九宫格的状态所以需要记录九宫格的当前状态2:因为要采用是两端同时开始搜索的方法,所以要记录结点是从那个方向搜索到的3:为了减少重复搜索,所以要记录当前状态是由父结点怎么移动得来的4:需要输出路径,所以得记录从根节点到当前结点空格的移动路径5:需要一个队列来实现广度优先搜索6:还需要以一种便于访问的方式记录下所有已经访问过的结点,所以构造一个哈希表7:便于找到答案后释放所用空间,还需要将所有已搜索过的结点构造成一个链表综上定义如下结构体:typedef struct LNode{int data;//用一个各位不相等的9位数来表示当前状态,9表示空格int flag;//0表示由初始状态生成,1表示由末状态生成int fangxaing;//表示双亲结点生成此结点时空格的移动方向char *path;//存放路径的数组下标,比实际值小1struct LNode *next,*next1;//next用于队列中,next1用于链表}LNode,*Linklist;typedef struct {Linklist front,rear;}LinkQueue,*Queue;Linklist *hxb;//哈希表hxb=(Linklist*)calloc(362881,sizeof(Linklist));哈希函数为所有比表示这个状态的各位不相等的九位数小的各位不相等的九位数的个数,所以不会产生冲突三、功能(函数)设计:本程序的人物要求是完成九宫格的求解并输出结果,根据任务要求,总体上可以分为五个功能模块,分别为:1:程序功能介绍和操作提示模块:在主函数int main()中显示,用于程序功能的介绍和操作提示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网格布局:
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]);
单击事件处理方法
单击实践
JOptionPaneshow
游戏布局:
①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列
}
}
}
2.2数独游戏界面设计
2.3数独游戏程序功能
功能1:弹出游戏界面,可直接开始进行数独游戏,也可以在游戏过程中选择菜单栏中“文件”——“新局”,进行新一局的游戏,或者是“文件”——“重来”,重新开始当前局。
功能2:判断答案的正误。游戏当前局完成后,可选择菜单栏中“文件”——“提交”,系统会根据玩家在当前局所填写的结果,弹出相应的对话框。
功能5:选择菜单栏中“文件”——“退出”,会自动关闭当前的数独游戏界面,退出系统。
功能6:玩家可根据自身的情况或兴趣,在数独游戏界面上方的下拉列表中选择适合自己的难度(难度共分为3级,分别是“简单”,“一般”和“困难”),然后选择重新开局,游戏的难度会进行相应的变化。
功能7:在九宫格数独游戏界面和弹出的消息提示界面以及答案显示窗口和玩法说明窗口有相关的最小化、最大化、关闭等按钮可以操作,玩家可根据需要自行选择相关操作。
JAVA语言是一种纯面向对象的编程语言,自1995年诞生至今,已经得到飞速的发展,涉及计算机应用的方方面面,如浏览器应用、桌面应用、个人数字代理等等,Java语言面向对象、跨平台、安全性、多线程等特性,奠定了其作为网络应用开发首选工具的基础。
另外,本数独游戏程序框架结构清晰明朗,便于读者理解以及为以后增添新功能打下良好的基础;同时,虽然这是一个较为普通的数独游戏程序,但是具有较强的实用性,而且对程序的配置要求不高,能够广泛应用。
2.1数独游戏分析_________________________3
2.2数独游戏界面设计_______________________5
2.3数独游戏程序功能_______________________5
3.详细设计___________________________7
3.1类设计___________________________7
佛山科学技术学院
《可视化编程技术》课程设计报告
数独(九宫格)游戏软件设计
学生姓名:卫泶媚
学号:2012914201
年级专业:12级教育技术学2班
指导老师:容汝佳
学院:教育科学学院
广东★佛山
提交日期:2014年6月
1.前言______________________________2
2.概要设计____________________________3
3
3.1类设计
类名
角色
变量(属性)
行为
ShuDu1
一个数独
MenuaBar:
添加菜单项
setSize()设尺寸
add()添加文本及组件
setMenuBar()设置难易等级菜单
ShuDuAns
答案窗口
setSize( )设置尺寸
JPanel( )设置面板布局
Another
说明窗口
Public void actionPerformed(ActionEvent e)
3.2数独算法设计_________________________9
4.程序代码____________________________10
5.参考资料____________________________19
6.心得体会____________________________20
摘要:本程序是个简单的数独游戏界面,在9×9的大九宫格中有9个3×3的小九宫格,游戏根据玩家选择的难易程度提供不同数量的数字。根据已给出的数字,利用逻辑和推理,在其余空格上填入1至9的数字。每个数字在每个小九宫格内每行、每列只能出现一次。虽然玩法简单,但数字排列方式却千变万化,是锻炼逻辑推理能力的好方法。另外,设有“答案”和“玩法说明”窗口为玩家提供参考和帮助。玩家完成所有数字的填写后,可进行提交,游戏系统会根据所填写的结果弹出相应的对话框。
2
2.1数独游戏分析
数独游戏组成元素:
单元格:数独中最小的单元,标准数独中共有81个;
行:横向9个单元格的集合;
列:纵向9个单元格的集合;
宫:粗黑线划分的区域,标准数独中为3×3的9个单元格的集合;
已知数:数独初始盘面给出的数字;
候选数:每个空单元格中可以填入的数字。
基本解法:
利用1~9的数字在每一行、每一列、每一宫都只能出现一次的规则进行解题的方法。使用单元排除法的目的就是要在某一单元(即行,列或区块)中找到能填入某一数字的唯一位置,换句话说,就是把单元中其他的空白位置都排除掉。
当输入的内容不符合要求时,弹出对话框:
当结果不正确时,弹出对话框:当答案正确时,弹出对话框:
功能3:选择菜单栏中“文件”——“答案”,会弹出当前局数独游戏的正确答案的新窗口,给玩家提供参考。
功能4:选择菜单栏中“帮助”——“说明”,会弹出次数独游戏玩法的相关说明的新窗口,给玩家提供帮助。另外,选择菜单栏中“帮助”——“作者”,会弹出对话框,显示此程序作者的相关信息。
关键字:java游戏软件,数独(九宫格),界面布局
1
经济在发展,科学在发展,人也在发展。在学习JAVA语言后,我决定使用Java语言编写一个简单的数独游戏,来锻炼人们的逻辑推理能力和思维活跃度,同时,也能满足人们日常空余时间的娱乐需要。数独热潮已经在全球蔓延已久,随着数独游戏不断地发展完善,数独也越来越受到家长和孩子的青睐,认为数独不仅仅只是游戏,而是开发智力的一种方法。在孩子游戏娱乐的同时还能得到逻辑思维的锻炼,又何乐而不为呢?
相关文档
最新文档