C++实习课程论文范例.docx
- 文档编号:30410226
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:79
- 大小:1.46MB
C++实习课程论文范例.docx
《C++实习课程论文范例.docx》由会员分享,可在线阅读,更多相关《C++实习课程论文范例.docx(79页珍藏版)》请在冰豆网上搜索。
C++实习课程论文范例
西北农林科技大学信息工程学院
C++面向对象实习报告
题目:
数独游戏的设计与实现
学号
2010012863
姓名
徐兵
专业班级
计算机科学与技术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)游戏对话框的各个功能的详细介绍:
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)自动求解的代码实现过程:
34
(4)确认完成的代码实现过程:
36
(5)显示与回显的代码实现过程:
39
一、综合训练目的与要求
(1)综合训练目的:
能够熟练运用MicrosoftVisualC++6.0编译和调试程序;
通过此次实习,在对上一学期C++知识巩固提高的同时,也要对以前为学好或是未学到的C++知识加以学习并且熟练运用;
在以前MFC编程的基础上,进一步的学习和了解MFC的知识,尤其是对界面的设计,以及各类消息函数的了解,从而为程序的界面设计和功能实现铺好道路,降低难度。
(2)综合训练要求:
在实习期间,每天要按时到达实习地点,尽量不迟到或是早退,并且到了之后应该尽快进入状态,抓紧时间;
在两周的实习之中,自己应该做好安排和计划,知道在每个时间段应该做些什么,最重要的是一定要在每个时间段内,提前或是按时完成自己规定的任务,以便为以后的任务留下充足时间;
在设计界面与编程阶段要有耐心,细心,认真完成每一模块的制作,并且细心的发现问题,解决问题,最后完成设计,做出令自己满意的成果。
二、综合训练任务
(1)采用面向对象的思想设计设计一个CSudoku类用于求解数独,进而完成数独游戏的设计与实现;
(2)编译并调试程序,不断的发现问题,并且解决问题,使数独的各种功能都能够完全实现,最后使程序尽量少一些缺陷。
三、总体设计
(1)数独游戏采用了一种小型系统的设计方法,所有的程序都依附在了两个对话框中,一个是用户界面对话框,即主对话框,另一个是游戏界面对话框;
(2)在主对话框中,有进入游戏、游戏说明,版本信息,作者简介,以及退出系统等五个按钮,每个按钮中都各自有相对应的消息响应函数和功能;
(3)在游戏界面中,分为游戏区和功能区,游戏区即是一个大的九宫格,功能区主要集中了数独游戏最精华的部分,有难易选择、新游戏、自动求解、确认完成,退出游戏等主要功能。
四、详细设计说明
(1)主对话框中的各个功能的详细介绍:
进入游戏
含义:
即是主对话框与游戏对话框相互转换的接口;
函数实现:
voidCLianxiDlg:
:
OnEntrance()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
GameDialogdgs;
dgs.DoModal();
}
游戏说明
含义:
主要是介绍数独游戏的起源、游戏规则以及游戏技巧,以方初学用户快速的掌握和了解游戏,体验到数独的精妙之处;
函数实现:
voidCLianxiDlg:
:
OnGamerule()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
GameInstructiongps;
gps.DoModal();
}
版本信息
含义:
初略的说明游戏的名称,完成时间,以及制作的版次
函数实现:
voidCLianxiDlg:
:
OnCopyright()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CAboutDlgcps;
cps.DoModal();
}
作者简介
内容:
介绍了作者的相关信息,并附上了一幅自制的照片,已满足一下自己小小的虚荣心吧!
函数实现:
voidCLianxiDlg:
:
OnAuthor()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
AuthorDlglps;
lps.DoModal();
//MessageBox("要提示的内容","消息标题",MB_ICONINFORMATION|MB_YESNO);//MessageBoxprofile
}
退出系统
特色:
与普通的退出功能不一样的是在点击了此按钮后会自动弹出一个询问对话框,这样可以有效的防止用户误操作而退出了系统
函数实现:
voidCLianxiDlg:
:
OnCancel()
{
//TODO:
Addextracleanuphere
if(MessageBox("您确定要退出系统吗?
","温馨提示",MB_ICONQUESTION|MB_YESNO)==IDYES)
{
CDialog:
:
OnCancel();
}
/*if(AfxMessageBox("您确定要退出系统吗?
",MB_YESNO|MB_ICONQUESTION)==IDYES)
{
CDialog:
:
OnCancel();
}
*///Thisisthesecondwaytodoinformation
//CDialog:
:
OnCancel();
}
(2)游戏对话框的各个功能的详细介绍:
游戏区
含义及内容:
游戏区是用户与计算机交互的最直接,也是最频繁的地方,设计时采用了9*9个可编辑文本框按ID顺序依次的排列成了一个正方形。
并且游戏的难易程度设定了四个级别:
简单、中等、困难、用户自定义,以方便不同水平的用户都能够找到能够挑战一下的游戏。
在程序内部是采用了一个a[9][9]的二位数组与81个可编辑文本相对应而进行操作。
当用户点击新游戏时,系统会用已设定好的算法从8个文件中随机的选择一个读取到a[9][9]这个数组中,然后通过显示函数将a[9][9]中的每一个数付给81个文本框中,并且显示给用户。
如果数组付给文本框的数是0的话,那么所对应的文本框就不进行显示,并且将文本框设为可编辑状态;反之这将文本框设为不可编辑状态;这样就可以方便用户填写数的同时也能够避免用户由于误操作而将系统自动生成的非零数修改,造成程序运行出错。
当用户填写数独完成,点击确认完成之后,首先,在确认完成的消息响应函数中,系统会调用回显函数,将用户在文本框中所填写的数据按照对应顺序付给数组a[i][j],从而方便系统接收到用户填写的数据。
之后系统会调用已经编写好的判断函数,对大九宫格(即a[9][9])中的每一行、每一列,每一个小九宫格进行判断。
从而向用户输出相应的信息,提示用户解答的是否正确。
在数独设计时的一个新的特色就是,新增加了一项“自动求解”的功能。
有了这项功能以后,一方面当用户在某一局游戏苦思良久也未能解出时,可以随时的提供正确答案未用户答疑解惑,另一方面也能够体现计算机厉害之处,体现出科技助人的力量。
在退出游戏时也采用了与主窗口类似的做法,对用户的操作进行确认,避免用户的误操作。
函数实现:
详见核心代码清单;
主要算法讲解:
1、
算法名称:
判断用户所填写的数是否符合数独游戏的规则;
算法函数:
intGameDialog:
:
Judge(intvalue1,introw,intcol)
应用算法的按钮:
确认完成
算法思路:
当用户填写完所有的空格时后,点击确认完成后我们就需要对用户填写的所有数进行判断;判断时不是所有数一起判断的,而是一个一个的进行判断;例如:
用户填了7(5.,3)这个数,首先我们要对第五行进行检测,将第五行的出7本身外的所有数都与7做比较,如果有相等的,则返回false;同理对第三列的所有数也用此法进行判断,返回相应值;之后将7(5,3)的横众坐标都与3求余,之后我们会发现在大的九宫格中,前三行的横坐标都为0,中间三行的横坐标都为1,最后三行的横坐标都为2;前三列的纵坐标都为0,中间三行的纵坐标都为1,最后三列的纵坐标都为2;所以我们就可以通过这种方法确定出7(5,3)所在的小九宫格的位置了,之后在小九宫格中用小九宫格中除7本身外的所有数与7做比较,如果有相等的就返回false,没有相等的就返回true;最后我们就可以通过函数的返回值判定用户所填写的数字7是否符合数独游戏的规则了;同理我们就可里利用这种方法对用户填写的所有数字进行逐一的判断了。
由于每次生成游戏时的空格数是不固定的,所以没次用Judge()函数进行判断后返回的true或false的个数也是不固定的,所以我们可以对整个大的九宫格整体做判断,这样虽然有的判断是不必要的,但是如果用户填对所有的空,判断后就会有81个true返回,这样我们就可以通过看是否有81个true来判断用户是否完全填对了;这就是我所设计的数独算法了,下面介绍一下算法的主要实现代码,方便理解算法;
算法实现:
intGameDialog:
:
Judge(intvalue1,introw,intcol)
{
intdown_row,down_col,up_row,up_col;
for(down_row=0;down_row { if(value1==a[down_row][col])return0; } for(up_row=8;up_row>row;up_row--)//判断方格向下的格子 { if(value1==a[up_row][col])return0; } for(down_col=0;down_col { if(value1==a[row][down_col])return0; } for(up_col=8;up_col>col;up_col--)//判断方格向右的格子 { if(value1==a[row][up_col])return0; } inta_row=row/3,b_row=row%3,a_col=col/3,b_col=col%3;//用于记录当前格子所在的小九宫格的位置 intmini_row,mini_col; switch(a_row) { case0: //这个大九宫格在最上三行 switch(a_col) { case0: //这个大九宫格在最前三列 for(mini_row=0;mini_row<3;mini_row++) { for(mini_col=0;mini_col<3;mini_col++) if(a[mini_row][mini_col]! =a[row][col]) { if(value1==a[mini_row][mini_col])return0; } } break; case1: //这个大九宫格在中间三列 for(mini_row=0;mini_row<3;mini_row++) { for(mini_col=3;mini_col<6;mini_col++) if(a[mini_row][mini_col]! =a[row][col]) { if(value1==a[mini_row][mini_col])return0; } } break; case2: //这个大九宫格在最后三列 for(mini_row=0;mini_row<3;mini_row++) { for(mini_col=6;mini_col<9;mini_col++) if(a[mini_row][mini_col]! =a[row][col]) { if(value1==a[mini_row][mini_col])return0; } } break; } break; case1: //这个大九宫格在中间三行 switch(a_col) { case0: //这个大九宫格在最前三列 for(mini_row=3;mini_row<6;mini_row++) { for(mini_col=0;mini_col<3;mini_col++) if(a[mini_row][mini_col]! =a[row][col]) { if(value1==a[mini_row][mini_col])return0; } } break; case1: //这个大九宫格在中间三列 for(mini_row=3;mini_row<6;mini_row++) { for(mini_col=3;mini_col<6;mini_col++) if(a[mini_row][mini_col]! =a[row][col]) { if(value1==a[mini_row][mini_col])return0; } } break; case2: //这个大九宫格在最后三列 for(mini_row=3;mini_row<6;mini_row++) { for(mini_col=6;mini_col<9;mini_col++) if(a[mini_row][mini_col]! =a[row][col]) { if(value1==a[mini_row][mini_col])return0; } } break; } break; case2: //这个大九宫格在最下三行 switch(a_col) { case0: //这个大九宫格在最前三列 for(mini_row=6;mini_row<9;mini_row++) { for(mini_col=0;mini_col<3;mini_col++) if(a[mini_row][mini_col]! =a[row][col]) { if(value1==a[mini_row][mini_col])return0; } } break; case1: //这个大九宫格在中间三列 for(mini_row=6;mini_row<9;mini_row++) { for(mini_col=3;mini_col<6;mini_col++) if(a[mini_row][mini_col]! =a[row][col]) { if(value1==a[mini_row][mini_col])return0; } } break; case2: //这个大九宫格在最后三列 for(mini_row=6;mini_row<9;mini_row++) { for(mini_col=6;mini_col<9;mini_col++) if(a[mini_row][mini_col]! =a[row][col]) { if(value1==a[mini_row][mini_col])return0; } } break; } break; } return1; } 2、 算法名称: 自动求解; 算法函数: voidGameDialog: : OnAutoslove() 应用算法的按钮: 自动求解 算法思路: 由于数独是一个9*9的九宫格,而在每一个小格子里又可以填入1到9的这样九个数字,再加上不填数字是的0,那么就是十个数字,即是一个容量为十的小数组;所以我们可以在游戏对话框的类中定义一个三位数组b[9][9][10]用来记录和标记每一个小格子内输的变化。 当用户按下自动求解按钮后,首先我们将每个小格子数组中的第九位先设为一个数,不妨设为9;之后对每个单元格进行判断,如果单元个中的数大于零并且小于九的话,先将格子的第九为设为零,(即已经检查过了),之后在用标记函数del()(此函数的具体实现过程在核心代码清单中会给出具体的实现过程,在此暂且先给出自动求解函数的算法和实现过程)对此单元格进行检测标记;之后再对空格进行填值,并进行检测,填好空格。 并且在在整个函数中设置一个变量Count赋初值为零,判断非零格与有零格的同时都让Count++,如果Count加到了81,则说明所有的空格都已经填完整了;为了防止填空时出错,不妨将以上的过程多重复几次。 这就是自动求解算法的大致思想和核心步骤了。 下面介绍自动求解功能的具体实现代码; 算法实现: voidGameDialog: : OnAutoslove() { //TODO: Addyourcontrolnotificationhandlercodehere count=0; for(i=0;i<9;i++) { for(j=0;j<9;j++) { b[i][j][9]=9;//该位为标志位 } } intp=0,q=0; while (1) { for(i=0;i<9;i++) for(j=0;j<9;j++) if(b[i][j][9]! =0&&a[i][j]<10&&a[i][j]>0) { b[i][j][9]=0; count++; Del(i,j);//检测和标志函数,用于判断是否有与a[i][j]重复的数 } elseif(b[i][j][9]==1) { b[i][j][9]=0; for(m=0;m<9;m++) if(b[i][j][m]! =1) { a[i][j]=m+1; Del(i,j); count++; break; } } if(p==count) q++; else { p=count; q=0; } if(q>8) { MessageBox("对不起,您设定的数独有错误,请检查后再进行此操作! "); break; } if(count>=81) break; } Show();//显示自动求解后的数到81个文本框中; } (3)界面美化的具体实现过程: 各个对话框的背景 背景说明: 在每个对话框中,背景色都采用了深绿色,这样一方面给人一种清爽舒适的感觉,另一方面可以使81个文本框中的数字显得格外醒目、清楚,为用户的操作提供了方便; 实现方法: 在主对话框中的xxx.cpp文件的BOOLCLianxiApp: : InitInstance()函数中加入SetDialogBkColor(RGB(0,92,0),RGB(222,74,29));即可; 主对话框和作者简介中的照片 照片说明: 主对话框中采用了一张24位的位图数独照片,作者简介中采用了是一张24位真彩色的作者照片; 插入照片实现方法: 分别在主对话框和作者简介对话框中的voidCLianxiDlg: : OnPaint()和voidAuthor: : OnPaint()函数的else中去掉原来的CDialog: : OnPaint();然后再加入CPaintDCdc(this); CRectrect; GetClientRect(&rect); CDCdcMem; dcMem.CreateCompatibleDC(&dc); CBitmapbmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP4); //IDB_BITMAP是你自己的图对应的ID BITMAPbitmap; 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,bitmap.bmHeight,SRCCOPY); 即可插入自己想要插入的照片了。 五、调试与测试 (1)游戏的功能及界面展示: 主界面: 游戏说明: 版本信息: 作者简介: 退出系统: 游戏界面: 自动求解功能: 确认完成功能: (2)游戏测试: (3)遇到的问题及解决方法: 、问题: .在进入游戏界面后,如果直接点击新游戏,则会出现错误,如图所示: 解决方法: 在新游戏函数中,将简单这一档设为默认的难以选择档,并且设置一个标志flag=false;在点击一次新游戏后就将flag=true。 这样就可以解决这个问题了; 代码如下: intiRadio,Level; srand((unsignedint)time(NULL)); Level=rand()%2;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 实习 课程 论文 范例
![提示](https://static.bdocx.com/images/bang_tan.gif)