C++面向对象实习报告数独游戏的设计与实现.doc

上传人:laozhun 文档编号:2384438 上传时间:2023-02-17 格式:DOC 页数:59 大小:870.50KB
返回 下载 相关 举报
C++面向对象实习报告数独游戏的设计与实现.doc_第1页
第1页 / 共59页
C++面向对象实习报告数独游戏的设计与实现.doc_第2页
第2页 / 共59页
C++面向对象实习报告数独游戏的设计与实现.doc_第3页
第3页 / 共59页
C++面向对象实习报告数独游戏的设计与实现.doc_第4页
第4页 / 共59页
C++面向对象实习报告数独游戏的设计与实现.doc_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《C++面向对象实习报告数独游戏的设计与实现.doc》由会员分享,可在线阅读,更多相关《C++面向对象实习报告数独游戏的设计与实现.doc(59页珍藏版)》请在三一办公上搜索。

1、西北农林科技大学信息工程学院C+面向对象实习报告题 目:数独游戏的设计与实现 学 号姓 名专业班级计算机科学与技术103班指导教师实践日期2012年2月20日3月2日目 录一、综合训练目的与要求4(1)综合训练目的:4(2)综合训练要求:4二、综合训练任务4(1)采用面向对象的思想设计设计一个CSudoku类用于求解数独,进而完成数独游戏的设计与实现;4(2)编译并调试程序,不断的发现问题,并且解决问题,使数独的各种功能都能够完全实现,最后使程序尽量少一些缺陷。4三、总体设计4四、详细设计说明5(1)主对话框中的各个功能的详细介绍:5进入游戏5游戏说明5版本信息5作者简介5退出系统6(2)游戏

2、对话框的各个功能的详细介绍:6游戏区6函数实现:7主要算法讲解:7(3)界面美化的具体实现过程:12各个对话框的背景12主对话框和作者简介中的照片13五、调试与测试14(1)游戏的功能及界面展示:14(2)游戏测试:18(3)遇到的问题及解决方法:19、问题:19、问题21六、实习日志23(1)2月20日2月21日:23(2)2月22日2月24日:23(3)2月27日:23(4)2月28日2月29日:23(5)2月31日2月32日:23七、实习总结24八、附录:核心代码清单25(1)主对话框的建立以及各个子对话框的建立代码实现过程:25(2)新游戏功能的代码实现过程:30(3)自动求解的代码实

3、现过程:34(4)确认完成的代码实现过程:36(5)显示与回显的代码实现过程:39一、综合训练目的与要求(1)综合训练目的: 能够熟练运用Microsoft Visual C+ 6.0编译和调试程序;通过此次实习,在对上一学期C+知识巩固提高的同时,也要对以前为学好或是未学到的C+知识加以学习并且熟练运用; 在以前MFC编程的基础上,进一步的学习和了解MFC的知识,尤其是对界面的设计,以及各类消息函数的了解,从而为程序的界面设计和功能实现铺好道路,降低难度。(2)综合训练要求: 在实习期间,每天要按时到达实习地点,尽量不迟到或是早退,并且到了之后应该尽快进入状态,抓紧时间;在两周的实习之中,自

4、己应该做好安排和计划,知道在每个时间段应该做些什么,最重要的是一定要在每个时间段内,提前或是按时完成自己规定的任务,以便为以后的任务留下充足时间;在设计界面与编程阶段要有耐心,细心,认真完成每一模块的制作,并且细心的发现问题,解决问题,最后完成设计,做出令自己满意的成果。二、综合训练任务(1)采用面向对象的思想设计设计一个CSudoku类用于求解数独,进而完成数独游戏的设计与实现; (2)编译并调试程序,不断的发现问题,并且解决问题,使数独的各种功能都能够完全实现,最后使程序尽量少一些缺陷。三、总体设计(1)数独游戏采用了一种小型系统的设计方法,所有的程序都依附在了两个对话框中,一个是用户界面

5、对话框,即主对话框,另一个是游戏界面对话框;(2)在主对话框中,有进入游戏、游戏说明,版本信息,作者简介,以及退出系统等五个按钮,每个按钮中都各自有相对应的消息响应函数和功能;(3)在游戏界面中,分为游戏区和功能区,游戏区即是一个大的九宫格,功能区主要集中了数独游戏最精华的部分,有难易选择、新游戏、自动求解、确认完成,退出游戏等主要功能。四、详细设计说明(1)主对话框中的各个功能的详细介绍:进入游戏含义:即是主对话框与游戏对话框相互转换的接口;函数实现:void CLianxiDlg:OnEntrance() / TODO: Add your control notification hand

