最新版C++毕业课程设计报告Word文件下载.docx
《最新版C++毕业课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《最新版C++毕业课程设计报告Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。
2.具体步骤........................................3
2.1.棋盘设计.........................................3
2.2.棋子设计.........................................4
2.3.电脑算法.........................................6
2.4.胜负判断.........................................8
3.游戏运行图......................................11
4.总结............................................13
41.自我总结..........................................13
4.2.程序的不足和需要改进的地方.......................14
致谢...............................................14
附录一参考文献....................................15
附录二程序源代码..................................15
1.游戏概述
1.1.游戏介绍
五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。
发展于日本,流行于欧美。
容易上手,老少皆宜,而且趣味横生,引人入胜;
不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
1.2.游戏玩法
黑白双方依次落子,由黑先下,当棋盘上有三个子时,如果此时白方觉得开的局不利于自已可以提出交换,黑方无条件接受!
也可以不交换,主动权在白方!
然后继续下棋,任一方先在棋盘上形成横向、竖向、斜向的连续的相同颜色的五个棋子的一方为胜。
1.3.运行环境
Windows7VC++6.0
2.具体步骤
2.1.棋盘设计
棋盘和棋子可以用GDI来实现,棋盘用GDI划线,基本上就是LineTo(x,y),MoveTo(x,y),一个棋盘就出来了。
具体代码如下
在OnPaint()函数的else内加入如下代码
CPaintDCdc(this);
dc.SelectStockObject(BLACK_PEN);
inti,j;
for(i=40;
i<
=530;
i=i+35)
{
dc.MoveTo(i,40);
dc.LineTo(i,530);
}
for(j=40;
j<
j=j+35)
dc.MoveTo(40,j);
dc.LineTo(530,j);
}}
2.2.棋子设计
至于如何画棋子,就用GDI来画圆,然后填充上不同的颜色,黑子、白子也就实现了。
这里的棋子不应该是一个独立的量,它有自己的区域,应该能判断鼠标是不是点击到了这个区域,当点击这个区域的时候是否应该显示,应该显示什么颜色的旗子……把这么多东西集合在一起,应该定义一个类,于是Cqiz这个类就出现了。
Cqiz有四个变量如下:
intflag;
CRectrect;
inty;
intx;
x,y表示这个区域的中心,rect为以x,y为中心的边长为30的矩形,flag用来表示该对象的状态(0:
空白1:
黑子-1:
白字)。
然后又定义了5个成员函数
boolisWhite();
//如果为白子,返回true
CRectgetRect();
//获得该对象对应的CRect
boolisBlack();
//如果为黑子,返回true
boolisEmpty();
//如果为空,返回true
boolisOn(CPointpoint);
//如果该点出在该区域返回true,用来判断鼠标单击对应的区域。
定义了一个vector容器
vector<
Cqiz>
qz;
在OnInitDialog()内对qy进行初始化
inti,j,k;
Cqizq;
for(i=60,k=0;
=550;
i=i+35,k++)
for(j=60;
{
q.x=i;
q.y=j;
qz[k].push_back(q);
}
当鼠标单击的时候,判断单击的是哪一个区域,如果该区域为空则修改区域状态
voidCWuZiQiDlg:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
inti,j;
for(i=0;
15;
i++)
for(j=0;
j++)
if(qz[i][j].isOn(point)&
&
!
over&
qz[i][j].isEmpty())
{
qz[i][j].flag=1;
x=i;
y=j;
ison=true;
Invalidate();
//引发重绘
return;
}
CDialog:
OnLButtonDown(nFlags,point);
}
2.3.电脑算法
在OnLButtonUp()中实现ai,电脑走棋
voidCWuziqidlgDlg:
OnLButtonUp(UINTnFlags,CPointpoint)
{
//TODO:
inti,j,m,n,score=0;
if(ison&
if(getScore()>
=score)
{
score=getScore();
m=i;
n=j;
}
}
if(ison&
over)
if(score<
=1&
qz[7][7].flag==0)
qz[7][7].flag=-1;
x=7;
y=7;
else
qz[m][n].flag=-1;
x=m;
y=n;
}
ison=false;
Invalidate();
OnLButtonUp(nFlags,point);
OnPaint()函数中实现绘制,每次先把棋盘画好,然后遍历各区域,如果不为空就绘制相应的棋子。
还要判断是否有一方获胜,如果有就结束游戏。
这个程序主关键的是算分,对不同的走法进行算法,得分最高的为要真正要走的。
判断是否能成5,如果是机器方的话给予900000分,如果是人方的话给予400000分;
判断是否能成活4或者是双死4或者是死4活3,如果是机器方的话给予150000分,如果是人方的话给予70000分;
判断是否已成双活3,如果是机器方的话给予30000分,如果是人方的话给予15000分;
判断是否成死3活3,如果是机器方的话给予1000分,如果是人方的话给予1000分;
判断是否能成死4,如果是机器方的话给予500分,如果是人方的话给予500分;
判断是否能成单活3,如果是机器方的话给予200分,如果是人方的话给予200分;
判断是否已成双活2,如果是机器方的话给予100分,如果是人方的话给予100分;
判断是否能成死3,如果是机器方的话给予50分,如果是人方的话给予50分;
判断是否能成双活2,如果是机器方的话给予10分,如果是人方的话给予10分;
判断是否能成活2,如果是机器方的话给予5分,如果是人方的话给予5分;
判断是否能成死2,如果是机器方的话给予3分,如果是人方的话给予3分。
下五子棋不光要进攻,还要防守,所以要先对假设那些空的格子下自己的棋子能得多少分,得出一个最高分,然后假设这些格子放上对方的棋子,得出一个最高分,如果进攻的最高分大于等于防守的最高分,则进攻,否则先进行防守。
2.4.胜负判断
根据上面的介绍,如果有一方的5个棋子连成一线,那么这方就胜利了。
if(Win(x,y)&
if(qz[x][y].flag==1)
MessageBox("
你赢了!
"
);
else
电脑赢!
over=true;
first=false;
}
boolCWuZiQiDlg:
Win(intx,inty)
if(qz[x][y].flag==0)
returnfalse;
intcount1=0,count2=0,i,j;
if(qz[i][y].flag==qz[x][y].flag)
count1++;
count1=0;
if(qz[x][i].flag==qz[x][y].flag)
count2++;
count2=0;
if(count1==5||count2==5)
returntrue;
}
count1=count2=1;
i=x+1;
j=y-1;
while(i<
15&
j>
=0&
qz[i][j].flag==qz[x][y].flag)
count1++;
i++;
j--;
i=x-1;
j=y+1;
while(i>
i--;
j++;
count2++;
if(coun