VBNET游戏开发(1-5)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

两个折点连通
两个折点连通使用TwoCornerLink ()实现判断。按p1(x1,y1)点向四个方向探测新z2点与 p2(x2,y2)点可否形成一个折点连通性。
Private Function TwoCornerLink(ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer) As Boolean If x1 > x2 Then '(x1,y1)点和(x2,y2)点交换,保证p1(x1,y1)在p2(x2,y2)点左侧 Dim n As Integer n = x1 : x1 = x2 : x2 = n n = y1 : y1 = y2 : y2 = n End If '右 P1(x1,y1) Dim x As Integer, y As Integer For x = x1 + 1 To m_nCol If x = m_nCol Then '两个折点在选中方块的右侧,且两个折点在图案区域之外 If (XThrough(x2 + 1, y2, True)) Then z2.X = m_nCol : z2.Y = y1 z1.X = m_nCol : z1.Y = y2 Return True Else Exit For End If End If If m_map(y1 * m_nCol + x) <> BLANK_STATE Then Exit For End If If OneCornerLink(x, y1, x2, y2) Then z2.X = x : z2.Y = y1 P2(x2,y2) Return True End If Next
8
2.连通算法
(1)直连方式 在直连方式中,要求两个选中的方块x或y相同,即在一条直线上。并且 之间没有其他任何图案的方块。在3中连接方式中最简单。 (2)一个折点 其实相当于两个方块划出一个矩形,这两个方块是一对对角顶点,另外 两个顶点中某个顶点(即折点)如果可以同时和这两个方块直连,那 就说明可以“一折连通”。 (3)两个折点 这种方式的两个折点(z1,z2)必定在两个目标点(两个选中的方块) p1,p2所在的x方向或y方向的直线上。
14
一个折点连通
If (y2 < y1) Then ‘(x1,y1)为矩形左下顶点,(x2,y2)点为矩形右上顶点 ….. 略 Else '(x1,y1)为矩形左上顶点,(x2,y2)点为矩形右下顶点 '判断矩形左下角折点(x1,y2)是否空 If (m_map(y2 * m_nCol + x1) = BLANK_STATE) Then If (Y_Link(x1, x2, y2) And X_Link(x1, y1, y2)) Then '判断折点 (x1,y2)与两个目标点是否直通 z1.X = x1 z1.Y = y2 '保存折点坐标到z1 Return True End If End If '判断矩形右上角折点(x2,y1)是否空 If (m_map(y1 * m_nCol + x2) = BLANK_STATE) Then If (Y_Link(x1, x2, y1) And X_Link(x2, y1, y2)) Then '判断折点(x2,y1)与两个目标点是否直通 z1.X = x2 z1.Y = y1 '保存折点坐标到z1 Return True End If End If Return False End If End Function 15
5
动物方块布局
5 6 ­1 ­1 6 4 5 7 1
X
1 10 11 3
Y
n
地图中动物方块的图像的 ID
6
n
首先,我们知道每种方块有4个,我们可以先按顺序把每种动物方块 排好放入ArrayList列表tmpMap(临时的地图)中,然后再随机从 tmpMap(临时的地图)中取一个动物方块放入地图m_map中。实 际上程序内部是不需要认识动物方块的图像的,只需要用一个ID来表 示,运行界面上画出来的动物图形是根据地图中ID取资源里的图片画 的。如果ID的值为­1(BLANK_STATE),则说明此处已经被消除掉 了。
图片animal.bmp
4
动物方块布局
0,0 0,1 0,2 1,1 1,1 2,2 3,3 4,4 2,0
X
9,0
Y
0,3
5,5 6,6 7,7 8,8 0,9 9,9
本程序实际上并不是直接使用int二维数组来保存游戏的状态数据,而是采用一 维数组m_map。对地图中的行列数的表达,用一个转换法则即可。 例如:点(x1,y2)对应的数组元素m_map(y2 * m_nCol + x1)。其中m_nCol 是 总列数。当然数组元素下标也可换算出在“网格”地图中坐标点。
P1(x1,y1) z1(x2,y1)
n
P2(x2,y2)
13
一个折点连通
' ' 一个折点连通 ' Private Function OneCornerLink(ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer) As Boolean If (x1 > x2) Then '目标点(x1,y1),(x2,y2)两点交换 Dim n As Integer = x1 x1 = x2 x2 = n n = y1 y1 = y2 y2 = n End If If (y2 < y1) Then ‘(x1,y1)为矩形左下顶点,(x2,y2)点为矩形右上顶点 ….. 略
11
直连方式分为x或y相同情况,分别使用X_Link ()实现判断X直接连通即垂直方向连通 // 和Y_Link ()实现判断Y直接连通即水平方向连通。 Private Function X_Link(ByVal x As Integer, ByVal y1 As Integer, ByVal y2 As Integer) As Boolean '保证y1的值小于y2 If (y1 > y2) Then '数据交换 Dim n As Integer = y1 y1 = y2 y2 = n End If '直通 Dim i As Integer For i = y1 + 1 To y2 If i = y2 Then Return True If (m_map(i * m_nCol + x) <> BLANK_STATE) Then Exit For Next Return False End Function
2
连连看游戏的规则
n n n
连连看游戏的规则总结如下: 两个选中的方块是相同的。 两个选中的方块之间连接线的折点不超过两个。(连接线由x轴和y轴 的平行线组成)。
3
讲解内容
n n n n n n n n n
连连看游戏介绍,及素材 动物方块布局 连通算法——重点讲解 智能查找功能的实现——重点讲解 从所有动物图案的图片animal.bmp中截取相应动物图案 显示游戏的界面 画方块之间连接线 画选中方块的示意边框线 清除选中方块图案及示意边框线
Visual Basic.NET经典游戏编程开发(1 -5章)
主讲人:夏敏捷
Email:xmj@zzti.edu.cn
第1章 连连看游戏
n n
n
连连看游戏介绍 “连连看”是源自台湾的桌面小游戏,自从流入大陆以来风靡一时,也 吸引众多程序员开发出多种版本的“连连看”。“连连看”考验的是各位 的眼力,在有限的时间内,只要把所有能连接的相同图案,两个一对 地找出来,每找出一对,它们就会自动消失,只要把所有的图案全部 消完即可获得胜利。所谓能够连接,指得是:无论横向或者纵向,从 一个图案到另一个图案之间的连线不能超过两个弯,其中,连线不能 从尚未消去的图案上经过。 本章开发连连看游戏游戏具有倒计时功能,玩家时间是200秒,如果 时间到则失败。玩家可以重新开始新的一局游戏。
7
Private Sub StartNewGame() '初始化地图,将地图中所有方块区域位置置为空方块状态 Dim iNum As Integer For iNum = 0 To (m_nCol * m_nRow) ­ 1 m_map(iNum) = BLANK_STATE Next Dim r As Random = New Random() '生成随机地图 '将所有匹配成对的动物物种放进一个临时的地图中 Dim tmpMap As ArrayList = New ArrayList() Dim i As Integer, j As Integer For i = 0 To (m_nCol * m_nRow) \ 4 ­ 1 For j = 0 To 3 tmpMap.Add(i) Next Next '每次从上面的临时地图中取走(获取后并在临时地图删除) '一个动物放到地图的空方块上 For i = 0 To m_nRow * m_nCol ­ 1 '随机挑选一个位置 Dim nIndex As Integer = r.Next() Mod tmpMap.Count '获取该选定物件放到地图的空方块 m_map(i) = CType(tmpMap(nIndex), Integer) tmpMap.RemoveAt(nIndex) '在临时地图除去该动物 Next End Sub
12
一个折点连通
n
一个折点连通使用OneCornerLink(()实现判断。其实相当于两个方块 划出一个矩形,这两个方块是一对对角顶点,见图1­4两个黑色目标 方块的连通情况,右上角打叉的位置就是折点。左下角打叉的位置不 能与左上角黑色目标方块连通,所以不能作为折点。 图1­4 一个折点连通示意图
9
抵消算法流程图
ห้องสมุดไป่ตู้
n
对选中的两个方块(分别在(x1,y1)、(x2,y2)位置) 是否可以抵消的判断如下实现。把该功能封装在IsLink() 方法里面,其代码如下:
10
// 判断选中的两个方块是否可以消除 Private Function IsLink(ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer) As Boolean If x1 = x2 Then 'X直连方式即垂直方向连通 If (X_Link(x1, y1, y2)) Then '使用X_Link ()实现判断垂直方向连通即(x1,y1)和(x1,y2)之间是否联通 LType = LinkType.LineType Return True End If ElseIf y1 = y2 Then 'Y直连方式即水平方向连通 If Y_Link(x1, x2, y1) Then 'Y_Link ()实现判断水平方向连通即(x1,y1)和(x2,y1)之间是否联通 LType = LinkType.LineType Return True End If End If '一个转弯(折点)的联通方式 If OneCornerLink(x1, y1, x2, y2) Then LType = LinkType.OneCornerType Return True ElseIf TwoCornerLink(x1, y1,x2,y2) Then '两个转弯(折点)的联通方式 LType = LinkType.TwoCornerType Return True End If Return False End Function
相关文档
最新文档