XXXXXX大学信息工程学院C++面向对象实习报告题目:数独游戏的设计与实现学号0000000000姓名XXX专业班级计算机科学与技术XX班指导教师XXX实践日期XXXXXXX目录一、综合训练目的与要求.....................................................................................................................1二、综合训练任务.................................................................................................................................1三、总体设计.........................................................................................................................................1四、详细设计说明.................................................................................................................................1五、调试与测试.....................................................................................................................................4六、实习日志.........................................................................................................................................9七、实习总结.......................................................................................................................................10八、附录:核心代码清单...................................................................................................................111一、综合训练目的与要求1.综合训练目的:1)能够熟练运用CodeBlocks编译和调试程序。2)以实习来强化C++知识,熟练运用C++。3)学习QT编程,了解QT中各个类以及函数,并利用QT为数独游戏进行界面设计2.综合训练要求:1)按时到达实习机房,不迟到,不早退。2)在实习之前,做好实习计划,合理安排时间。3)在编程和界面设计时要尽量的专注和细心,再设计算法时要考虑周全。二、综合训练任务1.设计算法自动随机生成不完整数独,并且设计算法求解,从而完成数独游戏的设计与实现。2.编译并调试程序,利用QT设计界面,完善各个功能。三、总体设计1.主菜单:主菜单中主要设计了开始游戏,游戏提示,查看答案,游戏技巧,游戏说明及退出游戏等工具条。2.游戏界面:游戏界面分为游戏区和功能区。游戏区主要是有一个9×9的宫格组成,玩家可以在每个宫格中输入数字。功能区主要包括游戏难度选择,提示,重玩,答案,确认及退出按钮。可实现相应的功能。四、详细设计说明1.主菜单中各个功能的详细介绍:(1)进入游戏含义:进入游戏会提供四个不同的难度进行游戏,分别是简单,一般,困难,特难四个等级。代码实现如下:operaMenu=newQMenu(tr(菜单(&O)),this);ui-menuBar-addMenu(operaMenu);startMenu=newQMenu(tr(开始游戏(&Q)),this);operaMenu-addMenu(startMenu);而这四个难度分别由SudokuClear1(),SudokuClear2(),SudokuClear3(),SudokuClear4()来控制的。(2)重玩本局含义:玩家可以通过此操作来清除自己填过的数字,重新开始本局游戏。本操作主要通过SudokuReplay()函数来实现清除操作。(3)答案提示含义:玩家可通过此操作来获取一个空位的正确填法,也可以纠正玩家填错的数字。提示操作是由SudokuHint()函数实现。(4)查看答案2含义:此功能的本质是数独的自动求解,玩家可通过此操作来查看数独的正确答案。本操作由SudokuRun()来实现的。(5)游戏技巧含义:在游戏技巧中,主要是为玩家提供求解数独的几种方法,便于求解数独。(6)关于含义:对数独游戏的基本介绍,包括其版本信息及游戏来历等。(7)退出游戏含义:退出系统,close()函数实现。2.游戏界面各个功能详细介绍:(1)游戏区含义和内容:游戏界面是实现玩家直接与计算机交流的地方。对于游戏区我采用的是81个可编辑的文本框按9×9的顺序排列方式来形成数独显示的界面。而程序内部采用一个二维数组与81个文本框相对应进行操作。游戏设置了简单,一般,困难和特难4个等级的难度。当玩家选择一个难度开始游戏时,系统内部会调用随机生成的不完整数独数组,然后将对应的数字显示在81个文本框内,如果遇到数组中的值为0的元素,那么对应的文本框将不显示数字并将此文本框的值标记为-1。遇到不为0值时文本框会将其显示出来,并使此文本框成为不可编辑的为文本框。同时,系统会对生成的数独进行求解,将答案储存在这个二维数组中。当玩家填完数独后,系统会对玩家所填好的数独与此数组中的值逐一对比若发现有不同的将提示玩家答案错误,若完全相同则将提示玩家答案正确。玩家若想退出游戏直接点击相应的操作即可退出游戏。(2)函数实现详见核心代码清单。(3)算法讲解1)数独自动随机生成算法:对于数独的随机生成,我采用的是将一个正确而完整的数独进行随机的变换得到新的数独然后对其进行随机的挖空。具体来说是将一个完整的数独,即二维数组matrix[9][9]当中的所有行或列中某两个数进行交换,然后将得到的数独记为map[9][9],在对其进行随机的挖空,即可得到数独题目。此算法由函数:voidSudokuSwap(int*number1,int*number2)和voidSudokuGeneration(intdegree)实现。2)数独求解算法;数独求解主要运用于数独的自动求解即给玩家提供数独正确的答案。具体来说是利用深度优先搜索对每个空位进行1~9的填充,然后检测所填数字在所在行、列以及3×3的宫格中是否有与之相同的数字。若有,则函数返回0说明此数字错误,检测下一数字。若没有,则函数返回1,说明所填数字正确,此时对下以空格进行相同的操作。此算法对应函数boolDFS(intsum)。3),判断数独算法:判断数独算法主要是用来判断玩家所完成的数独是否正确。该算法是先对原数独进行求解,得到正确答案map[9][9]。然后将玩家所完成的数独app[9][9]与之进行逐一对比。再次设置一个标记的变量a;若有app[i][j]!=map[i][j],则令a=1。检查完成后若有a=1则说明玩家答案错误。反之说明答案正确。此算法对应函数为:voidSudokuSure()。34)重玩算法:重玩算法主要是用来实现让玩家重新开始本局游戏的。该算法是将原先生成的不完成的数独记录在arr[9][9]中。当玩家需要重玩时,系统将arr[9][9]中的元素输出到宫格中覆盖掉玩家输入的数,此时玩家可以重新开始游戏。相应函数为:voidSudokuReplay()。5)答案提示算法:此算法主要用于提示玩家下一个空位的正确填法或纠正玩家填错的地方。其具体实现过程是现将原数独求解出来记为map[9][9],然后将玩家所填的数独记为app[9][9],然后将两个数独进行逐一对比。若发现app[i][j]与map[i][j]的值不同则将map[i][j]的值输出到文本框,若玩家已经填过但错误那么将会被map[i][j]所覆盖。若没填过则将直接将map[i][j]的值输出,然后跳出循环。即每次只提示一个空位或错位。此算法所调用函数为:voidSudokuHint()。3.界面设计1)游戏区界面设计本游戏采用的是81个9×9的文本框组成。首先定义一个Block类。classBlock:publicQWidget{Q_OBJECTpublic:Block(QWidget*parent=0);voidchangeColor(constQColor&color);intdata();QPointgetPos();voidsetPos(constQPoint&p);voidsetPos(intx,inty);voidsetValue(inta);voidsetEna(boolok);privateslots:voiddataChange(constQString&data);private:QLineEdit*nubEidt;intda;QPointp;};在这个类中包括文本框的的一些基本属性,包括文本框的位置,颜色,值等等。文本框具体是通过MainWindow类里面的voidcreateBlocks()函数来实现。为了游戏的更好体验,再次定义了一个Gline类。Gline类是用来画线,画出六条纵横交错的线将81个小格分成9个3×3的格,可以让玩家更好的判断某一个空格属于哪个3×3的格子。classGLine:publicQWidget{public:GLine(QWidget*parent=0);4voidsetPen(intpenSize,constQColor&color);voiddraw(intz,intlen);///z=0H,z=1,Vprotected:voidpaintEvent(QPaintEvent*);private:intpenSize;QColorpenColor;intz;intlen;};2)功能区界面设计:功能区主要包括游戏菜单和按钮。菜单中包括对游戏的基本操作以及对游戏的介绍。菜单:a)开始游戏开始游戏中分为四个难度的选择:简单,一般,困难,特难。这四个操作分别调用MainWindow中的槽函数:voidSudokuClear1(),voidSudokuClear2(),voidSudokuClear3(),voidSudokuClear4()。b)重玩本局调用MainWindow中的槽函数:voidSudokuReplay()。c)答案提示调用MainWindow中的槽函数:voidSudokuReplay()。d)查看答案调用MainWindow中的槽函数:voidSudokuHint()。e)退出游戏调用close()函数。帮助:a)游戏技巧介绍游戏的几种基本解题方法,为玩家提供参考。调用函数:voidSudokuSkill()b)关于对游戏基本介绍。调用函数:voidSudokuAbout()备注:为了游戏的更好体验我将菜单中的各个操作设置了相对应的按钮,其功能不变在次不作特别说明。5五、调试与测试1.游戏界面展示2.帮助界面图1.1游戏主界面图1.2技巧介绍界面63.开始游戏界面4.答案提示界面图1.3游戏介绍界面图1.4开始游戏界面75.查看答案界面图1.5答案提示界面图1.6查看答案界面86.重玩界面7.判断界面图1.7重玩界面图1.8判断界面98.遇到的问题问题:当进入系统后直接点击答案提示,重玩本局,查看答案时系统会崩溃。解决方法