《高级语言课程设计》报告专业:信息管理与信息系统班级:信管131________学号:13135113____________姓名:李小康__学期:2014/5/18________1设计题目:______数独游戏___________设计地点:_______理工楼319______指导教师:_李平__完成日期:_________答辩成绩:_____成绩:__________一、设计题目(包括输入、输出、功能、测试数据等)1.设计题目数独是数学智力拼图游戏。拼图是九宫格(即3格宽×3格高)的正方形状,每一格又细分为一个九宫格。在每一个小九宫格中,分别填上1至9的数字,让整个大九宫格每一列、每一行的数字都不重复。数独的玩法逻辑简单,数字排列方式千变万化。不少教育者认为数独是锻炼脑筋的好方法。2.基本要求(1)在符合数独问题要求的前提下,从键盘输入信息(Nspaces)(spaces82),随机产生有spases个空格的九宫格。(2)对随机产生有n个空格的九宫格,可以从键盘输入信息(ECRV),对相应的空格填上数字,并用程序判断所做的操作是否正确。(3)对随机产生有n个空格的九宫格,可以从键盘输入信息(CEC),擦去相应位置上的数字,并用程序判断所做的操作是否正确。3.测试数据实时随机键入数据演示。2014/5/182二、概要设计(包括设计算法思想、所用到的数据存储类型、每个功能模块(函数)的功能和规格说明、各功能模块之间的调用关系图等)1.算法思想先最简单有规律的九宫格,本实验中用的是以1,4,7,2,5,8,3,6,9开头的九宫格,然后用随机数产生随机下标,交换位置变成无规律的九宫格,在显示屏上输出显示,随机产生n个空格,显示数独游戏的开始画面,之后就编写一系列的函数,对九宫格填入适当数字和删除,最后显示填好的九宫格。2.数据储存类型本报告是用数组来储存九宫格,用了两个数组,一个整形a[9][9],还有一个布尔类型的b[9][9],用来对九宫格进行显示和清除数字时判断是否是系统数字时用。3.模块功能(1)intarry函数能生成如下二维数组(2)shuffle函数随机产生两个1~9的随机数每行中把此两数字的位置互换。上述操作重复做至少20次,得到符合数独问题的随机九宫格(3)creatsudoku函数随机产生行下标和列下标,若对应的格子不为0,则清0并计数,否则不计数。上述操作做n次,即题目需要有多少个空格。(4)begin函数调用initArray函数,调用shuffle函数,在屏幕上显示,注意每一行的起始位置定位,以及每一个数的显示宽度3(5)ShowMenu函数在游戏界面下部分显示操作命令说明(6)NewGame函数a.和begin函数类似b.区别在于begin函数的之间插入调用creatsudoku函数c.同时更改相应空位的标志值(7)judge函数判断填入的值是否符合行、列和小九宫格是否有重复(8)FillCell函数判断行列值是否合法,判断行列值表示的格子是否允许被改写,判断要填入的值时候合法,调用judge函数,根据返回结果做出是否“定位显示”相应(9)ClearCell函数在游戏界面上部显示最初的没有空位的数独界面a.判断行列值是否合法b.判断行列值表示的格子是否允许被清除c.定位光标,用空格填充相应格子(10)main函数调用begin函数调用ShowMenu函数while(flag){定位显示“select:”;接收操作命令;根据命令中的第一个动作字符执行不同的操作;}4.调用关系图mainShowMenuNewGameClearCellFillCellDemobegininitArrayshufflecreatsudodujudge4三、详细设计(包括各功能模块(函数)的入口参数及类型、各功能模块(函数)所完成的功能、各功能模块(函数)完成时输出或返回调用模块(函数)的值、尽可能画出各功能模块(函数)的算法流程图或(N-S图)来进行算法描述,若直接用程序源代码来进行算法描述,则要求对各部分功能作出说明。程序源代码一般不要超过40行)1.产生一个符合数独问题要求的初始九宫格A[9][9]voidintArray(intA[9][9]){//可以选用依次分别以1、4、7、2、5、8、3、6、9为每行开始数字的符合数独问题要求的初始九宫格A[9][9]}2.构造一个符合数独问题要求的随机的初始九宫格A[9][9]voidshuffle(intA[9][9]){//对于由initArray()产生的符合数独问题要求的初始九宫格A[9][9]*/for(20次重复)/*建议每行有20对数据互换*/{随机产生一对1~9的数字;每行中数字值为这对数字的两个格子的数字互换;}}3.构成有n个空格的符合数独问题要求的随机的初始九宫格A[9][9]voidcreateshudu(intA[9][9],intn){//对于有shuffle函数完成的符合数独问题要求的随机的初始九宫格A[9][9]*/while(重复n次){随机产生行下标和列下标;若对应行、列下标的格子不为0,则该格子清0;}}4.在显示屏上显示最初有规律的九宫格voidbegin(inta[9][9],boolb[9][9]){//调用intarry函数和shufflt函数构成最初九宫格for(i=0;i9;i++)for(j=0;j9;j++){输出在显示屏上的最初九宫格并使b[i][j]=1;}5.产生并显示有spaces个空格的符合数独问题要求的随机的初始九宫格游戏A[9][9]voidNewGame(intA[9][9],boolb[9][9],intspaces)5{//调用函数initArray()产生最初的九宫格中的数字A[9][9];调用函数shuffle()构造符合数独问题要求的随机的初始九宫格A[9][9];调用函数createshudu();产生有spaces个空格的符合数独问题要求的随机的初始九宫格A[9][9];显示当前的九宫格A[9][9];记录当前的九宫格A[9][9]有数字的位置。}6.检测输入格子的信息是否合法intjudge(intA[9][9],introw,intcol,intnum){/*将要输入数字num的格子进行检测*/if(当前格)返回不合法;/*当前格已有该数字,不允许再赋值*/if(当前格所在行中已有该数字)返回不合法;if(当前格所在列中已有该数字)返回不合法;for(当前格所在小九宫格中已有该数字)返回不合法;返回合法;}7.在九宫格A[9][9]中的空格处填一个数字voidFillCell(intA[9][9],boolb[9][9],intr,intc,intvalue){//if(行、列下标不合法)显示相关信息,返回;/*说明该格不存在*/if(该格是初始产生的数字)显示相关信息,返回;/*说明该格不允许修改*/if(要填入的数字不合法)显示相关信息,返回;if(judge())/*要填入的数字经所在的行、列、小九宫格中的数字检测合法*/{该格得到数字value;在九宫格中的该格处显示该数字;}else显示相关信息;}8.voidShowMenu()6{//显示功能菜单}9.显示填完整的九宫格voidlist(inta[9][9]){//for(i=0;i9;i++)For(j=0;j9;j++)Couta[i][j]}10.voiddemo(intA[9][9]){/*为了游戏开始前演示一个数独问题解的过程*/调用了list函数显示完整的九宫格}11.主程序intmain(){设置九宫格字符数组A[9][9];设置布尔数组b[9][9](以区分是原来产生的数字还是后面修改的数字);调用begin()函数,显示一个数独问题解的九宫格;调用ShowMenu()函数,显示菜单;while(进入游戏){键入菜单选择项;执行相应的函数,实现相应的功能;}}7四、调试分析(包括设计过程中出现了哪些问题,这些问题是如何何解决的,至少写3条,除非没有3个以上的问题,也必须说明,讨论与分析、改进设想、经验与体会等)1.在输出九宫格时由于要在屏幕中间输出所以要用到定位功能,最初程序编完之后一直发现不了错误,最后经过查阅资料才发现忘了加头文件。2.在考虑到输出时九宫格中有空格,而a数组中的元素又不能变空格,所以又定义了一个布尔数组,来确定哪个格子能填数,哪个格子能删除。3.测试数据输入的行和列下标都是第几行和第几列,所以编程时行下标和列下标都要减一.4.再输入和删除九宫格中元素时还要用到定位功能,才能正确输入和删除.5.用judge函数判断要输入的数有没有重复时,不仅要判断同行,同列有没有重复,还要判断在小的九宫格中有没有重复,所以要用到两个for循环分九种情况来实现,而且必须靠b数组的帮助。五、测试结果(包括输入的测试数据和输出的结果。测试数据应该完整,一般不少于2组)1.输入n1082.输入e1663.输入e16109六、用户手册(说明你的设计程序是用什么编程工具设计开发的;文件名是什么;如何使用你的源程序进行运行,从而验证你的设计结果)1、序的运行环境为windows操作系统下命令执行方式,执行文件为:数独游戏.exe;也可在VC集成环境下执行。2、演示程序后即显示文本方式的用户界面3、测试数据七、附录(包括若详细设计是用算法流程图或N-S图来进行算法描述的,则列出程序源代码。其他必要的说明)源程序文件名清单:数独游戏.cpp