6、ler code hereGameDialog dgs;dgs.DoModal();游戏说明含义:主要是介绍数独游戏的起源、游戏规则以及游戏技巧,以方初学用户快速的掌握和了解游戏,体验到数独的精妙之处;函数实现:void CLianxiDlg:OnGamerule() / TODO: Add your control notification handler code hereGameInstruction gps;gps.DoModal();版本信息含义:初略的说明游戏的名称,完成时间,以及制作的版次函数实现:void CLianxiDlg:OnCopyright() / TODO: Add

7、 your control notification handler code hereCAboutDlg cps;cps.DoModal();作者简介内容:介绍了作者的相关信息,并附上了一幅自制的照片,已满足一下自己小小的虚荣心吧!函数实现:void CLianxiDlg:OnAuthor() / TODO: Add your control notification handler code here AuthorDlg lps; lps.DoModal(); /MessageBox( 要提示的内容 , 消息标题 ,MB_ICONINFORMATION|MB_YESNO); /Messag

8、eBox profile退出系统特色:与普通的退出功能不一样的是在点击了此按钮后会自动弹出一个询问对话框,这样可以有效的防止用户误操作而退出了系统函数实现:void CLianxiDlg:OnCancel() / TODO: Add extra cleanup here if( MessageBox( 您确定要退出系统吗 ? , 温馨提示,MB_ICONQUESTION|MB_YESNO) = IDYES) CDialog : OnCancel(); /*if (AfxMessageBox(您确定要退出系统吗?,MB_YESNO|MB_ICONQUESTION) = IDYES) CDialo

9、g:OnCancel( ); */This is the second way to do information/CDialog:OnCancel();(2)游戏对话框的各个功能的详细介绍:游戏区含义及内容:游戏区是用户与计算机交互的最直接,也是最频繁的地方,设计时采用了9*9个可编辑文本框按ID顺序依次的排列成了一个正方形。并且游戏的难易程度设定了四个级别:简单、中等、困难、用户自定义,以方便不同水平的用户都能够找到能够挑战一下的游戏。在程序内部是采用了一个a99的二位数组与81个可编辑文本相对应而进行操作。当用户点击新游戏时,系统会用已设定好的算法从8个文件中随机的选择一个读取到a99这

10、个数组中,然后通过显示函数将a99中的每一个数付给81个文本框中,并且显示给用户。如果数组付给文本框的数是0的话,那么所对应的文本框就不进行显示,并且将文本框设为可编辑状态;反之这将文本框设为不可编辑状态;这样就可以方便用户填写数的同时也能够避免用户由于误操作而将系统自动生成的非零数修改,造成程序运行出错。当用户填写数独完成,点击确认完成之后,首先,在确认完成的消息响应函数中,系统会调用回显函数,将用户在文本框中所填写的数据按照对应顺序付给数组aij,从而方便系统接收到用户填写的数据。之后系统会调用已经编写好的判断函数,对大九宫格(即a99)中的每一行、每一列,每一个小九宫格进行判断。从而向用

11、户输出相应的信息,提示用户解答的是否正确。在数独设计时的一个新的特色就是,新增加了一项“自动求解”的功能。有了这项功能以后,一方面当用户在某一局游戏苦思良久也未能解出时,可以随时的提供正确答案未用户答疑解惑,另一方面也能够体现计算机厉害之处,体现出科技助人的力量。在退出游戏时也采用了与主窗口类似的做法,对用户的操作进行确认,避免用户的误操作。函数实现:详见核心代码清单;主要算法讲解:1、算法名称:判断用户所填写的数是否符合数独游戏的规则;算法函数:int GameDialog:Judge(int value1,int row,int col)应用算法的按钮:确认完成算法思路:当用户填写完所有的

12、空格时后,点击确认完成后我们就需要对用户填写的所有数进行判断;判断时不是所有数一起判断的,而是一个一个的进行判断;例如:用户填了7(5.,3)这个数,首先我们要对第五行进行检测,将第五行的出7本身外的所有数都与7做比较,如果有相等的,则返回false;同理对第三列的所有数也用此法进行判断,返回相应值;之后将7(5,3)的横众坐标都与3求余,之后我们会发现在大的九宫格中,前三行的横坐标都为0,中间三行的横坐标都为1,最后三行的横坐标都为2;前三列的纵坐标都为0,中间三行的纵坐标都为1,最后三列的纵坐标都为2;所以我们就可以通过这种方法确定出7(5,3)所在的小九宫格的位置了,之后在小九宫格中用小

