五子棋C++课设报告Word下载.docx
- 文档编号:16461707
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:53
- 大小:908.69KB
五子棋C++课设报告Word下载.docx
《五子棋C++课设报告Word下载.docx》由会员分享,可在线阅读,更多相关《五子棋C++课设报告Word下载.docx(53页珍藏版)》请在冰豆网上搜索。
3.2程序的性能分析...........................................35
3.3上机过程中出现的问题及解决方案...........................35
3.4程序可改进的地方说明.....................................36
3.5程序中可以扩充的功能及设计实现构想.......................36
四、用户手册....................................................36
五、设计总结.....................................................41六、参考文献.....................................................42
七、附录.........................................................42
一、需求分析
1.1选做五子棋课题的目的
现如今,我们生活在一个充满竞争的时代。
上班族为了完成公司业务,每天超负荷的工作;
学生为了不落后他人每天早起晚睡不断地学习,压力巨大。
为了缓解压力,使自己在工作、学习之余娱乐一下,活跃大脑,提高工作、学习效率,益智类游戏越来越受人们的关注和喜爱,五子棋作为益智类游戏之一,更是倍受人们的喜爱,所以程序员对于五子棋的开发也有了很多关注。
五子棋是一种两人对弈的纯策略型棋类游戏,棋具与围棋通用,是起源于中国古代的传统黑白棋种之一。
现代五子棋日文称之为“連珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(FiveinaRow的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;
它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;
它的棋文化源渊流长,具有东方的神秘和西方的直观;
既有“场”的概念,亦有“点”的连接。
它是中西文化的交流点,是古今哲理的结晶。
基于此文化背景以及我对五子棋的喜爱,在本次C++课程设计中我选择了五子棋游戏课题,通过此次课程设计,我希望能达到以下目的:
(1)最基本也是最重要的:
顺利完成课题要求,设计出五子棋游戏。
(2)通过实践加强对C++面向对象程序设计知识的理解和掌握,能更好的理解、掌握类的应用。
提高自己的综合运用能力、问题分析能力以及编程能力,养成良好的编程习惯。
(3)了解MFC,基本掌握用MFC开发程序的方法,学会用MFC开发出界面友好、实用可靠的Windows应用程序。
1.2程序实现的功能
经过两周的课程设计,最终较圆满的完成了课题要求,开发出了五子棋游戏程序,本五子棋游戏主要实现了以下功能:
(1)有开始游戏、重新开始、退出游戏等基本功能。
(2)游戏模式分为人人对战、人机对战以及电脑与电脑对战等三种模式。
(3)在人机对战模式中还可以选择不同的难度等级,共分为弱智级、入门级、成熟级、专业级和大师级等五个等级,玩家可根据实际情况选择不同的难度等级进行对弈。
(4)本游戏还有悔棋功能,让电脑给出下一步建议功能。
(5)人机对战时默认为玩家先走,此时可以选择换方选项让电脑先走。
(6)人人对战和人机对战时还可选择更改玩家姓名,让玩家输入自己的姓名。
(7)本游戏还有音效功能,默认为开启音效状态,此时玩家也可选择关闭音效。
本五子棋游戏目前只实现了上述功能,其他更多的功能有待在日后逐步添加。
二、设计内容
2.1设计要求
基本要求:
画出棋盘,实现人机对弈。
2.2设计思路
此次课程设计中,我采用的是MFC基于对话框来编写五子棋程序的。
所以主对话框类RenjuFDlg就是本程序的核心类,在该类中完成了初始化界面、在对弈过程中对棋盘的重绘以及基本功能的实现等,该类调用其他类最终实现了本五子棋游戏的所有功能。
由于五子棋游戏中,有相当的篇幅是算法的部分,无论是人机对弈、人人对弈还是电脑对弈都需要合理算法的支持,所以我把所有五子棋的算法封装在了FiveStoneProcess类中,该类主要完成了对弈过程中根据不同的难度等级选择不同的算法进行对弈的功能。
2.3功能模块图
2.4主程序及其主要模块的流程图
1.主程序流程图
2.人机对战模块流程图
3.OnLButtonDown(UINTnFlags,CPointpoint)函数流程图
2.5关键代码及说明
以下为本程序的主要函数代码及功能说明。
1.核心类RenjuDlg中的主要函数代码:
(1)OnInitDialog()函数:
用于初始化一些数据
BOOLCRenjuDlg:
:
OnInitDialog()
{
CDialog:
OnInitDialog();
//Add"
About..."
menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&
0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<
0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty()
{
pSysMenu->
AppendMenu(MF_SEPARATOR);
AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'
smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);
//Setbigicon
SetIcon(m_hIcon,FALSE);
//Setsmallicon
SetDlgItemText(IDC_Player1,_T("
玩家"
));
//初始化界面编辑框的内容
SetDlgItemText(IDC_Player2,_T("
一休哥"
bmp[0].LoadBitmap(IDB_GRADE1);
//加载位图
bmp[1].LoadBitmap(IDB_GRADE2);
bmp[2].LoadBitmap(IDB_GRADE3);
bmp[3].LoadBitmap(IDB_GRADE4);
bmp[4].LoadBitmap(IDB_GRADE5);
bmp[5].LoadBitmap(IDB_BLACK);
bmp[6].LoadBitmap(IDB_WHITE);
bmp[7].LoadBitmap(IDB_BLACK2);
bmp[8].LoadBitmap(IDB_WHIRE2);
bmp[9].LoadBitmap(IDB_CVSC);
bmp[10].LoadBitmap(IDB_Renren);
CBitmapbmp;
bmp.LoadBitmap(IDB_TABLE);
m_brush=CreatePatternBrush((HBITMAP)bmp);
bmp.DeleteObject();
thiswnd=this->
GetSafeHwnd();
thisdlg=this;
OnGrade3();
OnStart();
//TODO:
Addextrainitializationhere
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
}
(2)OnPaint()函数:
此函数为该类最重要的函数之一,主要用于在游戏过程中对棋盘的重绘以及对游戏界面的重绘,同时还调用其他函数来判断当前局面的输赢状况等。
voidCRenjuDlg:
OnPaint()
if(IsIconic())
CPaintDCdc(this);
//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&
rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
else
CDCdcmem;
BITMAPbm;
dcmem.CreateCompatibleDC(&
dc);
if(is_cvsc)
{//电脑对战
dcmem.SelectObject(&
bmp[9]);
GetObject(bmp[9],sizeof(BITMAP),(LPVOID)&
bm);
//在界面相应的位置插入位图
dc.BitBlt(446,60,bm.bmWidth,bm.bmHeight,&
dcmem,0,0,SRCCOPY);
switch(firstgrade)
{//根据先手电脑的等级在第一个编辑框中输入不同的文字
case1:
蜡笔小新"
break;
case2:
樱桃小丸子"
case3:
break;
case4:
功夫熊猫"
case5:
五子棋大师"
}
switch(secondgrade)
{//根据后手电脑的等级在第二个编辑框中输入不同的文字
elseif(m_renren)
{//人人对战
bmp[10]);
GetObject(bmp[10],sizeof(BITMAP),(LPVOID)&
//在相应位置插入相应位图
dc.BitBlt(445,60,bm.bmWidth,bm.bmHeight,&
//设置两个编辑框的内容
SetDlgItemText(IDC_Player1,name1);
SetDlgItemText(IDC_Player2,name2);
SetDlgItemText(IDC_Player1,name);
//设置第一个编辑框的内容
switch(grade)
{//根据当前电脑等级在对话框相应位置加载不同图片
//同时对第二个编辑框设置不同的内容
case1:
dcmem.SelectObject(&
bmp[0]);
//IDB_GRADE1
GetObject(bmp[0],sizeof(BITMAP),(LPVOID)&
dc.BitBlt(445,60,bm.bmWidth,bm.bmHeight,&
SetDlgItemText(IDC_Player2,_T("
break;
case2:
dcmem.SelectObject(&
bmp[1]);
//IDB_GRADE2
GetObject(bmp[1],sizeof(BITMAP),(LPVOID)&
dc.BitBlt(446,60,bm.bmWidth,bm.bmHeight,&
SetDlgItemText(IDC_Player2,_T("
case3:
bmp[2]);
//IDB_GRADE3
GetObject(bmp[2],sizeof(BITMAP),(LPVOID)&
case4:
bmp[3]);
//IDB_GRADE4
GetObject(bmp[3],sizeof(BITMAP),(LPVOID)&
dc.BitBlt(430,60,bm.bmWidth,bm.bmHeight,&
break;
case5:
bmp[4]);
//IDB_GRADE5
GetObject(bmp[4],sizeof(BITMAP),(LPVOID)&
for(inti=1;
i<
=15;
i++)//每下一颗棋子,都要重绘一次棋盘上的棋子
for(intj=1;
j<
j++)
inttempx,tempy;
//用于记录当前棋子该放的坐标
switch(points[i][j])
{
case1:
//黑色棋
GetObject(bmp[5],sizeof(BITMAP),(LPVOID)&
tempx=24*i-bm.bmWidth/2-5;
tempy=24*j-bm.bmHeight/2-5;
dcmem.SelectObject(&
bmp[5]);
dc.BitBlt(tempx+10,tempy+10,bm.bmWidth,bm.bmHeight,&
break;
case2:
//白色棋
GetObject(bmp[6],sizeof(BITMAP),(LPVOID)&
//"
white"
dcmem.SelectObject(&
bmp[6]);
dc.BitBlt(tempx+10,tempy+10,bm.bmWidth,bm.bmHeight,&
break;
case3:
//black2,表示机器刚走的黑子
GetObject(bmp[7],sizeof(BITMAP),(LPVOID)&
gray1"
bmp[7]);
dc.BitBlt(tempx+10,tempy+10,bm.bmWidth,bm.bmHeight,&
points[i][j]=1;
//变回正常色
case4:
//white2,表示机器刚走的白子
GetObject(bmp[8],sizeof(BITMAP),(LPVOID)&
gray2"
dcmem.SelectObject(&
bmp[8]);
points[i][j]=2;
//变回正常色
default:
}}
stop)
{
if(fivestone.has_tie())//平局
{SetWindowText("
动漫五子棋"
);
if(soundeffect)//开启音效,则播放相应的音乐
sndPlaySound("
IDR_WIN"
SND_RESOURCE|SND_ASYNC);
stop=true;
if(!
m_renren&
&
!
is_cvsc)//人机对战
MyMessageBox("
累死我了,终于平了!
"
elseif(m_renren)//人人对照
MyMessageBox("
看来真是棋逢对手,你们平了!
else
{//电脑对战
OnCvsc();
电脑黑棋和电脑白棋战平!
}
}
if(fivestone.has_five
(1))//黑棋连成五子,黑棋胜利
{SetWindowText("
//标志一局结束
if(first)
{//只有人机对战时,first才可能为真,此时表示计算机执黑子先下,则计算机胜利
if(soundeffect)
sndPlaySound("
IDR_LOST"
MyMessageBox("
你输了,不过别灰心,失败乃成功之母哦!
else
太厉害了,你赢了,再接再厉!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 C+ 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)