C++毕业课程设计报告.docx
- 文档编号:2829560
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:25
- 大小:331.79KB
C++毕业课程设计报告.docx
《C++毕业课程设计报告.docx》由会员分享,可在线阅读,更多相关《C++毕业课程设计报告.docx(25页珍藏版)》请在冰豆网上搜索。
C++毕业课程设计报告
(此文档为word格式,下载后您可任意编辑修改!
)
青岛理工大学
C++面向对象课程设计报告
院(系):
_________
专业:
__
学生姓名:
___
班级:
学号:
题目:
_________
起讫日期:
__________
设计地点:
_______
指导老师:
____
一.游戏概述...........................................3
1.1.游戏介绍.........................................3
1.2.游戏玩法.........................................3
1.3.运行环境.........................................3
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<=530;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
在OnInitDialog()内对qy进行初始化
inti,j,k;
Cqizq;
for(i=60,k=0;i<=550;i=i+35,k++)
for(j=60;j<=550;j=j+35)
{
q.x=i;
q.y=j;
qz[k].push_back(q);
}
当鼠标单击的时候,判断单击的是哪一个区域,如果该区域为空则修改区域状态
voidCWuZiQiDlg:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
TODO:
Addyourmessage(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:
Addyourmessage,score=0;
for(i=0;i<15;i++)
for(j=0;j<15;j++)
if(ison&&!
over&&qz[i][j].isEmpty())
{
x=i;y=j;
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();
CDialog:
:
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)&&!
over)
{
if(qz[x][y].flag==1)
MessageBox("你赢了!
");
else
MessageBox("电脑赢!
");
over=true;
first=false;
ison=false;
}
boolCWuZiQiDlg:
:
Win(intx,inty)
{
if(qz[x][y].flag==0)
returnfalse;
intcount1=0,count2=0,i,j;
for(i=0;i<15;i++)
{
if(qz[i][y].flag==qz[x][y].flag)
count1++;
else
count1=0;
if(qz[x][i].flag==qz[x][y].flag)
count2++;
else
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>=0&&j<15&&qz[i][j].flag==qz[x][y].flag)
{
count1++;
i--;
j++;
}
i=x-1;
j=y-1;
while(i>=0&&j>=0&&qz[i][j].flag==qz[x][y].flag)
{
count2++;
i--;
j--;
}
i=x+1;
j=y+1;
while(i<15&&j<15&&qz[i][j].flag==qz[x][y].flag)
{
count2++;
i++;
j++;
}
if(count1==5||count2==5)
returntrue;
returnfalse;
}
三.游戏运行图
四.总结
4.1.自我总结
根据这2个周的C++程序编写,使我对了C++有了新的认识,原来学会了C++可以编写好多好玩的游戏,一开始拿着这个程序不知道怎么下手,可以说是什么
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 毕业 课程设计 报告