C++课程设计论文五子棋文档格式.docx
《C++课程设计论文五子棋文档格式.docx》由会员分享,可在线阅读,更多相关《C++课程设计论文五子棋文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
指导教师签字:
年月日
目录
第1章课程设计目的与要求1
1.1课程设计目的1
1.2课程设计的实验环境1
1.3课程设计的预备知识1
1.4课程设计要求1
第2章课程设计内容2
2.1C++语言程序设计2
2.1.1功能分析2
2.1.2算法设计及程序设计中技术重点3
2.1.3评分标准的算法3
2.2程序框图及流程图或UML类图5
2.3程序源代码7
第3章课程设计总结11
参考文献12
第1章课程设计目的与要求
1.1课程设计目的
将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。
通过课程设计,学生在下述各方面的能力应该得到锻炼:
(1)进一步巩固、加深学生所学专业课程《C++语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握面向对象程序设计的方法。
(6)熟练掌握C++语言的基本语法,灵活运用各种数据类型。
(7)进一步掌握在集成环境下如何调试程序(单步调试,设置断点、观察表达式,分块调试)和修改程序。
1.2课程设计的实验环境
硬件要求能运行Windows操作系统的微机系统。
C++语言应用程序开发软件使用:
VC++系统,或其他C++语言应用程序开发软件。
1.3课程设计的预备知识
熟悉C++语言程序设计的基本知识及VC++编辑器的使用方法。
1.4课程设计要求
1.运用面向对象程序设计思想与方法,分析设计题目,构造数据模型,描绘数据流图、UML图,编写程序代码。
2.积极上机调试源程序,增强编程技巧与调程能力。
3.认真书写课程设计预习报告,课程设计说明书。
4.遵守课程设计要求和机房管理制度,服从指导教师的安排,确保课程设计的顺利完成课程设计内容
第2章课程设计内容
2.1C++语言程序设计
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;
它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;
它的棋文化源渊流长,具有东方的神秘和西方的直观;
既有“场”的概念,亦有“点”的连接。
它是中西文化的交流点,是古今哲理的结晶。
本程序就是一款简单的五子棋小游戏,方便在大家休闲的时候进行消遣。
2.1.1功能分析
五子棋游戏的规则
(一)棋盘,棋子
1.棋盘为十五路,正中一点为“天元”,周围四点为小星。
2.棋子分黑白两色,黑子113枚,白子112枚,共225枚。
(二)比赛规则
1.黑先白后,从天元开始落子。
然后执白棋的一方在黑棋周围的交叉点上落子,白第二着棋应布在自己河界的一侧。
此后,执黑方在以天元为中心的25个交叉点的范围内布盘面的第三着棋。
2.最先在横向,竖向,斜向形成连续的相同色五个棋子的一方为胜。
3.黑棋禁手判负,白棋无禁手。
黑棋禁手包括“三三”,“四四”,“长连”。
黑方只能“四三”胜。
所谓禁手,是指黑方一子落下同时形成两个或两个以上的活三,冲四及长连禁手。
长连禁手是指黑方形成六个或六个以上的连续棋子。
4.双方均不能形成五连为和棋。
5.对局中拔子,中途退场均判为负。
6.五连与禁手同时形成,先五为胜。
因黑方已形成五连,故禁手失效,黑方胜。
7.黑方禁手形成时,白方应立即指出禁手点,黑方即负。
若白方继续应子,则黑方禁手不成立。
8.高段位职业比赛的特殊规定:
“三手可交换”:
黑下完第2手,执白者可提出交换。
即执白方变为执黑方。
“五手两打法”:
执黑下第五手时,必须下两手棋,执白者从这两手棋中任选一步。
本程序中涉及到的类的说明:
网络控制部分:
CServerSocket、CClientSocket和CMessg。
CServerSocket类是一个专门用来监听客户端连接的Socket类,它继承于CSocket,相应OnAccept消息。
在ServerSocket.cpp中,其中成员函数Init负责初始化ServerSocket,而OnAccept函数负责接收客户端连接。
CClientSocket类是一个专门用做会话的类,它负责数据的发送和接收。
它继承自CSocket,负责响应OnReceive和OnClose消息。
另外,作为CSocket类的继承类,理所当然的采用了串行化的方式来处理网络数据。
网络数据是由CMessg的对象构成的。
另外,在CClientSocket类中还定义了几个静态函数,它们用来得到本机的名字和本机的IP地址。
CMessg类是一个数据类,它继承于CObject。
在这个程序中,让CMessg类发挥串行化数据的作用。
规则方面类:
Match类
每一种游戏都有一定的规则,Match类正是五子棋的规则处理类。
在Match类中保存着一个当前的棋盘,它是一个二维的数组intchessboard[LW][LW]。
如果chessboard[x][y]为0,则表示(X,Y)的位置上没有棋子;
如果chessboard[x][y]为1,表示该位子有黑子;
如果chessboard[x][y]为2,则表示该位子上有白子。
试图方面类FiveChessView类:
FiveChessView是程序的主视图类。
它负责在主窗体中绘制棋盘和棋子,显示聊天的内容,负责对鼠标消息进行处理等。
2.1.2算法设计及程序设计中技术重点
棋类游戏中人工智能设计的工作量和算法的复杂度是成正比,优秀的算法需要尽可能避免额外的计算时间开销并有效的使用内存资源。
事实上,五子棋游戏水平的高低主要在于能够计算后步路数的多少,也就是常说的算了几步。
如果电脑具有这种能力,就不会掉入玩家设下的陷阱,这也是初学者常犯的错误,目光短浅,只看到眼前一步。
所以,棋类算法设计的任务就是既拥有高水平的算法,又能拥有最快的计算速度。
从电脑的“思考”角度来看问题,如何让电脑知道该落子在哪一点呢,在这方面,电脑要做得和人一样,判断棋盘上每一点的重要度,比如冲四比冲三强,冲三比冲二强,遇到四三如果是对方的,堵死,如果是自己的,优先落子。
遇到双三,如果是黑棋,黑方输,如果是白棋,优先等级仅次于四三。
五子棋的行走算法采用了博弈树的方法,它需要应用剪枝和最大最小树原理进行搜索,从而发现最好的下子位置。
2.1.3评分标准的算法
算法需要设计一个简单的规则来表示当前棋面的分数,基本的规则如下:
1.判断是否能成5,如果是机器方面的话给予N1分,如果是人的话给予-N1分;
2.判断是否能成活4或者是双死4或者是死4活3,如果是机器方的话给予N2分,如果是人的话给予-N2分。
3.判断是否以成双活3,如果是机器方的话给予N3分,如果是人的话给予-N3分;
4.判断是否成死3活3,如果是机器方的话给予N4分,如果是人的话给予-N4分;
5.判断是否成死4,如果是机器方的话给予N5分,如果是人的话给予-N5分;
6.判断是否成单活3,如果是机器方的话给予N6分,如果是人的话给予-N6分;
7.判断是否成双活2,如果是机器方的话给予N7分,如果是人的话给予-N7分;
8.判断是否成死3,如果是机器方的话给予N8分,如果是人的话给予-N8分;
9.判断是否成双活2,如果是机器方的话给予N9分,如果是人的话给予-N9分;
10.判断是否成活2,如果是机器方的话给予N10分,如果是人的话给予-N10分;
11.判断是否成死2,如果是机器方的话给予N11分,如果是人的话给予-N11分;
通常N1=N2>
N3>
N4>
N5>
N6>
N7>
N8>
N9>
N10>
N11。
有了具体分数的定义,就可以顺利地给当前的对局双方打分。
在实际运行的时候,用户可以调整规则和具体的评分标准。
判断胜负:
胜负是要根据当前最后一个落子的情况来判定的。
实际上算法需要从8个方向判断,用户可以调整规矩和具体的评分标准。
搜索算法实现描述
下面的核心算法中的变量currentBoardSituation表示当前机器最新的盘面情况,CountList表示第一层子节点可以选择的较好的盘面的集合。
核心算法如下:
VoidMainDealFunction()
{value=-MAXINT;
calSeveralGoodplace(currentBoardSituation,countList);
该函数实根据当前的盘面情况来比较得到比较好的可以考虑的几个盘面的情况,可以根据实际的得分情况选取分数比较高的几个盘面,也就是说在第一层节点选择的时候采用贪婪算法,直接找出相对分数比较高的几个点形成第一层节点,目的是为了提高搜索速度和防止堆栈溢出。
pos=CountList.GetHeadPosition();
CScoreTable*pBoard;
For(i=0;
i<
CountList.Getcount();
i++);
{pBoard=CountList.GetNext(pos);
pBoard->
value=Search(pBoard,min,value,0);
value=Select(Value,pBoard->
value,max);
}
for(i=0;
CountList.GetNext();
i++)
{pBoard=CountList.GETnext(pos);
if(value==pBoard->
value)
{currentBoardSituation=pBoard;
playerMode=min;
Break;
}}
实际上核心的算法是一个剪枝过程,搜索过程中相关的4个参数为:
当前棋局情况、当前的下子方、父节点的值oldValue和当前的搜索深度depth。
DoubleSearch(CScoreTable&
board,intmode,doubleoldvalue,intdepth)
{CList<
op,op>
m_DeepList;
If(depth<
MAX_DEPTH&
&
goal(board)==0)
{if(mode=max)
Value=-MAXINT;
Elsevalue=MAXINT
GetSeveralGoodPlace(m_DeepList);
m_Deeplist.GetCount();
i++
{if(((mode==max&
value<
oldvalue)||(mode==min&
value>
oldvalue))==TRUE)
Value=select(value,search(successorBoard,min,value,depth+1),max);
Elsevalue=select(value,search(successorboard.max,value,depth+1)
}}returnvalue;
}else{if(goal(board)<
>
0)
Returngoal(board);
Elsereturnevlation(board);
2.2程序框图及流程图或UML类图
就攻击和防守都做出判断,而将可能走子后的盘面交由番局函数做出评估,评估后的最佳走法传回给系统。
对防守来说,防守的走子或是是否要防守都得考虑进去,当对方有活3产生时,因为有两个方法可以阻挡,且自身一直是以死4的攻击是,说不定不用对对方的活3做防守,因此我们也要对防守的走子步骤做番局评估,如下图。
用来管理人机对弈/网络对弈两种游戏模式,类名为CGame,CGame是一个抽象类,经由它派生出一人游戏类COneGame和网络游戏类CTwoGame,如下图。
软件的总体架构图,如下图
网络对弈流程图,如下图:
UML类图(CMessg)
2.3程序源代码
#include"
stdafx.h"
FiveChess.h"
MainFrm.h"
FiveChessDoc.h"
FiveChessView.h"
afxsock.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
CFiveChessApp
BEGIN_MESSAGE_MAP(CFiveChessApp,CWinApp)//{{AFX_MSG_MAP(CFiveChessApp)
ON_COMMAND(ID_APP_ABOUT,OnAppAbout)NOTE-theClassWizardwilladdandremovemappingmacroshere.
DONOTEDITwhatyouseeintheseblocksofgeneratedcode!
}}AFX_MSG_MAP
Standardfilebaseddocumentcommands
ON_COMMAND(ID_FILE_NEW,CWinApp:
:
OnFileNew)
ON_COMMAND(ID_FILE_OPEN,CWinApp:
OnFileOpen)
//Standardprintsetupcommand
ON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp:
OnFilePrintSetup)
END_MESSAGE_MAP()
//CFiveChessAppconstruction
CFiveChessApp:
CFiveChessApp()
{//TODO:
addconstructioncodehere,//PlaceallsignificantinitializationinInitInstance}
//TheoneandonlyCFiveChessAppobject
CFiveChessApptheApp;
/CFiveChessAppinitialization
BOOLCFiveChessApp:
InitInstance()
{AfxEnableControlContainer();
//Standardinitialization
//Ifyouarenotusingthesefeaturesandwishtoreducethesize
//ofyourfinalexecutable,youshouldremovefromthefollowing
//thespecificinitializationroutinesyoudonotneed.
#ifdef_AFXDLL
Enable3dControls();
//CallthiswhenusingMFCinasharedDLL
#elseEnable3dControlsStatic();
//CallthiswhenlinkingtoMFCstatically
#endif//Changetheregistrykeyunderwhichoursettingsarestored.
//TODO:
Youshouldmodifythisstringtobesomethingappropriate
//suchasthenameofyourcompanyororganization.
SetRegistryKey(_T("
LocalAppWizard-GeneratedApplications"
));
LoadStdProfileSettings();
//LoadstandardINIfileoptions(includingMRU)
//Registertheapplication'
sdocumenttemplates.Documenttemplates
//serveastheconnectionbetweendocuments,framewindowsandviews.
CSingleDocTemplate*pDocTemplate;
pDocTemplate=newCSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CFiveChessDoc),
RUNTIME_CLASS(CMainFrame),//mainSDIframewindow
RUNTIME_CLASS(CFiveChessView));
AddDocTemplate(pDocTemplate);
//Parsecommandlineforstandardshellcommands,DDE,fileopen
CCommandLineInfocmdInfo;
ParseCommandLine(cmdInfo);
//Dispatchcommandsspecifiedonthecommandline
if(!
ProcessShellCommand(cmdInfo))
returnFALSE;
//Theoneandonlywindowhasbeeninitialized,soshowandupdateit.
m_pMainWnd->
ShowWindow(SW_SHOW);
UpdateWindow();
returnTRUE;
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{public:
CAboutDlg();
//DialogData//{{AFX_DATA(CAboutDlg)enum{IDD=IDD_ABOUTBOX};
//}}
AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);
//DDX/DDVsupport//}}AFX_VIRTUAL
//Implementation
//{{AFX_MSG(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
CAboutDlg():
CDialog(CAboutDlg:
IDD)
{//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT}
voidCAboutDlg:
DoDataExchange(CDataExchange*pDX)
{CDialog:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//}}AFX_MSG_MAP
//Appcommandtorunthedialog
voidCFiveChessApp:
OnAppAbout()
{CAboutDlgaboutDlg;
aboutDlg.DoModal();
//CFiveChessAppmessagehandlers
第3章课程设计总结
第一,网络五子棋的难点在于棋盘的描绘,和判断胜负的算法.
第二,网络游戏要求比较高的就是画面与游戏的可玩性,由于五子棋有着悠久的历史,深得大家的喜爱,因此成功的突破点就在于画面.
第三,模块的划分和规划对一个程序的开发至关重要.
第四,程序结构:
一个清晰的结构对日后的更新,改版和维护提供了方便.倘若程序组织混杂,不仅自己调试的时候麻烦,也给以后的改版带来诸多不便.写程序的时候都要有一个固定的格式.代码的缩进也有一个具体的标准.不仅看上去美观,修改起来也方便,能够很快的定位到需要修改的地方.在以后工作中,这是非常重要的一点.
第五,个性化设计很重要,一个美观,大方又具有亲和力的友善界面十分重要.目前的五子棋版本多种多样.如果采用大众化样式,千篇一律,没有体现出个性,给人的印象则不是很深刻.除非你的程序具有十分吸引人的特色.否则在竞争中就不会有什么优势,也不是很容易让人记住.因此对程序界面的精心设计具有十分重要作用.
经过两个礼拜的忙碌和工作,本次课程设计论文已经接近尾声,作为一个本科生的课程设计论文,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有老师的督促指导,以及同学的支持,想要完成这个设计是难以想象的.
在这次设计中,我收获了很多,不仅仅是学会了如何去编五子棋,而是学会了如何去开发一个程序.所以,对我来说,这次设计的本身所产生的影响,还远远没有结束,从本次课程设计中学到了许多课本上没有的知识.