教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 政务民生 >

《Windows程序设计》信技01 柯学(1)(4)

来源:网络收集 时间:2026-01-25
导读: 武汉工程大学计算机科学与工程学院 综合设计报告 根据游戏流程分析,作出如图3.4的游戏流程图。 开始棋盘已满是输出平局否“0”方选位置判断该位置是否有棋有另找位置无“0”方落子否判断“0”方是否获胜是输出“0

武汉工程大学计算机科学与工程学院 综合设计报告

根据游戏流程分析,作出如图3.4的游戏流程图。

开始棋盘已满是输出平局否“0”方选位置判断该位置是否有棋有另找位置无“0”方落子否判断“0”方是否获胜是输出“0”方获胜否棋盘已满是输出平局结束否“x”方选位置判断该位置是否有棋有另找位置无“x”方落子判断“x”方是否获胜是输出“x”方获胜 图3.4 游戏流程图

3.3 游戏项目开发

3.3.1 游戏初始准备

为了实现下棋功能并且能够判断游戏什么时候结束等功能,我们要添加一些变量和函数帮助实现,因此我们在CTicTacView类的头文件中添加下面的代码: void over(CPoint point);

6

武汉工程大学计算机科学与工程学院 综合设计报告

int wzq[19][19]; bool colorwhite; CBitmap myblack; CBitmap mywhite;

其中over()函数判断游戏是否结束,数组记录棋格上是否有棋子,colorwhite判断该下白棋还是黑棋,还有两个棋子的位图的变量。然后在类的源文件中的构造函数对这些变量进行初始化赋值,从而添加下面的代码:

mywhite.LoadBitmap(IDB_WHITE); myblack.LoadBitmap(IDB_BLACK);

for(int i=0;i<19;i++) for(int j=0;j<19;j++) wzq[i][j]=0; colorwhite=true;

3.3.2 棋盘设计

在应用程序框架的CTicTac类中的OnDraw()函数中实现画棋盘的功能,画棋盘包括画背景颜色和画五子棋的棋格,在OnDraw()函数中把CDC的指针pDC作为形参,具体添加代码如下: CBrush mybrush;

mybrush.CreateSolidBrush(RGB(130,64,0)); CRect rect(0,0,647,687);

pDC->FillRect(rect,&mybrush); for(int i=0;i<19;i++) {

pDC->MoveTo(40,40+i*20); pDC->LineTo(400,40+i*20); pDC->MoveTo(40+i*20,40); pDC->LineTo(40+i*20,400); }

在上面的代码中,创建一个CBrush类的对象mybrush,通过调用类中的函数CreateSolidBrush()对这个刷子对象选择颜色,创建一个CRect类的对象rect,选择刷子的作用范围,然后调用CDC类中的FillRect()函数就可以把窗体的背景刷成RGB(130,64,0)的颜色:在画棋盘的部分,用一个for循环分别在x和y方向画19条线作为棋盘。

3.3.3 下棋功能开发

按照规划,棋子使用鼠标的左键来进行下棋操作,即是当用户单击左键时下棋子,但是五子棋是两个人的游戏,如何区别用户左键单击时是下白棋还是黑棋就是个问题,在程序中我们把用户下的第一个棋子规定为白棋,同时通过设置标记的方式实现白棋和黑棋交替,即白棋下棋后的下一步一定是黑棋。此时,必须为鼠标添加鼠标左键单击的

7

武汉工程大学计算机科学与工程学院 综合设计报告

鼠标消息处理函数,步骤如下:

1.在类向导中选择CTicTacView中的的WM_LBUTTONDOWN消息添加OnLButtonUp()消息响应函数,操作界面如图3.4

图3.5 添加消息响应函数

函数添加成功后在函数中写入具体下棋的代码,添加代码如下: CDC *pDC=GetDC();CDC Dc;

if(Dc.CreateCompatibleDC(pDC)==FALSE) AfxMessageBox(\

if(point.x>30&&point.x<410&&point.y>30&&point.y<410) {int px=(point.x-30)/20;int py=(point.y-30)/20; if(colorwhite&&wzq[px][py]==0) {Dc.SelectObject( mywhite);

pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY); wzq[px][py]=1; over(point); colorwhite=false; }else if(wzq[px][py]==0) {Dc.SelectObject( myblack);

pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY); wzq[px][py]=-1; over(point); colorwhite=true; }}

