博弈树实现3字棋程序的设计报告Word文件下载.docx
《博弈树实现3字棋程序的设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《博弈树实现3字棋程序的设计报告Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
3.函数设计
利用所学的算法,编写棋盘分析函数
第二部分数据结构设计
一:
主系统的函数
窗口创建函数,消息响应函数皆放在主函数cpp里面
二:
头文件
存放具体的操作步骤及其函数
第三部分功能实现与程序调试
开始
主界面
判断输赢
棋盘
开始下棋
分出胜负
平局
结束,是否重新开始游戏
结束
是
否
程序实现的功能流程图
二:
程序实现源代码
1.头文件
定义类:
#include<
iostream>
string>
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<
math.h>
charCGobang:
:
achBoard[3][3];
intCGobang:
nSize=3;
nDraw=0;
voidCGobang:
Draw()
{cout<
<
"
\n\n\t\t平局!
\n\n"
;
nDraw++;
InitialBoard()//初始化棋盘
for(inti=0;
i<
nSize;
i++)
for(intj=0;
j<
j++)
achBoard[i][j]='
'
PrintBoard()//输出棋盘
system("
CLS"
);
cout<
endl;
123"
<
1"
achBoard[0][0]<
|"
achBoard[0][1]<
achBoard[0][2]<
---|---|---"
2"
achBoard[1][0]<
achBoard[1][1]<
achBoard[1][2]<
3"
achBoard[2][0]<
achBoard[2][1]<
achBoard[2][2]<
GetFull()//判断棋盘是否布满棋子,若是返回1
if(achBoard[i][j]=='
)
return0;
return1;
Win()//赢棋
CGobang:
PrintBoard();
\n\n\t\t"
chSort<
"
方获胜!
nWin++;
Lose()//输棋
{nLose++;
PlayTurn(void)//走1步棋
intnRow,nCol;
现在该"
方下棋,请输入棋盘坐标(x,y):
do{cin>
>
nRow>
nCol;
//输入坐标
if(nRow>
nSize||nCol>
nSize||nRow<
1||nCol<
1)//判断坐标越界
cout<
输入的坐标越界,x与y的范围应小于等于"
nSize<
并且大于0,请重新输入\n"
elseif(achBoard[nRow-1][nCol-1]!
='
)//判断坐标合理
棋盘("
nRow<
,"
nCol<
)处已有棋子,请重新输入\n"
else
{
achBoard[nRow-1][nCol-1]=chSort;
//在坐标处放上棋子
break;
//退出循环
}
}while
(1);
Judge()//判断是否棋子连成一线,若是返回1
//以下是各种可能连成一线的情况
if(achBoard[0][0]==chSort&
&
achBoard[1][1]==chSort&
achBoard[2][2]==chSort)return1;
elseif(achBoard[2][0]==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[2][1]==chSort)return1;
elseif(achBoard[0][2]==chSort&
achBoard[1][2]==chSort&
achBoard[0][1]==chSort&
elseif(achBoard[1][0]==chSort&
achBoard[1][2]==chSort)return1;
achBoard[2][1]==chSort&
return0;
//没有连成一线则返回0
PrintInfo(void)//打印总体情况
Side"
方共计赢"
nWin<
局,输"
nLose<
局,平"
nDraw<
局。
endl;
voidPrintRule(void)//打印规则
\n\t*****************欢迎使用三子棋游戏!
*****************"
endl<
\n\t*****************************************************"
endl;
\t*游戏规则:
*"
\t*a.每1步输入要下棋的格子的x,y坐标,按Enter键*\n"
\t*b.有1方首先3个棋子连成一线即判获胜*\n"
\t*c.当棋子布满棋盘但仍无获胜方即为平局*\n"
\t*d.X方先行*\n"
\t*****************************************************"
\n\n\t\t请按任意键开始下棋!
intJudgePlay(CGobang&
SideX,CGobang&
SideO)//每下1步要进行输赢的判断,有结果则返回1
if(SideX.Judge())//X方获胜
SideX.Win();
SideO.Lose();
return1;
elseif(SideO.Judge())//O方获胜
SideO.Win();
SideX.Lose();
voidPlay(CGobang&
SideO)//开始一局游戏
while
(1)
CGobang:
SideX.PlayTurn();
//X方下棋
if(JudgePlay(SideX,SideO))//判断输赢
break;
if(CGobang:
GetFull())//判断是否平局
{
CGobang:
Draw();
}
SideO.PlayTurn();
//O方下棋
2.cpp文件代码
stdio.h>
Windows.h>
#include"
juti.h"
intmain(void)
color88"
CGobangSideX('
X'
),SideO('
O'
//定义两个棋子类对象,分别代表X方与O方
PrintRule();
cin.get();
stringstrChoice;
do
InitialBoard();
Play(SideX,SideO);
//开始下一局
是否继续(Y/N)?
cin>
strChoice;
}while(strChoice=="
Y"
||strChoice=="
y"
SideX.PrintInfo();
SideO.PrintInfo();
\n\n\t欢迎再次使用三子连珠游戏!
return0;
3.程序实现截图
1.界面
2.进入游戏开始下棋
输入坐标开始棋局
判断输入坐标是否合理:
3.判断棋局胜负:
4:
结束游戏:
第四部分完成设计
1、实验总结
我们学习人工智能就是学会如何用人工的方法模拟和实现人类智能,我们学习的是一种逻辑思维,如何将我们的方法给予计算机,达到我们所期望的结果。
对于该实验,我们组员对c语言更加熟悉,故而采用了c语言来写该实验,但是在用c语言在布局和构造界面这一块,并不是很好,但我们力求直观,简洁,将所需要展现的都显示出来。
加入了判断旗子位置是否合理这一函数,使得该程序更加有可行性!
设计成绩:
指导老师签名:
日期:
2014年4月20
戴晨丹陈万琳