13、九宫格中除7本身外的所有数与7做比较,如果有相等的就返回false,没有相等的就返回true;最后我们就可以通过函数的返回值判定用户所填写的数字7是否符合数独游戏的规则了;同理我们就可里利用这种方法对用户填写的所有数字进行逐一的判断了。由于每次生成游戏时的空格数是不固定的,所以没次用Judge()函数进行判断后返回的true或false的个数也是不固定的,所以我们可以对整个大的九宫格整体做判断,这样虽然有的判断是不必要的,但是如果用户填对所有的空,判断后就会有81个true返回,这样我们就可以通过看是否有81个true 来判断用户是否完全填对了;这就是我所设计的数独算法了,下面介绍一下算法的主

14、要实现代码,方便理解算法;算法实现:int GameDialog:Judge(int value1,int row,int col)int down_row,down_col,up_row,up_col;for(down_row=0;down_rowrow;up_row-) /判断方格向下的格子if(value1=aup_rowcol) return 0;for(down_col=0;down_colcol;up_col-) /判断方格向右的格子if(value1=arowup_col) return 0;int a_row=row/3,b_row=row%3,a_col=col/3,b_co

15、l=col%3;/用于记录当前格子所在的小九宫格的位置int mini_row,mini_col;switch(a_row)case 0:/这个大九宫格在最上三行switch(a_col)case 0:/这个大九宫格在最前三列for(mini_row=0;mini_row3;mini_row+)for(mini_col=0;mini_col3;mini_col+)if(amini_rowmini_col!=arowcol)if(value1=amini_rowmini_col) return 0;break;case 1:/这个大九宫格在中间三列for(mini_row=0;mini_row3

16、;mini_row+)for(mini_col=3;mini_col6;mini_col+)if(amini_rowmini_col!=arowcol)if(value1=amini_rowmini_col) return 0;break;case 2:/这个大九宫格在最后三列for(mini_row=0;mini_row3;mini_row+)for(mini_col=6;mini_col9;mini_col+)if(amini_rowmini_col!=arowcol)if(value1=amini_rowmini_col) return 0;break;break;case 1:/这个大

17、九宫格在中间三行switch(a_col)case 0:/这个大九宫格在最前三列for(mini_row=3;mini_row6;mini_row+)for(mini_col=0;mini_col3;mini_col+)if(amini_rowmini_col!=arowcol)if(value1=amini_rowmini_col) return 0;break;case 1:/这个大九宫格在中间三列for(mini_row=3;mini_row6;mini_row+)for(mini_col=3;mini_col6;mini_col+)if(amini_rowmini_col!=arowc

18、ol)if(value1=amini_rowmini_col) return 0;break;case 2:/这个大九宫格在最后三列for(mini_row=3;mini_row6;mini_row+)for(mini_col=6;mini_col9;mini_col+)if(amini_rowmini_col!=arowcol)if(value1=amini_rowmini_col) return 0;break;break;case 2:/这个大九宫格在最下三行switch(a_col)case 0:/这个大九宫格在最前三列for(mini_row=6;mini_row9;mini_row

19、+)for(mini_col=0;mini_col3;mini_col+)if(amini_rowmini_col!=arowcol)if(value1=amini_rowmini_col) return 0;break;case 1:/这个大九宫格在中间三列for(mini_row=6;mini_row9;mini_row+)for(mini_col=3;mini_col6;mini_col+)if(amini_rowmini_col!=arowcol)if(value1=amini_rowmini_col) return 0;break;case 2:/这个大九宫格在最后三列for(min

20、i_row=6;mini_row9;mini_row+)for(mini_col=6;mini_col9;mini_col+)if(amini_rowmini_col!=arowcol)if(value1=amini_rowmini_col) return 0;break;break;return 1;2、算法名称:自动求解;算法函数:void GameDialog:OnAutoslove()应用算法的按钮:自动求解算法思路:由于数独是一个9*9的九宫格,而在每一个小格子里又可以填入1到9的这样九个数字,再加上不填数字是的0,那么就是十个数字,即是一个容量为十的小数组;所以我们可以在游戏对话框

