VBNET连连看实训报告Word文件下载.docx

上传人:b****6 文档编号:18143484 上传时间:2022-12-13 格式:DOCX 页数:22 大小:387.75KB
下载 相关 举报
VBNET连连看实训报告Word文件下载.docx_第1页
第1页 / 共22页
VBNET连连看实训报告Word文件下载.docx_第2页
第2页 / 共22页
VBNET连连看实训报告Word文件下载.docx_第3页
第3页 / 共22页
VBNET连连看实训报告Word文件下载.docx_第4页
第4页 / 共22页
VBNET连连看实训报告Word文件下载.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

VBNET连连看实训报告Word文件下载.docx

《VBNET连连看实训报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《VBNET连连看实训报告Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。

VBNET连连看实训报告Word文件下载.docx

整理资料,完成设计报告;

第八天:

总结设计情况,上交所有设计资料;

目录

前言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

总结

日月飞逝,时光如梭,转眼间短暂的课程设计周已经结束了,在这几天的项目设计过程中,我学到的东西很多,体会到的东西也很多,有些是在课堂上学不到的东西。

以前总是自己做些简单的项目,很少去深究,因此没有遇到很多的困难。

但是通过这几天的学习与工作,我学到了很多的知识,并且将专业课程系

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

当前位置:首页 > 初中教育 > 科学

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

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