最新版C++毕业课程设计报告Word文件下载.docx

上传人:b****3 文档编号:13534476 上传时间:2022-10-11 格式:DOCX 页数:27 大小:332.38KB
下载 相关 举报
最新版C++毕业课程设计报告Word文件下载.docx_第1页
第1页 / 共27页
最新版C++毕业课程设计报告Word文件下载.docx_第2页
第2页 / 共27页
最新版C++毕业课程设计报告Word文件下载.docx_第3页
第3页 / 共27页
最新版C++毕业课程设计报告Word文件下载.docx_第4页
第4页 / 共27页
最新版C++毕业课程设计报告Word文件下载.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

最新版C++毕业课程设计报告Word文件下载.docx

《最新版C++毕业课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《最新版C++毕业课程设计报告Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。

最新版C++毕业课程设计报告Word文件下载.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1