21、的类中定义一个三位数组b9910用来记录和标记每一个小格子内输的变化。当用户按下自动求解按钮后,首先我们将每个小格子数组中的第九位先设为一个数,不妨设为9;之后对每个单元格进行判断,如果单元个中的数大于零并且小于九的话,先将格子的第九为设为零,(即已经检查过了),之后在用标记函数del( )(此函数的具体实现过程在核心代码清单中会给出具体的实现过程,在此暂且先给出自动求解函数的算法和实现过程)对此单元格进行检测标记;之后再对空格进行填值,并进行检测,填好空格。并且在在整个函数中设置一个变量Count赋初值为零,判断非零格与有零格的同时都让Count+,如果Count加到了81,则说明所有的空格

22、都已经填完整了;为了防止填空时出错,不妨将以上的过程多重复几次。这就是自动求解算法的大致思想和核心步骤了。下面介绍自动求解功能的具体实现代码;算法实现:void GameDialog:OnAutoslove() / TODO: Add your control notification handler code herecount=0;for(i=0;i9;i+)for(j=0;j9;j+)bij9=9;/该位为标志位int p = 0,q = 0;while(1)for(i=0;i9;i+)for(j=0;j9;j+)if(bij9!=0&aij0)bij9=0;count+;Del(i,j

23、);/检测和标志函数,用于判断是否有与aij重复的数else if(bij9=1)bij9=0;for(m=0;m8)MessageBox(对不起,您设定的数独有错误,请检查后再进行此操作!);break;if(count=81)break;Show();/显示自动求解后的数到81个文本框中;(3)界面美化的具体实现过程:各个对话框的背景背景说明: 在每个对话框中,背景色都采用了深绿色,这样一方面给人一种清爽舒适的感觉,另一方面可以使81个文本框中的数字显得格外醒目、清楚,为用户的操作提供了方便;实现方法: 在主对话框中的xxx.cpp文件的BOOL CLianxiApp:InitInstan

24、ce()函数中加入SetDialogBkColor(RGB(0,92,0),RGB(222,74,29);即可;主对话框和作者简介中的照片照片说明:主对话框中采用了一张24位的位图数独照片,作者简介中采用了是一张24位真彩色的作者照片;插入照片实现方法:分别在主对话框和作者简介对话框中的void CLianxiDlg:OnPaint()和 void Author : OnPaint( )函数的else 中去掉原来的CDialog:OnPaint();然后再加入 CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcM

25、em.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP4); /IDB_BITMAP是你自己的图对应的ID BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width()*2/3,rect.Height(),&dcMem,0,0, bitmap.bmWidth*4/5,bitma

26、p.bmHeight,SRCCOPY); 即可插入自己想要插入的照片了。五、调试与测试(1)游戏的功能及界面展示:主界面:图5.1 游戏的主界面图游戏说明:图5.2 游戏的说明图版本信息:作者简介:图5.3 作者简介退出系统:图5.4 退出系统提示游戏界面:图5.5 游戏主界面图自动求解功能:图5.6 自动求解功能确认完成功能:图5.7 确认完成(2)游戏测试:图5.8 游戏测试 1图5.9 游戏测试2(3)遇到的问题及解决方法:、问题:.在进入游戏界面后,如果直接点击新游戏,则会出现错误,如图 所示:图6.1 问题1解决方法:在新游戏函数中,将简单这一档设为默认的难以选择档,并且设置一个标志

27、flag = false;在点击一次新游戏后就将flag = true。这样就可以解决这个问题了;代码如下:int iRadio, Level; srand (unsigned int)time(NULL); Level = rand()%2; if(!flag)(CButton*)GetDlgItem(IDC_RADIO1)-SetCheck(1); flag = true;、问题当用户填写完成点了确认完成之后,由于没有将文本框中的数按顺序赋值给数组a,所以即使用户正确的填写完成了所有的空后,程序仍然会显示出错误的提示信息。如图 :图6.2 问题2解决方案:使用一个回显函数Reshow(),

28、并在此函数中使用aij =GetDlgItemInt(IDC_EDITx);将文本中的每一个数都再反过来付给数组即可以了;其中Reshow()函数的具体实现详见核心代码清单。正确的如下图:图6.3 问题2得以解决六、实习日志(1)2月20日2月21日:通过网络和各类书籍了解有关数独的相关知识,熟悉数独的游戏规则以及主要算法;(2)2月22日2月24日:下载有关MFC的相关资料,并且在尽量在最短的时间内学会一些基本知识,例如如何生成对话框,为按钮添加消息函数等;(3)2月27日:在VC6.0中设计出游戏所需要的各种对话框,以及相应按钮,并且为按钮添加消息响应函数;(4)2月28日2月29日:为各

