五子棋程序课程设计_第1页
五子棋程序课程设计_第2页
五子棋程序课程设计_第3页
五子棋程序课程设计_第4页
五子棋程序课程设计_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+课程设计报告 指导老师:胡老师 日期:2021 01 18目录:第一章 本课程设计的目的3第二章 选题思路3第三章 解决方法3第四章 具体功能模块及代码61、准备模块62、初始化73、盘面分析填写棋型表94、环控制模块16第五章 存在的问题16第六章 致谢18参考文献 19第一章 本课程设计的目的(1)加深学生对c+语言数据类型,运算,语句结构及其程序设计的根本方法理解和掌握。(2)熟练掌握流程图的绘制。(3)熟悉所用计算机系统的操作方法。(4)学会上机调试程序,善于发现程序中的错误,并能够快速排除这些错误。(5)学会运用c+语言解决实际中的问题的能力。(6)学习用文档书写程序设计说明。第

2、二章 选题思路我选择比拟常见的小游戏,五子棋。五子棋是有两个人在一盘棋上进行对抗的竞技运动。在对局开始时,先由用户选择哪方先开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围的交叉点上落子,如此轮流落子,直到某一方首先在棋盘的直线、横线或斜线上形成连续的五子那么该方就算获胜。此时,算法结束。当有任何一方想退出时,都可在算法中实现。 第三章 解决方法本程序中包含一个主函数和16个子函数,它们的函数名及功能分别如下: 主函数 : int main(void) 子函数 :(1)void CGobang:Draw() 判断平局(2)void CGobang:InitialBoard() 初

3、始化棋盘(3)void CGobang:PrintBoard() 按用户输入大小输出棋盘(4)int CGobang:GetFull() 判断棋盘是否一满(5) void CGobang:Win() 判断赢棋(6) void CGobang:savefile() 将棋盘保存至文件,以便下次继续(7) void CGobang:Lose() 判断输棋(8) void CGobang:PlayTurn(void) 走一步棋(9) int CGobang:Judge() 判断是否连成五子(10) void CGobang:PrintInfo(void) 打印总体情况(11) void CGobang

4、:readBoard() 以二进制形式从文件中读出棋盘(12) void huiqi() 悔棋(13)void PrintRule(void) 打印游戏规那么(14) int JudgePlay(CGobang &SideX,CGobang &SideO) 每下一步进行输赢的判断(15)void Play(CGobang &SideX,CGobang &SideO) 开始一局游戏(16)void continute() 可以接着上次的游戏玩参数说明(1) int a90,b90; 定义全局数组(2) char chSort; 棋子的类别(3) int nWin;

5、 赢棋的次数(4) int nLose; 输棋的次数(5) static int nDraw; 平局次数(6) static char achBoard99; 棋盘(7) static int nSize; 棋盘的尺寸系统流程图输出游戏规那么Error!玩家遵守Y Y谁先下棋,输入棋盘大小s戏画出s*s大小的棋盘Y是否继续上次游戏Y用户决定谁先走NX方先走 N保存的文件画o画x Y 下棋 改变玩家Y 下棋输如<0,0>退出,是否保存 N横竖斜有五个相同颜色的棋子相连x棋 N Y N输出:o方获胜输出:x方获胜 Y是否继续 Y 退出程序N第四章 具体功能模块及代码1、准备模块:文件所

6、需的头函数、结构体的定义。即为本程序的运行作准备的函数模块:#include <iostream>#include <string>#include <fstream>#include <iomanip>using namespace std;int a90,b90; /定义全局数组int k=0;class CGobang /棋子类private:char chSort; /棋子的类别int nWin; /赢棋的次数int nLose; /输棋的次数static int nDraw; /平局次数public:static char achBoa

7、rd99; /棋盘static int nSize; /棋盘的尺寸nSize*nSizeCGobang(char chsort) /构造函数,决定一方棋子的类别chSort=chsort;nWin=nLose=nDraw=0;friend void huiqi(); /悔棋static void savefile(); /将棋盘保存至文件static void readBoard(); /从文件中读入棋盘void continute(); /接着上次的游戏玩void PlayTurn(void); /走一步棋int Judge(); /判断是否连成五子,是那么返回1void Win(void)

