VBNET连连看实训报告Word文件下载.docx
《VBNET连连看实训报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《VBNET连连看实训报告Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。
整理资料,完成设计报告;
第八天:
总结设计情况,上交所有设计资料;
目录
前言4
1绪言5
1.1连连看游戏介绍5
2实现本程序所采用的技术6
3功能模块设计7
4我负责的工作7
4.1连连看游戏数据模型7
4.2动物方块布局8
4.3连通算法10
4.4抵消算法流程图11
4.5一折点连通算法12
4.6二折点连通算法14
4.7水平方向判断到边界的连通性17
4.8垂直方向判断到边界的连通性17
4.9只能查找功能的实现18
总结19
致谢20
前言
微软的NET战略是一场软件革命,它改变了开发人员开发应用程序的方式及思想方式,是的开发人员能创建出各种全新的应用程序,这些应用程序在.NET框架下实现的,“VisualBasic.NET是.NET框架的支柱”。
VisualBasic.NET程序结构十分清晰,易于学习和使用,同时又不失灵活性和强大的功能,他在开发能力和效率之间取得较好的平衡。
它不仅具有快速开发应用程序的能力,而却具有C++的基本特征——面向对象。
VisualBasic.NET已成为功能强大的面向对象的编程语言。
本程序是基于VisualBasic.NET平台上所编写的一个益智类游戏——宠物连连看。
1绪言
1.1连连看游戏介绍
“连连看”是源自台湾的桌面小游戏,自从流入大陆以来风靡一时,它是不分男女老少,适合大众的集休闲、趣味,益智和娱乐于一体的经典小游戏。
“连连看”考验的是各位的眼力,在有限的时间内,要把所有能连接的相同图案,两个一对地找出来。
每找出一对,它们就会自动消失,只要把所有的图案全部消完即可获得胜利。
所谓能够连接,指的是:
无论横向或者纵向,从一个图案到另一个图案之间的连线不能超过两个弯(中间的直线不超过三根),其中,连线不能从尚未消去的图案上经过。
本程序的连连看游戏效果如图1.1所示。
游戏具有到计时功能,玩家时间是200秒。
如果时间到玩家还没完成,则失败。
玩家可以重新开始新的一局游戏。
玩家第一次使用鼠标单击游戏界面中的动物方块,该方块此时位被选中状态,以特殊方式(红色方块)显示;
再次单击其他方块,如第二个方块与被选中的方块图案相同,且把第一个方块与第二个方块连起来,中间的直线不超过三根,则消掉这一对方快,否则第一个方块恢复成未被选中状态,而第二个方块变成被选中状态。
本游戏增加只能查找功能,当玩家自己无法找到时,可以右键单击画面或菜单栏内选择提示按钮,则会出现提示可以消去的两个方块(被加上蓝色边框线)。
图1.1
2实现本程序所采用的技术
该连连看游戏采用了VisualBasic.NET开发工具。
微软公司最新发布的VisualBasic.NET完全支持面向对象技术,是在现有VisualBasic6.0基础上的一次重大飞跃。
本程序采用了一位数组用来绘制游戏地图,并采用绘制图像、鼠标相关事件等实现本程序的技术实现。
3功能模块设计
图3.1
4我负责的工作
4.1连连看游戏数据模型
对于游戏玩家而言,游戏界面上看到的“元素”千差万别、变化多端;
但对于游戏开发者而言,游戏界面上的元素在底层都是一些数据,只是不同数据所绘制的图片有差异而已。
因此建立游戏的状态数据模型是实现游戏逻辑的重要步骤、
连连看的游戏界面是一个N×
M的“网络”地图,没个网络上显示一张图片。
但对于游戏开发者来说,这个网络只需要用一个二维数组来定义即可,而每个网络上所显示的图片,对于底层的数据模型来说,不同的图片对应于不同的数值即可。
连连看的数据模型如图4.1所示。
对于图4.1所示的数据模型,只要让数值为-1(BLANK_STATE)的网络上不绘制动物图片,其他数值是动物方块的图像ID,非-1(BLANK_STATE)的网络则绘制相应的动物图片,就可显示出连连看的游戏界面。
本程序实际上并不是直接使用int二位数组来保存游戏的状态数据,而是采用一位数组m_map。
对地图中的行列数的表达,用一个转换法则即可。
例如,点(x,y)对应的数组元素m_map(y*m_nCol+x)。
其中,m_nCol是总列数。
当然数组元素下标也可换算出在“网络”地图中的坐标点。
图4.1
4.2动物方块布局
由于方块需要成对地出现,因此,在对地图初始化的时候,不应该仅仅对动物方块的图像ID做简单的随机取数,然后将该随机选出来的物件放到地图区域中去,而且需要成对地对动物方块的图像进行选取,就是说地图区域中的小方块必须是哦数个才行。
这里引入一个临时地图tmpMap,该临时地图的大小和世纪地图m_map的大小一致。
并且先添置好4组完全一样的图像类型ID数据(0~m_nCol*m_nRow/4)。
也就是说每种图像方块有四个。
首先我们可以按顺序把每种动物方块(实际上就是标号ID)排号放入ArrayList列表tmpMap(临时地图)中。
实际上程序内不是不需要认识动物方块的图像的,只需要用一个ID来表示,运行界面上画出来的动物图形是根据地图中的ID获取资源里的图片画的。
如果ID的值为-1(BLANK_STATE),则说明此处已经被消除了。
代码:
PrivateSubStartNewGame()
'
初始化地图,将地图中所有方块区域位置置为空方块状态
DimiNumAsInteger
ForiNum=0To(m_nCol*m_nRow)-1
m_map(iNum)=BLANK_STATE
Next
DimrAsRandom=NewRandom()
生成随机地图
将所有匹配成对的动物物种放进一个临时的地图中
DimtmpMapAsArrayList=NewArrayList()
DimiAsInteger,jAsInteger
Fori=0To(m_nCol*m_nRow)\4-1
Forj=0To3
tmpMap.Add(i)
Nextj
Nexti
每次从上面的临时地图中取走(获取后并在临时地图删除)
一个动物放到地图的空方块上
Fori=0Tom_nRow*m_nCol-1
随机挑选一个位置
DimnIndexAsInteger=r.Next()ModtmpMap.Count
获取该选定物件放到地图的空方块
m_map(i)=CType(tmpMap(nIndex),Integer)
在临时地图除去该动物
tmpMap.RemoveAt(nIndex)
EndSub
PrivateSubInit_Graphic()'
生成游戏开始的界面
DimgAsGraphics=get_Graphic()'
生成Graphics对象
DimiAsInteger
Fori=0To10*10-1
Ifm_map(i)<
>
BLANK_STATEThen
g.DrawImage(create_image(m_map(i)),W*(iModGameSize)+W,W*(i\GameSize)+W,W,W)
Else
清除选中方块
ClearSelectedBlock(iModGameSize,i\GameSize,g)
EndIf
4.3连通算法
(1)直连方式
在直连方式中,要求两个选中的方块x或y相同,即在一条直线上。
并且之间没有其他任何图案的方块。
在3中连接方式中最简单。
(2)一个折点
其实相当于两个方块划出一个矩形,这两个方块是一对对角顶点,另外两个顶点中某个顶点(即折点)如果可以同时和这两个方块直连,那就说明可以“一折连通”。
(3)两个折点
这种方式的两个折点(z1,z2)必定在两个目标点(两个选中的方块)p1,p2所在的x方向或y方向的直线上。
4.4抵消算法流程图
图4.3.1
对选中的两个方块(分别在(x1,y1)、(x2,y2)位置)是否可以抵消的判断如下实现。
把该功能封装在IsLink()方法里面,
其代码如下:
//判断选中的两个方块是否可以消除
PrivateFunctionIsLink(ByValx1AsInteger,ByValy1AsInteger,ByValx2AsInteger,ByValy2AsInteger)AsBoolean
Ifx1=x2Then'
X直连方式即垂直方向连通
If(X_Link(x1,y1,y2))Then
使用X_Link()实现判断垂直方向连通即(x1,y1)和(x1,y2)之间是否联通
LType=LinkType.LineType
ReturnTrue
ElseIfy1=y2Then'
Y直连方式即水平方向连通
IfY_Link(x1,x2,y1)Then
Y_Link()实现判断水平方向连通即(x1,y1)和(x2,y1)之间是否联通
一个转弯(折点)的联通方式
IfOneCornerLink(x1,y1,x2,y2)Then
LType=LinkType.OneCornerType
ElseIfTwoCornerLink(x1,y1,x2,y2)Then'
两个转弯(折点)的联通方式
LType=LinkType.TwoCornerType
ReturnFalse
EndFunction
直连方式分为x或y相同情况,分别使用X_Link()实现判断X直接连通即垂直方向连通//
和Y_Link()实现判断Y直接连通即水平方向连通。
PrivateFunctionX_Link(ByValxAsInteger,ByValy1AsInteger,ByValy2AsInteger)AsBoolean
保证y1的值小于y2
If(y1>
y2)Then
数据交换
DimnAsInteger=y1
y1=y2
y2=n
直通
Fori=y1+1Toy2
Ifi=y2ThenReturnTrue
If(m_map(i*m_nCol+x)<
BLANK_STATE)ThenExitFor
4.5一折点连通算法
一个折点连通使用OneCornerLink(()实现判断。
其实相当于两个方块划出一个矩形,这两个方块是一对对角顶点,见图4.3.2两个黑色目标方块的连通情况,右上角打叉的位置就是折点。
左下角打叉的位置不能与左上角黑色目标方块连通,所以不能作为折点。
图4.3.2
PrivateFunctionOneCornerLink(ByValx1AsInteger,ByValy1AsInteger,ByValx2AsInteger,ByValy2AsInteger)AsBoolean
If(x1>
x2)Then'
目标点(x1,y1),(x2,y2)两点交换
DimnAsInteger=x1
x1=x2
x2=n
n=y1
If(y2<
y1)Then'
(x1,y1)为矩形左下顶点,(x2,y2)点为矩形右上顶点
判断矩形右下角折点(x2,y1)是否空
If(m_map(y1*m_nCol+x2)=BLANK_STATE)Then
If(Y_Link(x1,x2,y1)AndX_Link(x2,y1,y2))Then
判断折点(x2,y1)与两个目标点是否直通
z1.X=x2
z1.Y=y1'
保存折点坐标到z1
判断矩形左上角折点(x1,y2)是否空
If(m_map(y2*m_nCol+x1)=BLANK_STATE)Then
If(Y_Link(x2,x1,y2)AndX_Link(x1,y2,y1))Then
判断折点(x1,y2)与两个目标点是否直通
z1.X=x1
z1.Y=y2'
Else'
(x1,y1)为矩形左上顶点,(x2,y2)点为矩形右下顶点
判断矩形左下角折点(x1,y2)是否空
If(Y_Link(x1,x2,y2)AndX_Link(x1,y1,y2))Then
判断矩形右上角折点(x2,y1)是否空
判断折点(x2,y1)与两个目标点是否直通
4.6二折点连通算法
两个折点连通使用TwoCornerLink()实现判断。
按p1(x1,y1)点向四个方向探测新z2点与p2(x2,y2)点可否形成一个折点连通性。
图4.3.3
PrivateFunctionTwoCornerLink(ByValx1AsInteger,ByValy1AsInteger,ByValx2AsInteger,ByValy2AsInteger)AsBoolean
Ifx1>
x2Then
(x1,y1)点和(x2,y2)点对调
DimnAsInteger
n=x1:
x1=x2:
n=y1:
y1=y2:
右
DimxAsInteger,yAsInteger
Forx=x1+1Tom_nCol
Ifx=m_nColThen
两个折点在选中方块的右侧,且两个折点在图案区域之外
If(XThrough(x2+1,y2,True))Then
z2.X=m_nCol
z2.Y=y1
z1.X=m_nCol
z1.Y=y2
ExitFor
Ifm_map(y1*m_nCol+x)<
IfOneCornerLink(x,y1,x2,y2)Then
z2.X=x
左
Forx=x1-1To-1Step-1
Ifx=-1Then
两个折点在选中方块的左侧,且两个折点在图案区域之外
If(XThrough(x2-1,y2,False))Then
z2.X=-1
z1.X=-1
上
Fory=y1-1To-1Step-1
Ify=-1Then
两个折点在选中方块的上侧,且两个折点在图案区域之外
If(YThrough(x2,y2-1,False))Then
z2.X=x1
z2.Y=-1
z1.Y=-1
Ifm_map(y*m_nCol+x1)<
IfOneCornerLink(x1,y,x2,y2)Then
z2.Y=y
下
Fory=y1+1Tom_nRow
Ify=m_nRowThen
两个折点在选中方块的下侧,且两个折点在图案区域之外
If(YThrough(x2,y2+1,True))Then
z2.Y=m_nRow
z1.Y=m_nRow
EndFunction
4.7水平方向判断到边界的连通性
Xthrough()用于水平方向判断到边界的连通性,如bAdd为True,则从(x,y)点水平向右直到边界,判断是否全部为空块;
如bAdd为false,则从(x,y)点水平向左直到边界,判断是否全部为空块。
PrivateFunctionXThrough(ByValxAsInteger,ByValyAsInteger,ByValbAddAsBoolean)AsBoolean'
水平方向判断到边界的连通性
If(bAdd)Then'
True,水平向右判断是否连通(是否为空)
Fori=xTom_nCol-1
If(m_map(y*m_nCol+i)<
BLANK_STATE)ThenReturnFalse
false,水平向左判断是否连通(是否为空)
Fori=0Tox
4.8垂直方向判断到边界的连通性
Ythrough()用于垂直方向判断到边界的连通性,如bAdd为True,则从(x,y)点垂直向下直到边界,判断是否全部为空块;
如bAdd为false,则从(x,y)点垂直向上直到边界,判断是否全部为空块。
PrivateFunctionYThrough(ByValxAsInteger,ByValyAsInteger,ByValbAddAsBoolean)AsBoolean'
垂直方向判断到边界的连通性)
True,垂直方向向下判断是否连通(是否为空)
Fori=yTom_nRow-1
false,垂直方向向上判断是否连通(是否为空)
Fori=0Toy
4.9只能查找功能的实现
图4.4.1
在地图上自动抄找出一组相同可以抵消的方块,可采用遍历算法。
整个流程如图4.4.1
总结
日月飞逝,时光如梭,转眼间短暂的课程设计周已经结束了,在这几天的项目设计过程中,我学到的东西很多,体会到的东西也很多,有些是在课堂上学不到的东西。
以前总是自己做些简单的项目,很少去深究,因此没有遇到很多的困难。
但是通过这几天的学习与工作,我学到了很多的知识,并且将专业课程系