29、种消息相应函数实现其功能,重点是实现数独的求解算法和判定算法;(5)2月31日2月32日:完成实施计划书和课程论文以及PPT的制作,并且为课程答辩做好相关的准备。七、实习总结经过一学期的学习和这几天的实习,学生觉得收获颇丰。虽然要在很短的时间里学完很厚的一本书,上课也很快,但老师教学很有方法,通过课前提问督促大家预习、复习,所以感觉C+还算学懂了。在这里先对这一学期学习C+的学习方法,学习习惯.等做一总结,或许对将来的学习会很有用处。其实这学习方法和学习习惯是一回事,好的学习习惯就是最好的学习方法,好的学习方法一定包括有好的学习习惯。我以前只有课前预习的习惯,这学期在老师课前提问的督促下我才养

30、成了复习的习惯。而且复习还不能只复习一遍,课后课前都必须复习一遍,课后不复习很快就忘了,即便是课后复习了但到了下次课时也忘得差不多了,所以课前又得复习一遍,这样才能记住,上课才能回答上老师提的问题。这样一开始就打下了比较好的基础,有了好的基础才不会影响后面的学习,而且还能取得事半功倍的效果,这样就会越学越简单,越学越轻松,越学越想学。从对C+的学习我知道了对任何新科目的学习就要在刚开始时多下功夫,首先要把基础打好,这样后面的才能学懂。一般情况下前面的部分会比后面的简单,前面的都没学好或没学懂,那后面的就不用说了。平时上机练习只要用到循环都用的是for循环,基本没用过while和do-while

31、,不能说对这两个循环不熟悉,就是因为从来没调试过,就不知道从一开始记的就是错的,而且越记越熟悉,复习了很多次都没发现错误,所以理所因当得把它当成了“真理”。这次期末考试中遇到了一个找语法错误的题,其中就有while和do-while结构,我就没把它找出来,因为我首先就把正确答案排除了。我的收获就是学习C+就没有什么是真理,只有编译系统才是真理,只要编译系统不认可理论再正确也无济于事。这一点在这次C+实习中体现得淋漓尽致,后面对实习的总结中还会提到,这里便不多说了。还有一些收获来自这几天的实习,对于实习的感觉很复杂,可以用“酸甜苦辣”四个字来形容。在程序构思阶段感觉是酸的,但酸中有甜;构思好算法

32、后具体编写程序的过程和程序最后运行的时候是甜的, 又甜中带酸;而程序调试的过程和反复数据输入的过程就是苦的辣的。每次调试的时候看着那几十行不知所云的错误我真是欲哭无泪。还有那几百行的数据输入,输入一次两次还能忍受,但要很多次的反复输入实在是让人枯燥得恶心。还有一点不得不提,这次实习其实程序我很早就编好了,但是遇到一个莫名其妙的问题,让我调试几天都不知道是什么原因。还好老师经验丰富,找到哪里出错了。并且在不知道为什么出错的情况下还能把它改正确了,实在是太厉害了,佩服!佩服!看来调试程序还不能光靠理论,经验还是很重要的。从这次实习中我知道了编程序、调试程序必须要得有耐心,越是着急越是写不出来、调试

33、不出来。感想就到此为止,其实呢我感想很多,但现在就先说这些吧,希望以后还有机会与老师当面交流。最后再次感谢老师半年来的传授、指导、帮助,学生铭记在心。八、附录:核心代码清单(1)主对话框的建立以及各个子对话框的建立代码实现过程: / LianxiDlg.cpp : implementation file/#include stdafx.h#include Lianxi.h#include LianxiDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif#inclu

34、de GameDialog.h#include GameInstruction.h#include AuthorDlg.h/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:v

35、irtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoData

36、Exchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CLianxiDlg dialogCLianxiDlg:CLianxiDlg(CWnd* pParent /*=NULL*/): CDialog(CLianxiDlg:IDD, pParent)/AFX_DATA_INIT(CLianxiDlg)/ NOTE: the Cl

37、assWizard will add member initialization here/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDI_ICON1);void CLianxiDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CLianxiDlg)/ NOTE: the ClassWizard w

38、ill add DDX and DDV calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CLianxiDlg, CDialog)/AFX_MSG_MAP(CLianxiDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_ENTRANCE, OnEntrance)ON_BN_CLICKED(IDC_GAMERULE, OnGamerule)ON_BN_CLICKED(IDC_COPYRIGHT, OnCopyright)ON_BN_CLICKED(IDC_AUTHOR, OnAuthor)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CLianxiDlg message handlersBOOL CLianxiDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSE

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号