为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

用Excel+VBA编写俄罗斯方块游戏

2012-10-19 11页 pdf 795KB 117阅读

用户头像

is_047559

暂无简介

举报
用Excel+VBA编写俄罗斯方块游戏 ⋯ ⋯ G姗 EPROGRAM ⋯ .⋯ ⋯⋯⋯ ⋯⋯ ⋯ ⋯⋯⋯ ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ ⋯⋯ j 宴鼍 ¨¨ 用 gxcll 编写俄罗斯方块游爱 -- i 一 = i 。 许 囊。 ⋯ 鬻社 瞎 l 一 摘 要: “俄罗斯方块”作为一款经典的休闲游戏在新鲜出炉时就显得非常直观,虽然经过 了大量的 变形 和更改 ,但 游戏 核心依然保持 不变 。文 中以 Excel 2007为游戏平 台.利 用 VBA及 Excel的功能和属性 ,详细地介绍了俄罗斯方块程序游戏编写过程。 关键词:...
用Excel+VBA编写俄罗斯方块游戏
⋯ ⋯ G姗 EPROGRAM ⋯ .⋯ ⋯⋯⋯ ⋯⋯ ⋯ ⋯⋯⋯ ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ ⋯⋯ j 宴鼍 ¨¨ 用 gxcll 编写俄罗斯方块游爱 -- i 一 = i 。 许 囊。 ⋯ 鬻社 瞎 l 一 摘 要: “俄罗斯方块”作为一款经典的休闲游戏在新鲜出炉时就显得非常直观,虽然经过 了大量的 变形 和更改 ,但 游戏 核心依然保持 不变 。文 中以 Excel 2007为游戏平 台.利 用 VBA及 Excel的功能和属性 ,详细地介绍了俄罗斯方块程序游戏编写过程。 关键词:Excel;VBA;俄罗斯方块 俄罗斯方块这款经典游戏可 以说 是家喻户晓。游戏的概念 十分简单,游戏区域顶部随机落下各种形状各异的方块 ,玩家 要试图用它们拼成没有空隙的行并赢得分数 。俄罗斯方块验证 了 “简单 的往往是最好的”这样一个道理 .方块之 中似乎蕴藏 着无穷 的魔力 ,至今仍 经久不衰 ,相信现在还有不少人 在闲暇 之余会玩上几把消遣一下 很多编程爱好者都 曾经编写过 自己的俄罗斯方块游 戏 ,现 在将带领大家一步步实现一个 Excel版本的俄罗斯方块。 图 1是实现的游戏 界面 。 图 1 Excel俄 罗斯方块 首先打开 Excel 2007,新建一个T作簿并 将其保存为 Excel启用宏的工作簿 ,文件名为 Excel俄罗斯方块.xlsm,并 将工作 “Sheetl”重命名 为 “TETRIS”.作为游 戏界面 并调 整此丁作表中的列宽和行宽至合适大小并 使其 大小一致 ,因为 在游戏中单元 格将被用来组成方块 ,如果大小不合适或不一致 对游戏的效果影响很大。本例中游戏区域的行宽和列宽都为 16像素大小。 1 设置 人机界面 1.1 定义游戏 区域 操作步骤 : (1)选中单元格区域 E2:R25,共 24行 14列,此区域即 为方块 的活动范 围 ,当方 块向上 累计触及 到 “TETRIS”工作 表 的第二行同时也是游戏 区域 的顶部时游戏结束 。 (2)在编辑栏左端的 “名称”框中键入名称 “GameArea” 并按下 “Enter”键 。 (3)对区域 “GameArea”左右两边的列以及区域底部下 一 行单元格进行修饰美化,采用适当的颜色进行填充.这些区 域将用作方块的 “围墙”,注意一定要使用某种颜色进行填充. 因为这将是判断方块是否能够移动的重要依据.具体判断方法 将会在下面详细介绍。修饰结果如图2所示。 图 2 游戏 区域修饰结果 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ‘ ’ ⋯ ⋯ ⋯ ~ ⋯ ⋯ ⋯ ⋯ 一 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ” 实用第一 智慧密集 . 。 。 。 。 。 ⋯ 1.2 定义下一个方块 的显示区域 (1)选中单元格区域 T15:W16,共 2行 4列,作为显示 下一个方块的区域 。 f 2) 在 编 辑 栏 左 端 的 “名 称 ” 框 中 键 人 名 称 “NextBlockArea”并按下 “Enter”键 。 1.3 定义方块数据区域 (1)选 中单元格区域 AY3:BF37,共 35行 8列 ,作为存 储游戏中方块的初始位置数据及旋转数据的区域,游戏进行时 将从 中读取相关数据,以产生和旋转方块 。 (2) 在 编 辑 栏 左 端 的 “名 称 ” 框 中 键 人 名 称 “BlockDataArea”并按下 “Enter”键 。 本区域中存放每种方块的初始位置数据以及旋转数据,这 些数据也可以在代码中直接对相应变量进行赋值,但是会增加 很多的代码量且很不直观 ,这里采用代码从此区域读取数据来 初始化各方块 .能克服以上缺点。 1.4 添加两个 Shape 游戏中每当方块积满一行 要进行消行加分的操作 .因此游 戏界面中需要有显示当前分数和最高分数的区域与用户交互 . 为了增强美观性 ,这里采用 Shape来作为分数显示 的载体。在 游戏主界面中插入 4个 Shape,并分别对其进行修饰美化,显 示 当前得 分 的 Shape和 显 示 最高 得 分 的 Shape分 别 命名 为 “CurrentSeore”和 “HighScore”。如图 3所示。 ≤j , p l I 甏 ∞ 登 薹 囝 一臻 :鹪 // ~ 图 3 显示分数的 shapes 1.5 添加 “开始”和 “结束”按钮 在游戏主界面中插人 2个 Shape,并分别对其进行修饰美 化 ,编辑文字 “开始 ”和 “结束 ”,为玩家提供开始游戏和结 束游戏的功能 (如图 4)。分别为其指定宏 “StartGame”和 “StopGame”。 图 4 “开始”和”结束”按钮 至此实现的游戏界面如图 5所示 。 潮 一 _ 自 掬峨 自 黼 【 嘲舒 ca J 嘲 , 拍翰睫 _ ! l l 冀 4 釜 誊 § l : E噩圈匿涠瞄I 涠匿_謦_噩渤 E 图 5 完成的游戏界面 2 定制方块数据 在俄罗斯方块游戏的实现过程中 .对俄罗斯方块的抽象 以 及 数据结构的设计是整个过程的核心 。 2.1 创建数据结构 经典的俄罗斯方块游戏中共有 7种典型类型的方块 .分别 如 图 6所示 。 1 2凹ji圜圈 5I l 6l l 7I l it" —‘ j r l 图 6 经典俄罗斯方块游戏中七种典型方块 从图6中可以看出每一种类型的方块虽然形状各异,但是 都有一个共同的特点就是它们都是由小方块所组成的并且小方 块的数 目都是4个。因此,为了建立描述俄罗斯方块的数据结 构,有必要首先建立一种数据结构来合理地描述这些小方块。 每个小 方块仅有 两种 属性 ,即其在游戏 区域 中所处的行和列 。 创建表示小方块 的自定 义数据类型 SmallBoxPos结构如下: Private Tvpe SmallBoxPos Row As Integer Column As Integer End Type 其 中 Integer型变量 Row存储小 方块 当前所 在的行 , 熊鬻 . ⋯ G^ 啊EPROGRAM ⋯ ⋯⋯~.. ⋯ ⋯⋯ ⋯⋯⋯ ⋯⋯一⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ ⋯ Column变量存储小方块 当前所在 的列 。 在玩家按下 向上键 时方块会顺 时针旋转 9O度 ,这 时方块 的形状会发生变化 .同时各个小 方块 之间的相 对位置也会发生 变化 ,各方块的变化情况如图 7所示 。图 7中左边一列 的 1—7 表示七种类 型的方块 ,顶部的 1—4表示每种方块的 四种旋转状 态 。从 图 7中可 以看 出 ,每种 方块都 有 四种不 同的旋转状 态 (第一种方块只有两种状态 和第二种方块 只有一种状态 ),每按 一 次 向上方向键 ,方块便会向下一个状态变化 ,当第 四次按下 向上键时方块会回归原来的状态.第一种方块和第二种方块同 样适合此规律。如此周而复始。 根据 上面的叙 述 .下 面创建 自定义数 据类 型 TetrisBox来 表示俄罗斯方块 。 (1)首先一个方块是 由四个小方块组成 的,所 以 TetrisBox 结构 中应包括 一个 SmallBoxPos类 型的数组 ,数组元素个 数应 为 4个 ,分别代表其包含的 4个小方块 。 (2) 为 了进 行 方 块 是 否 能 够 继 续 下 落 或 移 动 的判 断 , TetrisBox结构 中应包含当前方块 在下 一个 位置时的各个小方块 的位置信息,这些信息同样由SmallBoxPos类型的数组来存储。 这里的下一个位置不仅仅是指方块下落时的下一个位置 ,方块 图 7 七种典型方块的各种旋转情况 左移 、右移 、旋转等等都属于下一个位置的范畴 ,只要方块的 形态或位置发生了变化.则新变化的信息都将暂存到这个数组 中。 (3)每种方块有 4种旋转状态 ,TetrisBox结构中应包 含一 个 Integer型变量来标识方块 当前所处的旋转状态 。 (4)在玩家按下 向上键 时方块会 进行旋转变形 ,TetrisBox 结构中应包含支持其进行旋转变形的数据,这些数据可以由一 个二维数组进行存储,其中第一维存储方块旋转状态,第二维 存储每一种旋转状态下的小方块的信息。 (5)游戏 中应采用一定的标识 来区分不同种类的方块 ,本 例中采用颜 色作为 不同种类 方块 的标识 ,所 以 TetrisBox结构 中应包含一个 Integer型变量存储 方块 的颜色 。 (6)此外 TetrisBox结构 中还应包 含一 个 Boolean型变量来 存储当前方块是否 已经停止下落。 综上所述 ,创建 自定 义数据类型 TetrisBox如下 : Private Type TetdsBox Color As I nteger HasStopped As Boolean Sm8IIBoxInCurrentBtock(1 To 4)As SmallBoxPos SmallBoxlnNextPos(1 To 4)As SmatlBoxPos CurrentRotateState As Integer RotateChangeData(1 To 4,1 To 4)As SmallBoxPos End Type 其 中 Integer型变 量 Color存 储方块 的颜色 ,Boolean型变 量 HasStopped存储方块是否已经停止下落,SmallBoxPos型数 组 SmallBoxlnCurrentBlock f1 To 4)存储 当前 方块 中每个 小方 块 所 处 的 行 和 列 的 信 息 , SmalIBoxPos 型 数 组 SmallBoxlnNextPos (1 To 4)存储方块在下一个位置时的每个 小方块所处的行和列的信息,CurrentRotateState存储当前方块 所处的旋转状态,SmallBoxPos型二维数组 RotateChangeData(1 To 4,1 To 4)存储实现方块旋转所需要的数据 ,其 中前面一维 1 TO 4代表第一至第四四种旋转状态,后面的一维分别代表四 个小方块 。 2.2 定制俄罗斯方块数据 BlockDataArea区域 存放 各种方 块的初 始位 置数据及 其 向 下一个旋转状态进行变化所需 的支持数 据 ,程序根据 这些数据 可以得出此方块下一个旋转状态时的形状 。 此 区域共 35行 8列 ,游戏 中共 有 7种方块 ,每种方块对 应 BlockDataArea区域 中的 5行数据 ,其 中第 1行为该 种类型 方块出现在游戏区域顶端的位置即各个小方块出现在游戏区域 顶端时所处 的行和列 ,下面 4行分别为方块 在四种状 态之 间进 行变化时各个小方块所处的行和列的变化情况,通过这些行列 变化信息,在程序中可以很容易地计算出下一个状态时的方块 形 状 (1)方块初始位置数据的填充 匝 匣 匣 匿 匮 自 凹 一日圈目嗣 匝 区一 匿匾匾 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ‘ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 实用第一 智慧密集 ± ∞ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ b ⋯ ⋯ ⋯ ⋯ 、 Ni ± 每 种方 块共 有 4个 小 方 块 .位 置分 为行 和 列 。所 以将 BlockDataArea区域的 8列分为两部分 .前 4列分别代表 1、2、 3、4号小方块m现在游戏区域的行.后面 4列分别代表各小 方块 出现在游戏区域的列。 下面以第一种方块做解释 (如 图 8)。 方块出现时应在游戏区域顶端 的中部位置 ,此方块为一横 杠,只占据一行,所以其 1、2、3、4号小方块出现时都将处 在游 戏区域 的第一行 ,因为定义的游戏区域共有 l2列 ,所 以 : 其各个小方块应相应}n现在游戏区域的第 5、6、7、8列才能 保证 整体方块 出现在游戏 区域顶部 中间位 置 。分 别将 1、1、 1、1、5、6、7、8填人相应单元格 ,这些数据将 在初始化方 块时被读取并存储到相应变量 中。 2 3 4 圈田目田 图 8 第一种方块的初始位置数据 第三种方块的初始行列数据如图 8所示 。 圜田 圜 图 9 第三种方块的初始位置数据 其他方块的初始位置数据 由此类推即可。 (2)方块旋转支持数据的填充 因为每个方块都是由同样数目的小方块组成,每个小方块 都有所处的行和列两种属性 ,而在方块旋转变化时,小方块的 这两种属性也会跟着变化 ,可以通过对这些小方块的行和列的 增减情况进行描述来得到整体方块的状态 。 下面以第一种方块的变化情况进行。 当方块进行第一次旋转 .由第一种状态变为第二 种状 态 , 1号小方块所处 的行减少 了 1,列增加了 1,将一1和 1分别填 入 BlockDataArea第二 行的行 和列部分 的第一 个单元 格中 。2 号小 方块 的行 和 列 均 没 有 变 化 .因 此 将 O和 0分 别 填 入 BlockDataArea第二行 的行和列部分 的第二个单元格中。3号小 方块所处 的行增加了 l,列减少 了 1,将 1和一1分别填人 BlockDataArea第二行的行和列部分 的第 个单元格 中。4号小 方 块 的 行 增 加 了 2, 列 减 少 了 2,将 2和 一2分 别 填 人 BlockDataArea第二行的行和列部分的第四个单元格中。 当方块继续旋转.由第二种状态变为第三种状态时.1号 小方 块所处 的行增 加 了 1,列 增加 了 2,将 1和 2分别 填人 BlockDataArea第 i行的行 和列部分的第一个单元格 中。2号小 方块 的行没有变化 ,列增加了 1,因此将 0和 1分别填人 BlockDataArea第三行的行和列部分的第二个单元格中。依次 类 推完成本 次旋转数据的输入。 面 与 第一种方块全部数据完成的结果如图 10所示。 目田圉阳 图 1O 第一种方块 的初始位置数据以及旋转数据 同样操作完成所有 7种方块数据 的输入 ,结果 如图 l1所 2 3 4 田目 凹凹 『1I 图 1 1 全部 7种方块 的初始位置数据以及旋转数据 完成方块数据的输入后 ,下面介绍如何在程序 中通过读取 这些数据对方块进行初始化。 因为本例中共使用了7种不同的方块,故定义 TetrisBox 型数组 Blocks f1 T0 71表示这 7种方块 。定义如下 : Private Blocks(1 T0 7) As TetrisBox 对 Blocks(1)至 Blocks(7)各 方块进 行初 始化 即是读取 BlockDataArea区域的数据并对相应变量进行赋值的过程,实 现代码如下 : Private Sub InitBIock() IDim f As Integer,j As Integer,k As Integer IBlocks(1).Color=23 IBlocks(2)。Coler=25 Blocks《3).Color=27 Blocks(4).Colo~:29 Blocks(5).Color=43 Blocks(6]1.Color=46 匝 匣 , E 匡 叵 + , ⋯ B^ 啊EPROGRAM ⋯ ⋯ ⋯ ⋯⋯⋯⋯ ⋯, ⋯⋯ ⋯ ⋯⋯⋯⋯⋯⋯ .⋯ ⋯.⋯⋯⋯⋯. . ⋯ ⋯⋯⋯⋯ ⋯⋯ Blocks(7).Color= 1 0 For k= 1 TO 7 With Blocks(k) For i=1 T0 4 每种方块最多 4个小方块 .SmallBoxlnCurrentBIock (i).Row = Range (“ BlockDataATea ).Cells (1+ (k一 1) 5,i).Value Range《 BlockDataArea”) .SmallBoxlnCurrentBtock 《i).Column = Range (” BlockDataArea )Cetls(1 4-(k一1) 5,i+4).Value Next For_=1 To 4 共 4种旋转状态 For i=1 To 4 共 4个小方块 .RotateChangeData (i, j).Row = Range (“ BlockDataArea ).Cells(i 4-1 4-(k一1) 5,j).Value .RotateChangeData (i, j).Column = Range (“ BlockDataArea”).Cells(i 4-1+(k一1) 5,i+4).Value Next Next .HasStopped=False .CurrentRotateState: 1 EndW ith Next End Sub 实现方块旋转代码 为 : W ith CurrentBfOck For i=1 TO BL0CKSNUMBER .SmallBoxlnNextPos(i).Row :. SmallBoxlnCurrentBIock(i).Row 4-.RotateChangeData (.CurrentR0tateState,i).Row .SmallBoxlnNextPos(i).Column= SmallBoxlnCurrentBIock(i).CoIun1n+.ROtateChangeData (.CurrentRotateState,i).Column Next If ChecklfCanMOvefCurrentBIOck)Then .CurrentRotateState=.CurrentROtateState+ 1 · If .CurrentROtateState = 5 Then . CurrentRotateState=1 End If End W ith 3 代码实现 俄罗斯方块 的游戏过程是 :用 户点击 “开始”游戏按 钮 , 从游戏区域的顶部 开始不断地落下各种形状不 同的方块 ,并 同 时产生下一个将要 出现 的方块供用户参考 。用户可 以通过按下 不同的方 向键来操 作下落 中的方块 ,使其左移 、右移 、旋转 变 形或者加速下落,当方块停Jj=下落时检测是否有填满的行,如 果有要进行消行并 给予用户一定的分数奖励 。如果方块触及 到 了游戏区域的顶部则游戏结束。 整个游戏过程分为两大部分: (1)正常的游戏流程,即在没有用户操作的情况下,方块 将不断下落直至停 止,然后产生新的方块并重复这个过程直至 方块触及到游戏区域顶端,则游戏结束。 (2)玩家操作流程。下落中的方块在玩家操作下会产生左 移 、右移 、旋 转 、加 速下落等 效应 。这一流程 独立 于上 一部 分 ,即在没有用户操作的影响下 ,俄罗斯方块游戏也会继续进 行 ,只是方块 只能持续不停下落而少 了上述 的变化及移动 。 由上面的分析 中可以看出 ,实现一个最基本的俄 罗斯 方块 游戏需要文现以下过程或函数,如表 1所示。 表 1 编号 两数或过 名 功能 1 StartGame() 开始游戏 StopGame() 结求游戏 lnitBIock(1 列方块数据进行仞始化 4 CreatcNextBlock 譬成 F 个南块 5 GoDown 方块 F落 6 CheckIfCanMOVe 检测 l,J块 世告“l以移动 DrawG,dmeArea 重蝴游戏区域 8 (heckFullRow( 枪测满行 9 AddScore 满行则进行加分操作 l0 ChecklI allle0VCr -判断游戏烂台站束 午挺据话动单兀格帕变化得到用, 输入 i1 W(~rksheet SelectionChange r拱【行十{{』域动竹 根据活动单元格的变化得 到用户输入并执行相应动作 下面就是俄罗斯方块 游戏 的流程图 ,如图 12所示。 “Ah+F11” 打开 VBE编 辑 器 .双击 T程 资 源 管理 器 中 Sheett对象 打开代码 窗 口,在其 中定义程序 中将要用到 的变量 及 白定义数据结构如下 : Option Explicit Private Type SmallBoxPos Row As Integer Column As Integer EndType Const BLOCKSNUMBER=4 Private Type TetrisBox Color As Integer 颜色 HasStopped As Boolean 方块是否已经停止下落 SmallBoxlnCurrentBlock(1 To 4)As SmallBoxPos 当前方块 SmaIIBoxlnNextPos(1 To 4)As SmaIIBoxPos 下一个方块 CurrentRotateState As Integer 当前 的旋转状态 RotateChangeData(1 To 4,1 To 4)As SmaiIBoxPos 进行旋转所需要的数据 End Type Private CurrentBIock As TetrisBox 当前方块 Private BIocks(1 To 7)As TetrisBox 总共7种方块 Private IsGameOver As Boolean 游戏是否结束 Dim GameSpeed As Double 游戏速度 Dim PreNextBlock As Integer 下一个方块序号 黼 V 图 12 俄罗斯方块游戏流程图 l· · 一 ⋯ ⋯ ‘ x q · , t · ^ ‘ · 、 ' · ^ ‘ ‘ ■ 实用第一 智慧密集 3.1 开始游戏 Private Sub StartGame() Dim tAs Double Dim CurrentScore As Long Dim HighScore As Long Shapes ( CurrentScore“).TextEffect.Text = Format (O.” 000000 J Application.EnableEvents=True IsGame0ver=False Range(“GameArea”).Clear Cells(21.21).Activate CalIInitBIock CalI CreateNextB ock(CurrentBlock) GameSpeed=0.4 Do Whlie Not lsGameOver 不是游戏结束则进行循环 Call GoDown(CurrentBIock) t=Timer D0 While Timer—tHighScore Then l I。 Shapes 《”HighScore ).TextEffect.Text = ;Shapes r CurrentScore”).TextEffect.Text End ff Call MsgBox( 游戏结束“) IsGameOver=True 。“ End Sub 开始游戏过程首先清除 GameArea区域,将当前分数清O, 并 将 基 准 单 元 格 Ceils(21,21)激 活 ,为 使 用 Worksheet的 SelectionChange事件得到用户输入提供基础。初始化各方块并 产生第一个方块。设置游戏速度并根据速度建立游戏循环。在 游戏循环 中,方块不断下落,下落停止后继续产生下一个方块 继续循环。游戏结束后判断当前得分是否高于最高得分,如果 高于则对最高得分进行修改。 Shapes 《”CurrentScore”).TextEffect.Text: FOrmat(0, 000000”} 作用 :将代表当前分数的 shape清 0 Shape.TextEffect属 性 :该属 性返 回 一个 TextEffectFormat 对象 ,它包含指定形状 的文本效果格式属性 。TextEffectFormat. Text属性返 回或设置指定对象中的文本。String型,可读写 。 Range(”GameArea”).Clear 清 除 GameArea区域 以进行新的游戏 Cells(21,21).Activate 激活单元格 Cells(21,21),此后就可以根据 活动单元格 的 变化判断出用户按下了什么方向键。 t=Timer D0 W hile Timer—txlNone And. d=””Then ChecklfCanMove:False End If End W ith Next For i=1 T0 BLOCKSNUMBER Range (”GameArea ).Cells (.SmallBoxlnCurrentBtock(i). Row,.SmallBoxlnCurrentBIock《i).Column).id:⋯‘ Next EndW |th End Function 3.5 检测是否满行 要检测 当前游戏区域 中是否存 在满行的方块 ,可以从 游戏 区域 的最底一行开始 ,循 环检 测当前行 的每一个单元格 的填充 颜 色是否为空 。如果有一个或者更 多的单元格 为空则代表 此行 没有满行 .如果全部都不为空则代 表此行 已满,然后进行 消行 加分的操作。如此不断向上面的行循环直到游戏区域的顶端 行 。 如果满行则 要进行 消行 的操作 ,实质就是将本行颜色值清 空 ,然后再将上面每一行 的颜色值依次填充到下 面一行 。 Private Sub CheckFutlRow() Dim Row As Integer,Column As Integer Dim TempColumn As Integer TempRow As Integer, TempColor As Integer Dim IsFullRow As Boolean Row =Range( GameArea”}.Rows.Count Column=RangIe( GameArea“).Columns.Count Application.ScreenUpdating=False D0 W hile Row >3 For TempColumn=1 To Column IsFullRow =IIf(Range(“GameArea ).Cells(Row, TempColumn).Interior.Colorlndex<>xlNone,True,False) Next If IsFullRow Then Call AddScore With Range( GameArea”) ForTempRow =Row To 2 Step-1 .Rows(TempRow).Clear FOr TempColumn=1 To Column TempColor=.Cells(TempRow 一1, TempColumn).Interior.Colorlndex If TempColor<>xlNone Then .Cells(TempRow,TempColumn).Interior. Colorlndex=TempColor .Cells(TempRow,TempColumn).BorderAround,,1 End If Next Next 、 End W ith Else Row :Row 一 1 End}f Loop Application.ScreenUpdat ng=True End Sub 蓼~-,r电--_翟20 技 0 巧 9. 与 1 豢 5 护 ;77 |¨ ⋯ ⋯ ‘ ’ ‘ ‘ ’ ‘ ’ ⋯ ⋯ ⋯ ⋯ ● ‘ _ 实用第一 智慧密集 . ⋯ ⋯ ⋯ For TempColumn= 1 To Column IsFullRow : IIf(Range( GameArea“) Cells{Row, TempColumn).Interior.Colorlndex<>xINone,True False) Next 作用 :检测某行是否已被填满 I1f函数根据表达式的值,来返 【口]两部分中的其中一个。 在 上 面 的 代 码 中 如 果 Range(” GameArea”) .Cells(Row, TempColumn).Interior.ColorIndex<>xlNone成立 ,则 IsFullRow 的值 为 True,否则为 False。 3.6 画游戏区域 Private Sub DrawGameArea (TempBIock As TetrisBox) 重画游戏区域 Dim i As Integer W ith TempBIock For i=1 TO BL0CKSNUMBER Range ( GameArea”).Cells (.SmalIBoxlnCurrentBIock(i). Row,.SmallBoxlnCurrentBtock(i).Column).Clear 将当前方块所 占区域清 除 .SmallBoxInCurrentBIock(i)=.SmalIBoxlnNextPos(i) Next For i=1 TO BLOCKSNUMBER Range 《”GameArea”).Cells (.SmallBoxlnCurrentBlock(i). Row,.SmallBoxlnCurrentBIock(i).Column).Interior.Colorlndex : .Color 在下一个方块区域 画方块 Range(”GameArea“).Cells(.SmallBoxlnCurrentBIock(i).Row, .SmallBoxlnCurrentBIock(i).Column).BorderAround,,1 为方块设置 阴影 Next End With End Sub 3_7 检测游戏是否结束 俄罗斯方块游戏 中当游 戏区域中的方块接触到 了游戏区域 的顶部时游戏便会结束 。如图 17,在这个状 态下 ,下一个方 块即蓝色的 田字型方块一出现便会接触到游戏 区域顶部 .这 时 游戏就结束了。 Private Function ChecklfGameOver(TempBIock As TetrisBox) As Boolean Dim i As Integer IsGameOver=False W _th rempBIock For i=1 TO BLOCKSNUMBER If.SmalIBoxlnCurrentBtock(i)Row <3 Then lsGameOver=True End If Next EndWith End Function 3.8 加分 Sub AddScore() Dim TempScore As Long 2009.15 毫■■器技巧与 攀 图 17 游戏结束示意 NEXT TempScore=CLng(Shapes(”CurrentScore。).TextEffect.Text) TempScore=TempScore+1 00+TempScore Rnd() Shapes(”CurrentScore“).TextEffect.Text=Format(TempScore, “000000”) End Sub 3.9 游戏结束 Private Sub StopGame() fsGameOver=True End Sub 因为在 StartGame过程中是根据 IsGameOver的值是否为假 来确定是否进行游戏循环 ,如下代码 : While Not IsGameOver 游戏循环 Loop 如果要结束 游戏 ,只要将 IsGameOver的值置为 True即可。 至此 ,一个基本 的俄罗斯方块 已经完成 ,单击 “开始”按 钮 ,从游戏区域顶部开始出现方块并 以固定的速度下落 ,下落 至底部,重新产生一个方块继续上述过程,直至游戏结束。但 是 ,这时的方块是不受控制 的,因为上面的代码 中还没有加入 用户操作控制的部分 ,对俄罗斯方块进行控制是通过上下左右 四个方 向键来完 成的 ,向上键 为旋转变形 .向下键 为加速 下 落 ,向左向右分别 为向左 和向右移动一个 单元格 。这里使用 Worksheet的 SelectionChange事 件来 辅 助 完 成这 一功 能 。 Workshee/.SelectionChange事件当工作表上的选定区域发生改 变时发生此事件 。它带有 一个 必选 的 Range类型 的参数 Target 表示新选定的区域 。 在 StartGame过程中将 Cells(21,211激活,将此单元格作 为基准单元格 .在 SelectionChange的过程中检测新选定的单元 格 的行 和列 .如果新单元格 的行为 20.则代 表玩家按下 了向 需 一一~
/
本文档为【用Excel+VBA编写俄罗斯方块游戏】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索