博弈树实现3字棋程序的设计报告.docx
- 文档编号:4957524
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:13
- 大小:229.19KB
博弈树实现3字棋程序的设计报告.docx
《博弈树实现3字棋程序的设计报告.docx》由会员分享,可在线阅读,更多相关《博弈树实现3字棋程序的设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
博弈树实现3字棋程序的设计报告
摘要
用所学的语言,设计简单的一字棋游戏。
关键字:
博弈,启发式搜索
第一部分设计总概
一.设计目的
理解和掌握博弈树的启发式搜索过程,能够用选定的编程语言实现简单的博弈游戏。
二.设计要求及内容
设计一个不少于3行3列的棋盘,自己给出估价函数,采用极大极小搜索方法。
采用人机对弈的方式,一方走步够等待对方,对弈过程的棋局变化在屏幕上显示。
三.设计方法
采用c语言编写程序实现
四.系统分析与设计
一.概要设计
A:
进入主界面
主界面包括导语及游戏操作步骤及其规则
B:
进入游戏,开始下棋
C:
判断输赢,结束游戏
D:
判断是否重新开始游戏
是则返回B步骤
否则结束游戏
二.详细设计
1.进入vs2010,选择win32项目,新建程序
2.界面设计
利用所学的c语言知识,设计一个简单的棋盘游戏界面
3.函数设计
利用所学的算法,编写棋盘分析函数
第二部分数据结构设计
一:
主系统的函数
窗口创建函数,消息响应函数皆放在主函数cpp里面
二:
头文件
存放具体的操作步骤及其函数
第三部分功能实现与程序调试
开始
主界面
判断输赢
棋盘
开始下棋
分出胜负
平局
结束,是否重新开始游戏
结束
是
否
否
是
一:
程序实现的功能流程图
二:
程序实现源代码
1.头文件
A:
定义类:
#include
#include
usingnamespacestd;
classCGobang//棋子类
{
private:
charchSort;//棋子的类别
intnWin;//赢棋的次数
intnLose;//输棋的次数
staticintnDraw;//平局次数
staticcharachBoard[3][3];//棋盘
staticintnSize;//棋盘的尺寸nSizeXnSize
public:
CGobang(charchsort)//构造函数,决定一方棋子的类别
{
chSort=chsort;
nWin=nLose=nDraw=0;
}
voidPlayTurn(void);//走1步棋
intJudge();//判断是否连成一线,是则返回1,否则返回0
voidWin(void);//赢棋
voidLose(void);//输棋
staticvoidDraw(void);//平局
voidPrintInfo(void);//输出总体情况
staticvoidPrintBoard(void);//输出棋盘
staticintGetFull(void);//判断棋盘是否已布满棋子
staticvoidInitialBoard(void);//初始化棋盘
};
B:
操作函数:
#include"lei.h"
#include
charCGobang:
:
achBoard[3][3];
intCGobang:
:
nSize=3;
intCGobang:
:
nDraw=0;
voidCGobang:
:
Draw()
{cout<<"\n\n\t\t平局!
\n\n";nDraw++;}
voidCGobang:
:
InitialBoard()//初始化棋盘
{
for(inti=0;i for(intj=0;j achBoard[i][j]=''; } voidCGobang: : PrintBoard()//输出棋盘 { system("CLS"); cout< cout<<"123"< cout<<"1"< cout<<"---|---|---"< cout<<"2"< cout<<"---|---|---"< cout<<"3"< cout< cout< } intCGobang: : GetFull()//判断棋盘是否布满棋子,若是返回1 { for(inti=0;i for(intj=0;j if(achBoard[i][j]=='') return0; return1; } voidCGobang: : Win()//赢棋 { CGobang: : PrintBoard();//输出棋盘 cout<<"\n\n\t\t"< \n\n"; nWin++; } voidCGobang: : Lose()//输棋 {nLose++;} voidCGobang: : PlayTurn(void)//走1步棋 { intnRow,nCol; cout<<"现在该"< "; do{cin>>nRow>>nCol;//输入坐标 if(nRow>nSize||nCol>nSize||nRow<1||nCol<1)//判断坐标越界 cout<<"输入的坐标越界,x与y的范围应小于等于"< elseif(achBoard[nRow-1][nCol-1]! ='')//判断坐标合理 cout<<"棋盘("< else { achBoard[nRow-1][nCol-1]=chSort;//在坐标处放上棋子 break;//退出循环 } }while (1); } intCGobang: : Judge()//判断是否棋子连成一线,若是返回1 { //以下是各种可能连成一线的情况 if(achBoard[0][0]==chSort&&achBoard[1][1]==chSort&&achBoard[2][2]==chSort)return1; elseif(achBoard[2][0]==chSort&&achBoard[1][1]==chSort&&achBoard[0][2]==chSort)return1; elseif(achBoard[0][0]==chSort&&achBoard[1][0]==chSort&&achBoard[2][0]==chSort)return1; elseif(achBoard[0][1]==chSort&&achBoard[1][1]==chSort&&achBoard[2][1]==chSort)return1; elseif(achBoard[0][2]==chSort&&achBoard[1][2]==chSort&&achBoard[2][2]==chSort)return1; elseif(achBoard[0][0]==chSort&&achBoard[0][1]==chSort&&achBoard[0][2]==chSort)return1; elseif(achBoard[1][0]==chSort&&achBoard[1][1]==chSort&&achBoard[1][2]==chSort)return1; elseif(achBoard[2][0]==chSort&&achBoard[2][1]==chSort&&achBoard[2][2]==chSort)return1; else return0;//没有连成一线则返回0 } voidCGobang: : PrintInfo(void)//打印总体情况 { cout<<"Side"< "< } voidPrintRule(void)//打印规则 { cout<<"\n\t*****************欢迎使用三子棋游戏! *****************"< cout<<"\n\t*****************************************************"< cout<<"\t*游戏规则: *"< cout<<"\t*a.每1步输入要下棋的格子的x,y坐标,按Enter键*\n"; cout<<"\t*b.有1方首先3个棋子连成一线即判获胜*\n"; cout<<"\t*c.当棋子布满棋盘但仍无获胜方即为平局*\n"; cout<<"\t*d.X方先行*\n"; cout<<"\t*****************************************************"< cout<<"\n\n\t\t请按任意键开始下棋! \n\n"; } intJudgePlay(CGobang&SideX,CGobang&SideO)//每下1步要进行输赢的判断,有结果则返回1 { if(SideX.Judge())//X方获胜 { SideX.Win(); SideO.Lose(); return1; } elseif(SideO.Judge())//O方获胜 { SideO.Win(); SideX.Lose(); return1; } else return0; } voidPlay(CGobang&SideX,CGobang&SideO)//开始一局游戏 { while (1) { CGobang: : PrintBoard();//输出棋盘 SideX.PlayTurn();//X方下棋 if(JudgePlay(SideX,SideO))//判断输赢 break; if(CGobang: : GetFull())//判断是否平局 { CGobang: : Draw(); break; } CGobang: : PrintBoard();//输出棋盘 SideO.PlayTurn();//O方下棋 if(JudgePlay(SideX,SideO))//判断输赢 break; if(CGobang: : GetFull())//判断是否平局 { CGobang: : Draw(); break; } } } 2.cpp文件代码 #include #include #include"juti.h" intmain(void) { system("color88"); CGobangSideX('X'),SideO('O');//定义两个棋子类对象,分别代表X方与O方 PrintRule(); cin.get(); stringstrChoice; do { CGobang: : InitialBoard();//初始化棋盘 Play(SideX,SideO);//开始下一局 cout<<"是否继续(Y/N)? "; cin>>strChoice; }while(strChoice=="Y"||strChoice=="y"); SideX.PrintInfo(); SideO.PrintInfo(); cout<<"\n\n\t欢迎再次使用三子连珠游戏! "< return0; } 3.程序实现截图 1.界面 2.进入游戏开始下棋 输入坐标开始棋局 判断输入坐标是否合理: 3.判断棋局胜负: 4: 结束游戏: 第四部分完成设计 1、实验总结 我们学习人工智能就是学会如何用人工的方法模拟和实现人类智能,我们学习的是一种逻辑思维,如何将我们的方法给予计算机,达到我们所期望的结果。 对于该实验,我们组员对c语言更加熟悉,故而采用了c语言来写该实验,但是在用c语言在布局和构造界面这一块,并不是很好,但我们力求直观,简洁,将所需要展现的都显示出来。 加入了判断旗子位置是否合理这一函数,使得该程序更加有可行性! 设计成绩: 指导老师签名: 日期: 2014年4月20 戴晨丹陈万琳
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 博弈 实现 程序 设计 报告