JAVA数独(九宫格)游戏软件设计报告(推荐文档)
- 格式:doc
- 大小:454.50 KB
- 文档页数:20
”的开发实验报告数独游戏”“数独游戏一、实验目的通过“数独游戏”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程序中添加两个设置,一个用于播放背景音乐,一个用于显示提示信息。
计算机与信息工程系《数独游戏的设计与实现》课程设计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库进行开发数独游戏是一种智力益智类游戏,通过填写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的数字。
以一个小九宫为单位,将相邻三个数字作为一个集体进行交替,由此获得第二行的数字,再由第二行的数字根据前述方法变换得到第三行的数字。
摘要本文介绍了利用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*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数独小游戏课程设计一、课程目标知识目标: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语言编程、数组、控制结构等章节密切相关,通过数独小游戏项目实践,让学生巩固所学知识,并提高实际应用能力。
数独实验报告范文实验报告:数独问题的求解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 中所有的值都确定下来(即题目完成),或者回退到了最初点的前一位置(说明题目有误)。
四.算法设计程序可以考虑人工智能的算法。
数独游戏的设计与实现数独游戏的规则: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()中显示,用于程序功能的介绍和操作提示。