分析上面的代码,如果鼠标点在棋盘内,并且这个地方没有任何棋子,那么就会在这个点最近的棋格上下一个棋子,通过加载棋子的位图实现下棋,同时修改棋子标记,当colorwhite为true时下白棋,当colorwhite为flase时下黑棋。分析上面的程序发现wzq[]数组,该数组用于记录棋格上是否有棋子,有棋子时为“1”,没有棋子为“0”。

2.位图的加载在下棋功能实现过程里可能会稍微复杂些,首先需要在资源中添加两个Bitmap类型的资源分别用来表示黑棋和白棋,修改它们的ID并记下来方便使用,用这两个位图初始化先前定义的位图变量,然后通过函数调用加载位图,具体调用形式为: Dc.SelectObject( myblack);

pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);

8

武汉工程大学计算机科学与工程学院 综合设计报告

3.3.4 游戏输赢判断的实现

有了棋盘和下棋功能后,程序就可以实现在棋盘上自由的下棋子了,但是游戏什么时候结束呢,所以需要有一个判断游戏结束判断输赢功能的函数,该功能是棋牌游戏中较难的功能。所以编写程序时要细心。根据五子棋的游戏规则,分析得到下面的设计思路:

如果某一方(黑棋或白棋)在同一行或同一列或同一斜线上具有5个同色的棋子,则该颜色的这一方就获胜。因此可以使用一个整形二维数组来记录当前的棋局情况,二维数组的值定义如下:

0:表示该位子没有棋子;

-1:表示该位置已经放了黑色棋子; 1:表示该位置已经放了白色棋子; 根据思路发现两个问题:

问题1:要在下完棋子,如何改变将数组中对应位置的数组元素值做改变,变为“1”或“-1”,这个只需要在鼠标消息处理函数中改变数组元素值即可。

问题2:下每个棋子后,判断在这个棋子同一行同一列或同一斜线上是否具有连续5个同色的棋子,若有,则宣判该方胜利,并退出游戏,如果没有,则继续游戏,轮到下一方下棋。

对于问题2则需要在下完一个棋子后分别对该棋子的横向、竖向和斜线方向进行判断。其中横向的具体实现的代码如下:

int x=(point.x-30)/20; int y=(point.y-30)/20; int xx,yy. i,j,a; if(x<4)xx=0; else xx=x-4; if(y<4)yy=0; else yy=y-4;

for(i=xx;i<15;i++) {a=0;

for(j=i;j

if(a==5) //五个都是白棋

{AfxMessageBox(\白棋胜!\}

if(a==-5) //五个都是黑棋

{AfxMessageBox(\黑棋胜!\}}}

在上面的代码中,通过计算获得需要的判断的位置,然后横向进行判断,定义一个记录连子情况的整形变量a,如果a等于5,则表示有五个白色的棋子横向相连,则可以输出白棋胜利:如果a等于-5,则表示有五个黑色的棋子相连,那么可以输出黑棋胜利,每次输出某一方胜利后重新开始新的一局游戏。

竖向和横向的原理基本上是一样的,所以这里就不再重复说明了,对于斜线方向的判断相对比横向要复杂,斜线方向包括右下斜线和左下斜线,这里我们只介绍右下斜线方向,右下斜线方向的判断的代码如下 if(x

{ if(xx==0)yy=y-x;

9

武汉工程大学计算机科学与工程学院 综合设计报告

}else

{ if(yy==0)xx=x-y; } int over=0; do{a=0;

for(i=0;i<5;i++)

{if((xx+i)<19||(yy+i)<19) {a=a+wzq[xx+i][yy+i]; if(a==5)

{AfxMessageBox(\白棋胜!\} if(a==-5)

{AfxMessageBox(\黑棋胜!\}

} else over=1; }xx+=1; yy+=1; }while(over==0);

基本的判断方法和横向的判断方法基本相同,在斜线方向判断时,定义一个over变量,代 …… 此处隐藏:1836字,全部文档内容请下载后查看。喜欢就下载吧 ……

《Windows程序设计》信技01 柯学(1)(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/447252.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)