8、; /赢棋void Lose(void); /输棋static void Draw(void); /平局void PrintInfo(void); /打印总体情况static void PrintBoard(void); /输出棋盘static int GetFull(void); /判断棋盘是否一满static void InitialBoard(void); /初始化棋盘;2、初始化:首先,建立盘面数组、对战双方的棋型表和并将它们清零以备使用;然后初始化显示器、键盘、鼠等输入输出设备并在屏幕上画出棋盘。char CGobang:achBoard99;int CGobang:nSize=0;

9、int CGobang:nDraw=0;void CGobang:Draw() /平局cout<<"nntt平局!nn"nDraw+;void CGobang:InitialBoard() /初始化棋盘for(int i=0;i<nSize;i+)for(int j=0;j<nSize;j+)achBoardij=' ' void CGobang:PrintBoard() /输出棋盘int i,j;cout<<endl;cout<<"ttt"for(i=1;i<=nSize;i+)co

10、ut<<" "<<i;cout<<endl;for(i=0;i<nSize;i+)cout<<"ttt"cout<<i+1;for(j=0;j<nSize;j+)cout<<achBoardij<<"|"cout<<endl;int CGobang:GetFull() /判断棋盘是否一满,假设是返回1for(int i=0;i<nSize;i+)for(int j=0;j<nSize;j+)if(achBoardij

11、=' ')return 0;return 1;void CGobang:Win() /赢棋cout<<"nntt"<<chSort<<"方获胜!nn"nWin+;void CGobang:savefile() /将棋盘保存至文件ofstream outfile("C+.txt",ios:out);if(!outfile)cerr<<"open file error!"<<endl;exit(1);for(int i=0;i<nSize

12、;i+)for(int j=0;j<nSize;j+) outfile.write(char *) &achBoardij,sizeof(achBoardij); outfile.close();3、盘面分析填写棋型表:本程序核心模块之一,人工智能算法的根本依据!其具体实现方法如下:您在下五子棋时,一定会先根据棋盘上的情况,找出当前最重要的一些点位,如“活三、“冲四等;然后再在其中选择落子点。但是,电脑不会像人一样分析问题,要让它知道哪是“活三、哪是“冲四,就得在棋盘上逐点计算,一步一步的教它。 先来分析己方的棋型,我们从棋盘左上角出发,向右逐行搜索,当遇到一个空白点时,以它为中

13、心向左挨个查找,如果遇到己方的子那么记录然后继续,如果遇到对方的子、空白点或边界就停止查找。左边完成后再向右进行同样的操作;最后把左右两边的记录合并起来,得到的数据就是该点横向上的棋型,然后把棋型的编号填入到Computerxyn中就行了x、y代表坐标,n=0、1、2、3分别代表横、竖、左斜、右斜四个方向。而其他三个方向的棋型也可用同样的方法得到,当搜索完整张棋盘后,己方棋型表也就填写完毕了。然后再用同样的方法填写对方棋型表。注意:所有棋型的编号都要事先定义好,越重要的号数越大!void CGobang:Lose() /输棋nLose+;void CGobang:PlayTurn(void)

14、/走一步棋int nRow,nCol;char choice1,choice2;docout<<"t现在该"<<chSort<<"方下棋,请输入棋盘坐标(x,y):"cin>>nRow>>nCol;if(nRow>nSize|nCol>nSize)cout<<"t输入的坐标越界,x与y的范围应小于等于"<<nSize<<",请重新输入n"else if(nRow>0&&nCol>0

15、&&achBoardnRow-1nCol-1!=' ')cout<<"t棋盘("<<nRow<<","<<nCol<<")处已有棋子,请重新输入n" else if(nRow=-1) huiqi();else if(nRow=0&&nCol=0)cout<<"t确认你想结束游戏吗(y,n)?"cin.get(); cin>>choice1;if(choice1='y'|

16、choice1='Y')cout<<"t是否保存(y,n)?:"cin.get();cin>>choice2;if(choice2='y'|choice2='Y')CGobang:savefile();cout<<"t保存成功,欢送下次再玩!n"exit(1);elsecout<<"t游戏结束,欢送再次使用五子棋游戏!"cout<<endl;exit(0);else achBoardnRow-1nCol-1=chSort;ak=

