C语言数独游戏大作业开发文档(作业报告)
- 格式:docx
- 大小:80.28 KB
- 文档页数:8
”的开发实验报告数独游戏”“数独游戏一、实验目的通过“数独游戏”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程序中添加两个设置,一个用于播放背景音乐,一个用于显示提示信息。
c语言数独游戏程序(C language Sudoku program)/ * **数独程序* /公共类的蜀都{/ * * /存储数字的数组静态int [] = n =新int [ 9 ] [] 9 ];/ * * /生成随机数字的源数组,随机数字从该数组中产生static int [] num = { 1,2,3,4,5,6,7,8,9 };public static void main(String [] args){/ /生成数字对于(int = i 0;i < 9;i + +){/ /尝试填充的数字次数int时间= 0;/ /填充数字对于(int = 0;j<9;j + +){/ /产生数字n [我] [ J ] = generatenum(时间);/ /如果返回值为0,则代表卡住,退回处理/ /退回处理的原则是:如果不是第一列,则先倒退到前一列,否则倒退到前一行的最后一列如果(n i = j = 0){/ /不是第一列,则倒退一列如果(j = 0){J=2;继续;}否则{ //是第一列,则倒退到上一行的最后一列我--;j=8;继续;}}/ /填充成功如果(iscorret(i,j)){/ /初始化时间,为下一次填充做准备时间= 0;} { //继续填充其他次数增加/ / 1时间+;/ /继续填充当前格J;}}}/ /输出结果对于(int = i 0;i < 9;i + +){ 对于(int = 0;j<9;j + +){系统。
输出;}系统println()。
出去;}}/ * **是否满足行、列和3x3区域不重复的要求* @param排行号* @param Col列号* @还真代表符合要求* /公共静态布尔iscorret(行,int型){返回(检验行(列)与这种(COL)和checknine(行,列));}/ * **检查行是否符合要求* @param排检查的行号* @还真代表符合要求* /公共静态布尔检验行(行){对于(int = 0;j<8;j + +){如果(n行= j = 0){继续;}for (int k = j + 1, k < 9; k + +) { if (n [row] [j] = = n [row] [k]) { return false;}}}return true;}/ * ** 检查列是否符合要求* @ param col 检查的列号* @ return true代表符合要求* /public static boolean checkline (int col) { for (int j = 0 and j < 8; j + +) {if (n [j] [col] = = 0) {continue;}for (int k = j + 1, k < 9; k + +) {if (n [j] [col] = = n [c] [col]) {return false;}}return true;}/ * ** 检查3x3区域是否符合要求* @ param row 检查的行号* @ param col 检查的列号* @ return true代表符合要求* /public static boolean checknine (int row, int col) { / / 获得左上角的坐标int j = row / 3 * 3;int c = col / 3 * 3;/ / 循环比较for (int i = 0; i < 8; i + +) {if (n [j + i / 3] [k + in% 3] = = 0) {continue;}for (int m = i + 1; m < 9; m + +) {if (n [j + i / 3] [k +] in% 3 = = n [j + m / 3] [k + m% 3]) {return false;}}}return true;}/ * ** 产生1 - 9之间的随机数字* 规则: 生成的随机数字放置在数组8 - time下标的位置, 随着time的增加, 已经尝试过的数字将不会在取到* 说明: 即第一次次是从所有数字中随机, 第二次时从前八个数字中随机, 依次类推,* 这样既保证随机, 也不会再重复取已经不符合要求的数字, 提高程序的效率* 这个规则是本算法的核心* @ param time 填充的次数, 0代表第一次填充* @ return* /public static int generatenum (int a) {/ / 第一次尝试时, 初始化随机数字源数组if (a = = 0) {for (int i = 0; i < 9; i + +) {num [in] = in + 1;}}/ / 第10次填充, 表明该位置已经卡住, 则返回0, 由主程序处理退回if (a = = 9) {return 0;}/ / 不是第一次填充/ / 生成随机数字, 该数字是数组的下标,The number corresponding to the subscript in the array num is a random numberInt ranNum = (int) (Math.random () * (9 - time));/ / put the numbers placed in the penultimate position of a time array,Int temp = num[8 - time];Num[8 - time] = num[ranNum];Num[ranNum] = temp;/ / return the numberReturn num[8 - time];}}。
数独游戏院系:班级:组长:组员:指导教师: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日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;同时撰写报告。
学院*****************目录1 摘要 (3)1.1设计题目 (3)1.2设计内容 (3)1.3开发工具 (3)1.4应用平台 (4)2 详细设计 (4)2.1程序结构 (4)2.2主要功能 (10)2.3函数实现 (13)2.4开发日志 (18)3 程序调试及运行 (20)3.1程序运行结果 (20)3.2程序使用说明 (22)3.3程序开发总结 (22)4 附件(源程序) (22)1 摘要1.1 设计题目折半法查找演示程序1.2 设计内容本程序是一个演示折半查找算法的演示程序。
由用户输入查找的数据表列和查找的数据,系统在将数表排序后可以在屏幕上演示在排序后的表列中按折半查找法查找该数据的具体过程(通过每次查找的中间数据、下次查找表列等,具体效果见下图),支持多次演示、错误提醒,程序暂停演示功能。
1.3 开发工具Visual C++ 6.0和Win32。
1.4 应用平台Windows 2000/XP/Vista 32位2 详细设计2.1 程序结构程序功能模块:本程序主要由五大模块组成:程序说明模块、输入模块、排序模块、折半法查找及显示模块、进程选择模块。
各模块的主要功能如下:程序说明模块:给使用者营造一个较为友好的界面,同时提供程序开发人员的相关信息以及程序操作的相关说明信息。
此部分模块主函数源代码如下:int a[N];/*存储要查找的数表,用户输入*/int i,n,num,count;/*count为折半次数计数器,n为数表数据个数,num存储所查数据*/int top,bottom,mid;char c;/*存储选择函数中的输入的字符y或n*/int flag=1;/*折半法循环标志变量*/int loc=-1;/*存储所查找数据位置*/double k=0;p_s(76);puts("\n");/*引用p_s函数,打出一行'*'*/(p_s函数位于print_star.cpp文件中,参见下文)printf("****欢****迎****使****用****折****半****查****找****法****演****示****器****\n");puts("\n");/*程序欢迎语*/p_s(13);printf("制作者:***************** ");/*作者信息*/p_s(4);printf("Email:************************ ");/*电子邮件*/p_s(11);puts("\n");p_s(76);puts("\n");/*再次引用p_s函数,程序说明部分结束*/附:print_star.cpp文件源代码#include<stdio.h>void p_s(int k){int i;for(i=1;i<=k;i++)/*连续输出ka个'*'*/printf("*");}输入模块:引导使用者输入要在其中查找数据的数表的数据个数和数表数据。
C语言大作业
猜数字游戏
信安三班
孙麒 2009302530088
戈丽萍 2009302530066
分工
戈丽萍:A、B、Win函数,流程图孙麒:main、Guess函数、程序调试
一、游戏说明
1、系统随机产生一组不重复的4位数字
2、游戏者输入所猜的不重复数字,并按回车提交。
3、系统将提交的数与它自动产生的数进行比较,输出结果“*A*B”形式。
其
中A代表数字正确相应位置也正确,B代表数字正确但位置不正确。
如:1A3B 表示游戏者有1个数字的位置正确且数值也正确,除此以外,游戏者还猜对了3个数字,但位置不对,即游戏者已经猜出4位数据,但有3个数据位置不对!
4、游戏者有限定的8次的猜测机会,在规定次数内完成,则游戏成功,否则,
游戏失败。
5、游戏成功后,将根据游戏者猜测所需要的次数对其进行评价:第一次猜出为perfect,第二——第四次猜出为great
二、详细流程
1、main函数
、
2、win函数(判断输赢)
3、A函数(判断数字且位置正确的个数)
A (char m[4],char n[4])
B(char m[4],char n[4],in a)
4、B函数(判断数字对但是位置不对的个数)
5、主函数Guess(char right[4])
三、总结经验
在确定了设计的内容之后,经历了很长时间的思考想出了算法。
但是在设计中反复出现错误,特别是B函数,检查很多遍之后觉得算法并无问题。
就分块进行调试。
后来偶然发现原来是整个过程中的“==”都写成了赋值“=”,导致错误,今后一定要细心才可以。
课程设计数独解谜程序2015年4月20日设计题目 学号 专业班级 学生姓名 指导教师目录一、使用资料................................................................. 错误!未定义书签。
二、设计内容 (11)三、详细设计说明 (12)四、软件使用说明 (13)五、附录:部分程序清单(带有较详细的注释) (19)一、使用资料C++中栈结构建立与操作什么是栈结构栈结构是从数据的运算来分类的,也就是说栈结构具有特殊的运算规则,即:后进先出。
我们可以把栈理解成一个大仓库,放在仓库门口(栈顶)的货物会优先被取出,然后再取出里面的货物。
而从数据的逻辑结构来看,栈结构起始就是一种线性结构。
如果从数据的存储结构来进一步划分,栈结构包括两类:顺序栈结构:即使用一组地址连续的内存单元依次保存栈中的数据。
在程序中,可以定义一个指定大小的结构数组来作为栈,序号为0的元素就是栈低,再定义一个变量top保存栈顶的序号即可。
链式栈结构:即使用链表的的形式保存栈中各元素的值。
链表首部(head指针所指向元素)为栈顶,链表尾部(指向地址为NULL)为栈底。
在栈结构中只能在一端进行操作,该操作端称为栈顶,另一端称为栈底。
也就是说,保存和取出的数据都只能从栈结构的一端进行。
从数据的运算角度来分析,栈结构是按照“后进先出”的原则处理结点数据的。
在栈结构中,只有栈顶元素是可以访问的,栈结构的数据运算也是非常简单。
一般栈结构的基本操作只有两个:入栈(Push):将数据保存到栈顶的操作。
进行入栈操作前,先修改栈顶指针,使其向上移一个元素位置,然后将数据保存到栈顶指针所指的位置。
出栈(Pop):将栈顶数据弹出的操作。
通过修改栈顶指针,使其指向栈中的下一个元素。
接下来,我们使用C++语言建立顺序栈,并完成顺序栈结构的基本运算准备数据准备在栈操作中需要用到的变量及数据结构等。
#define MAXLEN 50struct DATA{string name;int age;};struct StackType{DATA data[MAXLEN+1];int top;};定义栈结构的长度MAXLEN,栈结构的数据元素类型DATA,以及栈结构的数据结构StackTyp e。
C语⾔实现数独游戏的求解玩家需要根据9×9盘⾯上的已知数字,推理出所有剩余空格的数字,并满⾜每⼀⾏、每⼀列、每⼀个同⾊九宫内的数字均含1-9,不重复。
输⼊包含9x9的已知数字,空位⽤0补齐,中间⽤空格隔开。
(输⼊数独题⽬确保正确)输出为输⼊数独题⽬的解。
样例输⼊:8 0 0 0 0 0 0 0 00 0 3 6 0 0 0 0 00 7 0 0 9 0 2 0 00 5 0 0 0 7 0 0 00 0 0 0 4 5 7 0 00 0 0 1 0 0 0 3 00 0 1 0 0 0 0 6 80 0 8 5 0 0 0 1 00 9 0 0 0 0 4 0 0样例输出:8 1 2 7 5 3 6 4 99 4 3 6 8 2 1 7 56 7 5 4 9 1 2 8 31 5 423 7 8 9 63 6 9 845 7 2 12 8 7 1 6 9 53 45 2 1 9 7 4 36 84 3 85 26 9 1 77 9 6 3 1 8 4 5 2C语⾔代码样例#include <stdio.h>#include <stdlib.h>int *fillnumber(int a[9][9][10],int number,int i,int j){for (int k=0;k<9;k++){a[i][k][number]++;a[k][j][number]++;}for (int n=0;n<3;n++){for (int m=0;m<3;m++){a[i/3*3+n][j/3*3+m][number]++;}}return a;}int *resetnumber(int a[9][9][10],int number,int i,int j){for (int k=0;k<9;k++){a[i][k][number]--;a[k][j][number]--;}for (int n=0;n<3;n++){for (int m=0;m<3;m++){a[i/3*3+n][j/3*3+m][number]--;}}return a;}void search(int step, int a[9][9],int g[9][9][10]){if (step==0) {for (int i=0;i<9;i++){for (int j=0;j<9;j++){printf("%d ",a[i][j]);}printf("\n");}exit(0);}for (int i=0;i<9;i++){for (int j=0;j<9;j++){if (a[i][j]==0) {for (int number=1;number<10;number++){if (g[i][j][number]==0){fillnumber(g,number,i,j);a[i][j]=number;search(step-1,a,g);a[i][j]=0;resetnumber(g,number,i,j);}}return;}}}}int main(int argc, const char * argv[]) {int a[9][9];int abool[9][9][10];int step=0;for (int i =0;i<9;i++){for (int j=0;j<9;j++){for (int k=1;k<10;k++) {abool[i][j][k]=0;}}}for (int i =0;i<9;i++){for (int j=0;j<9;j++){scanf("%d",&a[i][j]);if (a[i][j]==0) {step++;}else{fillnumber(abool,a[i][j],i,j);}}}search(step,a,abool);return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
数学与信息技术学院《算法设计与分析》设计报告报告题目: 基于C语言的数独游戏班级:07计本1班学生姓名:**学生姓名:**学生姓名:***日期:__ 2010-11-24【摘要】“数独(Sudoku)”,顾名思义——每个数字只能出现一次。
普通的数独游戏是在9×9的单元网格中进行,单元网格被分成9行、9列,也被分成3×3的九宫格。
单元网格中已存在若干数字,其余为空格。
游戏规则要求玩家在每个空格中填入1-9之间的数字,使每个数字每行、每列、每个小九宫格中仅会出现一次。
在做数独题生成算法时,我们要考虑有哪种算法以及算法的复杂度。
此外我们还要掌握C语言的基本编程方法,想要顺利完成这次实验,我们还得掌握算法分析与设计的相关知识,并对数独游戏做充分的了解。
【关键词】数独;算法;C语言目录【摘要】 (2)1选题背景 (4)2 数独游戏简介 (4)3 数独的技巧 (4)4 算法设计 (5)4.1玩家玩法分析 (5)4.2算法数组定义 (6)4.3重要代码分析 (6)5.小结 (9)参考文献 (10)1选题背景数独游戏由于规则简单,却变化无穷,在推敲中完全不必用到数学计算,只需用逻辑推理能力,所以无论老少中青男女,人人都可以玩。
而且数独游戏容易入手,容易入迷,作为数独游戏的爱好者,我们组成员运用C语言,开发了一个简单的数独游戏,不仅锻炼了我们的能力,也为爱好数独游戏的朋友提供一个体验游戏的过程。
2 数独游戏简介数独游戏是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数学智力拼图游戏。
拼图是九宫格(即3格宽×3格高)的正方形状,每一格又细分为一个九宫格。
在每一个小九宫格中,分别填上1至9的数字,让整个大九宫格每一列、每一行的数字都不重复。
数独的玩法逻辑简单,数字排列方式千变万化。
不少教育者认为数独是锻炼脑筋的好方法。
为便于描述,本文首先确定以下名词:1、初盘:游戏开始时的单元网格状态,其中包含若干数字和若干空格。
学院XX学院班级XX学号XX姓名XXX摘要我选择的是数学型综合作业:(A)求最大数;(B)高次方数的尾数。
主要内容:(A)求555555的约数中最大的三位数; (B)求13的13次方的最后三位数。
基本设计思路:(A)题目的设计思路是:因为要求的是三位数,就用555555从小到大依次除以100到999的所有数,并判断能否整除,最后一个可以整除555555的数即为所求。
(B)题目的设计思路是:乘积的最后三位数只与乘数和被乘数的后三位数有关,因此用1乘以13,再除以1000并取余数,用余数乘以13,再除以1000并取余数,依次进行下去,累乘13个13后除以1000取得的余数即为所求。
在(A)题目中,我限定了除数的范围,减少了计算次数,省去了比较约数大小的步骤,使程序更加简洁。
在(B)题目中我没有拿13累乘13次,而是取每一次乘13所得乘积的最后三位数依次乘13,大大减少了计算,简化了程序;取最后三位数我利用除以1000 取余数的方法,方便、快捷。
两个题目中均使用FOR循环,程序书写简练明了。
我个人认为这两个题目我不编写得比较简洁,运算结果正确,很好地完成了题目要求。
目录1 摘要 (3)1.1设计题目 (3)1.2设计内容 (3)1.3开发工具 (3)1.4应用平台 (3)2 详细设计 (4)2.1程序结构 (4)2.2主要功能 ............................................................ 错误!未定义书签。
2.3函数实现 (6)2.4开发日志 (6)3 程序调试及运行 (7)3.1程序运行结果 (7)3.2程序使用说明 (8)3.3程序开发总结 (8)4 附件(源程序) (8)1 摘要1.1 设计题目(A)求最大数;(B)高次方数的尾数1.2 设计内容(A)求555555的约数中最大的三位数; (B)求13的13次方的最后三位数1.3 开发工具Visual C++ 6.0和Win32。
《C语言程序设计》实验大作业反思报告系统设计与实现:1.系统功能模块划分对系统进行自顶向下的模块分解,画出系统各个功能模块之间的结构图如下:2.函数功能和外部接口设计本系统总计设计了13个函数,每个函数的功能和接口设计如下表所示:序号函数名函数功能函数参数函数返回值1 read_keyboard 读取键盘输入的变量无key_code2 loop_Game 游戏循环cmd 无3 reset_Game 重置游戏无无4 add_rand_num 添加随机数无随机数5 get_null_count 获取空位置数量无空位置数量n6 check_Game_over 检查游戏是否结束无if_Game_over7 Move_left 左移无If_need_add_num8 Move_right 右移无If_need_add_num9 Move_up 上移无If_need_add_num10 Move_down 下移无If_need_add_num11 clear_screen 清屏无无12 refresh_show 刷新界面无无13 init_Game 初始化游戏无无各个函数之间的调用关系如下所示:3.数据结构结构体数组+指针,链表4.算法递推,查找,文件操作5.程序流程图系统总体流程图如下:实验过程中遇到的问题及解决方法与思路:问题1:开始部分函数体和数据设置较多,导致后面程序的编写过程中出现了许多错误,例如函数名和数据名的大小写等出现错误。
原因:函数名和数据的设计为了追求简洁而无法记住其意义,并且设置过多。
解决方法:在纸上将函数名和数据名都记好,以防后面编写时出现遗忘,此外,应当按照函数名以及数据名的具体作用进行设置,而非随心所欲。
问题2:对于清屏函数clear_screen和初始化函数init的掌握不熟练,导致编写过程中有许多错误出现,编写很不规范。
原因:对于Linux相关知识掌握较少,无法使用相关函数功能。
C语言程序设计大作业
数独辅助器
开发文档
项目名称:数独辅助器
组别:
组员:
目录
一、软件功能说明
二、架构设计
1、任务分解
2、文件夹各主要文件说明
3、界面设计
三、代码说明
1、常量、全局变量、结构体说明
2、算法部分函数说明
3、图形化部分函数说明
四、编译运行方式
一、软件功能说明
数独是源自18世纪瑞士的一种数学游戏。
是一种运用纸、笔进行演算的逻辑游戏,在计算机诞生后,数独也可通过编程在计算机上实现。
数独规则为:在一个9*9的九宫格子且每一宫又分为3*3九个小个子的盘面上,根据已知的数字,推理出所有剩余空格的数字,使得所填数字为1-9这九个整数中的某一个,且满足每行、每一列、每个小宫格内的数字均包含1-9九个整数且不重复。
该程序设计了一款数独辅助器,将数独图以.sm文件形式导入到程序运行目录下的Map文件夹,即可使用该程序辅助游戏。
主要辅助功能有二:
(一)选中数独图中任意一格,其所属行、列、九宫格会加深颜色,方便用户直观看清已有数字,更快地寻找答案。
(二)点击解题按钮,程序会自动解题并显示答案。
二、架构设计
1、任务分解
该程序的主要模块为:
(1)使用Win32 API设计数独辅助器界面,对图标及底版的尺寸、颜色、字体等进行设置并绘制;
(2)使用文件访问读取文件夹中的数独题目,用双向环状链表存储数独题目,方便数独题目的增减;
(3)利用穷举的思想和深度搜索的方法设计算法,解出数独答案。
2、文件夹各主要文件说明
(1)Sudoku.h:代码头文件;
(2)Sudoku.cpp:代码源文件;
(3)Image文件夹:界面设计中用到的按钮图案;
(4)Map文件夹:用于存储数独题目,可以导入需要程序辅助
的数独题目;
(5)Map文件夹下存储的数独题目为.sm格式,意为SudokuMap,文件格式示例如下:
- 1.sm
8 0 0 0 0 0 0 0 0
0 0 3 6 0 0 0 0 0
0 7 0 0 9 0 2 0 0
0 5 0 0 0 7 0 0 0
0 0 0 0 4 5 7 0 0
0 0 0 1 0 0 0 3 0
0 0 1 0 0 0 0 6 8
0 0 8 5 0 0 0 1 0
0 9 0 0 0 0 4 0 0
3、界面设计
切换上一张数独图
切换下一张数独图
选中某一格,其相关
联的行、列、九宫格
颜色会加深,方便寻
找答案。
解出该数独图答案
三、代码说明
1、常量、全局变量、结构体说明
(1)IDB_BUTTON1、IDB_BUTTON2、IDB_BUTTON3
- 按钮通知码(向前按钮、向后按钮、解题按钮)(2)int windowWidth、int windowHeight
- 窗口宽度、高度
(3)int x、int y
- 窗口中数独图绘制区域的左边、顶边位置
(4)int iMouse、int jMouse
- 当前选中的小格列号、行号。
初始化为-1, -1,表示没有选
中小格
(5)int solved
- 当前是否已点下解题按钮。
初始化为0,点击解题按钮后设
为1
(6)struct pNode{
LPTSTR name; //数独文件名
int map[9][9]; //读入的数独图
int solution[9][9]; //解出的数独图
pNode *prev, *next; //前指针、后指针
}
- 存储数独题目的双链表指针结构体
(7)struct pNode *p
- 指向当前所在数独题目
(8)HINSTANCE hAppInstance
- 控件实例句柄
2、算法部分函数说明
(1)读入数独题目:void readMap(pNode *p, const char* s) - 返回类型:无
- 传参:pNode *p:p指针指向当前所在的数独题目, const
char* s:写入的数独题目文件名
- 函数功能:先将数组进行初始化,然后打开数独题目文件,
将数独题目写入数组,最后关闭文件。
(2)解数独:int solveSudoku(pNode *p, int depth)
- 返回类型:整型,返回值为0或1,0表示题目无解,1表
示题目有解
- 传参:pNode *p:所解数独题指针;
int depth:深度,等于地图坐标x*9+y,x为所在行,y为所在
列(x=depth/9,y=depth%9)
- 函数功能:使用深度优先搜索算法解数独。
对于每一格,先
判断该格是否需要填入数字。
如果不需要,递归至下一格。
如果需要,定义一个book数组并初始化为0,用于标记当前
遍历到的格子1-9九个数字是否能够填入,利用循环标记该
格子所在行、列、九宫格中已出现的数字,并标记为1(不可
填),再遍历book数组中可用于填入的数字,按照从小到大
的顺序尝试填入并递归至下一个格子判断下一个格子是否能
够有解,如果有解则表示当前格子填入的数字目前是正确的,
进行该操作直至最后一个格子,若每一个格子都返回为1则
为有解,若某一个格子遍历完所有可被填入的数字都无解则
该题目无解。
(3)Win32主函数:int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR
lpCmdLine, int nCmdShow)
- 返回类型:整型,返回结构体窗口的长整型
- 传参:HINSTANCE hInstance: 应用程序当前实例句柄,
HINSTANCE hPrevInstance: 应用程序的先前实例的句柄,
LPWSTR lpCmdLine: 指向应用程序命令行的字符串的指针,
不包括执行文件名, int nCmdShow: 指明窗口如何显示
- 函数功能:创建win32窗口
a. 依次读取Map文件夹目录中的所有数独题目,将题目存入
双向链表中,定义了文件名、文件属性信息以及存储这些题
目的链表,扩展名sm表示SukokuMap
b. WNDCLASS wc:注册窗口,用来储存窗口信息的结构
c.hWnd = CreateWindow:创建窗口实例,包括窗口类名、
窗口标题、风格、窗口的初始显示位置、高度、宽度、父窗
口、子菜单
d. 初始化全局变量:包括鼠标位置和速度解
e. 进入循环监听消息,给系统操作进行响应,返回当前窗口
结构体的长整型
3、图形化部分函数说明
(1)使用结构体绘制数独辅助器界面窗口:
void drawScene(HWND hWnd):
·绘制数独显示区背景图为圆角矩形;
·如果当前有小格被选中,对该小格所在的行、列、小九宫格
的颜色进行加深绘制;
·绘制九宫格分割线,包括9*9个小格子之间的分割细线以
及3*3个小九宫格之间的分割粗线;
·如果解题按钮“Go”已被点击,绘制数独答案数字,即空
格上需要填充的数字;
·绘制数独题目数字,即格子中已给出的数字。
(2)处理监听消息并进行响应:LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
返回类型:LRESULT,长整型
传参:消息参数
函数功能:
a. case WM_CREATE:创建三个按钮button1: “上一题”,
button2:“下一题”,button3: “Go(开始解题)”,并从Image
文件夹下导入对应图标;
b.case WM_PAINT:调用drawScene函数绘制窗口;
c. case WM_COMMAND: 监听按钮点击事件并重新绘制窗
口。
点击“上一题”按钮时指针向前挪一位,即获取前一个数
独题目;点击“下一题”按钮时指针向后挪一位,即获取后一
个数独题目;点击“解题”按钮时,设置变量solved为1;
d. case WM_LBUTTONDOWN:监听鼠标点击事件并重新绘
制窗口。
鼠标点击时,获取当前点击的小格子的所在行、所
在列信息,重绘窗口。
四、编译运行方式
本套程序使用Microsoft Visual Studio 2017集成开发环境编写、编译、运行和调试。
根目录下的SudokuAssistant.sln为Visual Studio项目文件。
项目代码、资源文件和编译完成的.exe文件均在根目录下SudokuAssistant文件夹中。