17、nRow-1;bk=nCol-1;k+;break;while(1);int CGobang:Judge() /判断是否连成五子,是那么返回1int i,j;for(i=0;i<nSize;i+)for(j=0;j<nSize;j+)if(achBoardij=chSort)if(j+4<nSize)if(achBoardij+1=chSort&&achBoardij+2=chSort&&achBoardij+3=chSort&&achBoardij+4=chSort)return 1;if(i+4<nSize)if(ac

18、hBoardi+1j=chSort&&achBoardi+2j=chSort&&achBoardi+3j=chSort&&achBoardi+4j=chSort)return 1;if(i+4<nSize&&j+4<nSize)if(achBoardi+1j+1=chSort&&achBoardi+2j+2=chSort&&achBoardi+3j+3=chSort&&achBoardi+4j+4=chSort)return 1;if(i-4>0&&

19、j+4<nSize)if(achBoardi-1j+1=chSort&&achBoardi-2j+2=chSort&&achBoardi-3j+3=chSort&&achBoardi-4j+4=chSort)return 1;return 0;void CGobang:PrintInfo(void) /打印总体情况cout<<"Size"<<chSort<<"方共计赢"<<nWin<<"局,输"<<nLose&

20、lt;<"局,平"<<nDraw<<"局。"<<endl;void CGobang:readBoard() /以二进制形式从文件中读出棋盘ifstream infile("C+.txt",ios:in); if(!infile)cerr<<"open file eror!"<<endl;exit(1);else for(int i=0;i<nSize;i+)for(int j=0;j<nSize;j+) infile.read(char

21、*) &achBoardij,sizeof(achBoardij);infile.close();void huiqi() /悔棋 k-;CGobang:achBoardakbk=' 'k-;CGobang:achBoardakbk=' 'CGobang:PrintBoard();void PrintRule(void) /打印游戏规那么cout<<"t_nn"cout<<"tt 欢送使用五子连珠游戏!"<<endl<<endl; cout<<"

22、t-nn" cout<<"t游戏规那么:"<<endl; cout<<"t1.每1步输入要下棋子的格子的x,y坐标,按Enter键n" cout<<"t2.有1方首先5个棋子连成一线即判获胜n" cout<<"t3.当旗子布满棋盘但仍无获胜方即为平局n" cout<<"t4.一局结束后,假设想继续按Y键,假设退出那么按其他键n" cout<<"t5.假设想中途退出游戏,请输入(0,0),再按照

23、提示保存游戏n" cout<<"t6.悔棋请输入(-1,0)n" cout<<"nntt请按任意键开始下棋!nn"int JudgePlay(CGobang &SideX,CGobang &SideO) /每下一步要进行输赢判断,有赢的那么返回1 if(SideX.Judge() /X方获胜SideX.Win();SideO.Lose();return 1;else if(SideO.Judge() /O方获胜SideO.Win();SideX.Lose();return 1;elsereturn 0;v

24、oid Play(CGobang &SideX,CGobang &SideO) /开始一局游戏while(1)system("cls"); cout<<"t*n" cout<<"tt.悔棋请输入(-1,0)n" cout<<"tt.中途退出请输出(0,0),并根据提示保存n" cout<<"t*n"CGobang:PrintBoard(); /输出棋盘SideX.PlayTurn(); /X方下棋if(JudgePlay(SideX

25、,SideO) /判断输赢 break;if(CGobang:GetFull() /判断是否平局CGobang:Draw();break;system("cls"); /清屏cout<<"t*n"cout<<"tt.悔棋请输入(-1,0)n"cout<<"tt.中途退出请输出(0,0),并根据提示保存n"cout<<"t*n"CGobang:PrintBoard(); /输出棋盘SideO.PlayTurn(); /O方下棋if(JudgePlay

26、(SideX,SideO) /判断输赢break;if(CGobang:GetFull() /判断是否平局CGobang:Draw();break;void continute() /接着上次的游戏玩 char str; cin.get();cout<<"t你是否接着玩上一次的游戏(y/n)?:"cin>>str;if(str='Y'|str='y')CGobang:readBoard();else cout<<"t请玩新游戏n"4、环控制模块:控制下棋顺序,当轮到某方下子时,负责将程序

27、转到相应的模块中去,主要担当一个调度者的角色。int main(void) CGobang SideX('X'),SideO('O'); /定义两个旗子类对象,分别代表X方与O方system("cls");PrintRule();cin.get();string strChoice;docout<<"请选择棋盘大小(59):"cin>>CGobang:nSize;cout<<endl;if(CGobang:nSize>9|CGobang:nSize<5)cout<<"请重新输入:"cin>>CGobang:nSize;cout<<end

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论