VBA对游戏开发的流程帮助甚微,甚至影响游戏开发效率,本应用实例仅为消遣,切勿过分关注!

前言

抱歉,这可能是我最后的几篇文章之一了。

由于最近工作中遇到很多问题,作者现在处于自我检讨中,恐怕以后将要告别少年时代的“装逼梦”了。

作者之后,需要洗心革面,重新做人,踏踏实实,本本分分,低调为人,从最底层做起。

接下来,还会再分享一些有关Axure的酷炫特效技巧,然后封笔。

感谢大家这段时间的支持,以及各路的批评。

前期准备

l  搭建如下图界面环境,仅需要用到Excel自带功能待见,例如单元格颜色,绘制表格等,数两个数字2的方块先不用管。

l  按照下图指示,分别对几个对象进行命名。

l  创建一个按钮

程序的流程图

游戏过程非常简单。

当用户点击游戏开始按钮,系统先将所有数据初始化,并且随机生成两个方块,当玩家进行上下左右移动时,方块也会随之移动,并且在移动的过程中判断是否合并是否产生新的方块,以及是否游戏结束。

游戏的程序逻辑共由一下几部分组成:

逻辑方法

作用

StartTigger

游戏的启动器(在游戏中,以“GameStart”按钮的形式体现),主要负责通知何时开启游戏流程。

GameStart

主要负责游戏的初始化

TileController

负责游戏方块对象的移动,以及相应的逻辑检测

TileCreator

负责游戏方块的生产

GameOverChecker

负责检测游戏是否已经达成“游戏结束”的条件

开始编写代码

按ALT + F11打开Excel自带的代码编辑器。

变量定义

Option Explicit    ‘安全编码习惯

Dim IsGameOver As Boolean

Dim IsCanMove As Boolean

Dim AnotherChance As Integer

Dim CurrentScore, HighScore As Long

CreatTile方法

次方法主要用来生产方块,在每次移动操作以及游戏的初始化都会用到这个方法。

Private Sub CreatTile()

Dim r, c As Range

Dim i, n As Integer

Set r = Range("GameArea").SpecialCells(xlCellTypeBlanks)    '取出游戏区域中所有的空白方格

n = Int(Rnd * r.Count + 1)                              '随机一个数

For Each c In Range("GameArea").SpecialCells(xlCellTypeBlanks)

i = i + 1

If i = n Then Exit For                           '在空白方格中随机找一个

Next

c.Value = 2                                      '使它变成方格2

End Sub

GameStart方法

GameStart方法主要用来游戏初始化

Private Sub GameStart()

Range("GameArea").ClearContents                              '清除游戏区域的所有内容

Shapes("CurrentScore").TextEffect.Text = Format(0, "000000")        '清除当前分数

Range("GamePad").Cells(2, 2).Activate

Call CreatTile                                               '调用创建方块方法2次

Call CreatTile

End Sub

TileController方法集

在这里,我们要编写控制方格移动并且合并的方法。由于游戏中我们可以上下左右移动,所以我们需要分别编写上下左右移动的方法。如下:

Private Sub DownMove()

Dim i, j As Integer

With Range("GameArea")

For i = 3 To 1 Step -1         '从倒数第三行开始,其上的每一行的所有小方格

For j = 1 To 4

If .Cells(i + 1, j) = "" And .Cells(i, j) <> "" Then

.Cells(i + 1, j) = .Cells(i, j)  '遇到可以移动的情况

.Cells(i, j).ClearContents

IsCanMove = True

ElseIf .Cells(i + 1, j) = .Cells(i, j) And .Cells(i, j) <> "" Then

.Cells(i + 1, j) = .Cells(i + 1, j) * 2   '遇到可以合并的情况

CurrentScore = CurrentScore + .Cells(i, j) * 2

Shapes("CurrentScore").TextEffect.Text = CurrentScore   '加分

.Cells(i, j).ClearContents

IsCanMove = True

End If

Next j

Next i

End With

End Sub

其他方向的同理

Private Sub UpMove()

Dim i, j As Integer

With Range("GameArea")

For i = 2 To 4

For j = 1 To 4

If .Cells(i - 1, j) = "" And .Cells(i, j) <> "" Then

.Cells(i - 1, j) = .Cells(i, j)

.Cells(i, j).ClearContents

IsCanMove = True

ElseIf .Cells(i - 1, j) = .Cells(i, j) And .Cells(i, j) <> "" Then

.Cells(i - 1, j) = .Cells(i - 1, j) * 2

CurrentScore = CurrentScore + .Cells(i, j) * 2

Shapes("CurrentScore").TextEffect.Text = CurrentScore

.Cells(i, j).ClearContents

IsCanMove = True

End If

Next j

Next i

End With

End Sub

Private Sub LeftMove()

Dim i, j As Integer

With Range("GameArea")

For i = 2 To 4

For j = 1 To 4

If .Cells(j, i - 1) = "" And .Cells(j, i) <> "" Then

.Cells(j, i - 1) = .Cells(j, i)

.Cells(j, i).ClearContents

IsCanMove = True

ElseIf .Cells(j, i - 1) = .Cells(j, i) And .Cells(j, i) <> "" Then

.Cells(j, i - 1) = .Cells(j, i - 1) * 2

CurrentScore = CurrentScore + .Cells(j, i) * 2

Shapes("CurrentScore").TextEffect.Text = CurrentScore

.Cells(j, i).ClearContents

IsCanMove = True

End If

Next j

Next i

End With

End Sub

Private Sub RightMove()

Dim i, j As Integer

With Range("GameArea")

For i = 3 To 1 Step -1

For j = 1 To 4

If .Cells(j, i + 1) = "" And .Cells(j, i) <> "" Then

.Cells(j, i + 1) = .Cells(j, i)

.Cells(j, i).ClearContents

IsCanMove = True

ElseIf .Cells(j, i + 1) = .Cells(j, i) And .Cells(j, i) <> "" Then

.Cells(j, i + 1) = .Cells(j, i + 1) * 2

CurrentScore = CurrentScore + .Cells(j, i) * 2

Shapes("CurrentScore").TextEffect.Text = CurrentScore

.Cells(j, i).ClearContents

IsCanMove = True

End If

Next j

Next i

End With

End Sub

游戏控制器的编写

到这里,游戏大部分的机制都已经写好,但我们还需要给我们的游戏设计一个用户接口。我们可以利用Excel自带的事件监听器Worksheet_SelectionChange,来设计游戏的操控方式。思路是,我们设置一个默认的单元格,并且总是保证其焦点。每当用户操作方向键,或者点击鼠标,我们都可以抓住一个瞬间的单元格焦点位置的变化,之后又会回到默认的单元格焦点。具体方法如下:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Application.EnableEvents = False

IsCanMove = False

With Target

If .Row = Range("GamePad").Cells(1, 2).Row Then

'MsgBox ("↑")

Call UpMove    '调用三次方块移动方法,为什么?大家可以思考一下!

Call UpMove

Call UpMove

ElseIf .Column = Range("GamePad").Cells(2, 1).Column Then

'MsgBox ("←")

Call LeftMove

Call LeftMove

Call LeftMove

ElseIf .Row = Range("GamePad").Cells(3, 2).Row Then

'MsgBox ("↓")

Call DownMove

Call DownMove

Call DownMove

ElseIf .Column = Range("GamePad").Cells(2, 3).Column Then

'MsgBox ("→")

Call RightMove

Call RightMove

Call RightMove

End If

End With

Range("GamePad").Cells(2, 2).Activate   '默认单元格获得焦点

Call CheckGameOver

If IsCanMove Then Call CreatTile        '如果发生移动了,创造一个新方块

Application.EnableEvents = True

End Sub

GameOverChecker方法编写

导致游戏结束的原因有两种:①胜利(出现2048)  ②失败(无法移动)

在这里,我们也需要分别检测这两种情况。

Private Sub CheckGameOver()

Dim i, j As Integer

IsGameOver = False

If Not Range("GameArea").Find(2048) Is Nothing Then    '如果出现2048,则执行游戏胜利流程

IsGameOver = True

MsgBox ("You Did Splendid Job")

If CurrentScore > HighScore Then              '交换分数

HighScore = CurrentScore

Shapes("HighScore").TextEffect.Text = HighScore

End If

End If

If Range("GameArea").SpecialCells(xlCellTypeConstants).Count = 16 Then   '如果没有任何空位了

IsGameOver = True

For i = 1 To 4                             '并且也无法合并了

For j = 1 To 4

If Range("GameArea").Cells(i, j) = Range("GameArea").Cells(i, j + 1) Or Range("GameArea").Cells(i, j) = Range("GameArea").Cells(i + 1, j) Then IsGameOver = False

Next j

Next i

If IsGameOver = True Then

MsgBox ("Game Over")

If CurrentScore > HighScore Then

HighScore = CurrentScore

Shapes("HighScore").TextEffect.Text = HighScore

End If

Call GameStart                  '重新开始一局

End If

End If

End Sub

最后

你以为就这样结束了么?太天真了!至此游戏虽然可以运行,但貌似缺少点什么?

你的美术表现呢?

起码得有点颜色吧!

在Excel里面,可以有一种超级轻松的方式实现这种美术表现。

条件格式……………………………………

Excel_VBA开发2048游戏教程——Einsphoton相关推荐

  1. C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例

    C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...

  2. C#开发Unity游戏教程之判断语句

    C#开发Unity游戏教程之判断语句 游戏执行路径的选择--判断 玩家在游戏时,无时无刻不在通过判断做出选择.例如,正是因为玩家做出的选择不同,才导致游戏朝着不同的剧情发展,因此一个玩家可以对一个游戏 ...

  3. C#开发Unity游戏教程之游戏对象的行为逻辑方法

    C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑--方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...

  4. C#开发Unity游戏教程之使用脚本变量

    C#开发Unity游戏教程之使用脚本变量 使用脚本变量 本章前面说了那么多关于变量的知识,那么在脚本中要如何编写关于变量的代码,有规章可循吗?答案是有的.本节会依次讲解变量的声明.初始化.赋值和运算. ...

  5. pygame开发2048游戏(附源代码)

    背景 最近入手新游戏:<Threes>,2048的前身,难度比2048大,这个游戏的命运比较悲哀,App上架没几天,便被人仿制出与之类似.入手更快的<2048>,2048获得了 ...

  6. 2D中小游戏开发C++游戏教程

    初探Windows窗体程序(上)2D游戏制作从入门到入土. 这个相对于我那个小游戏入门就显得比较专业了,但是仍然会给源码,关注可以下载相应的模板,模板是给全的.###感谢老司机(一个人)### Fir ...

  7. Cocos2d-x 3.x版2048游戏开发

    Cocos2d-x 3.x版2048游戏开发 本篇博客给大家介绍如何快速开发2048这样一款休闲游戏,理解整个2048游戏的开发流程,从本篇博客你将可以学习到以下内容: 这里注明一下,本教程来自极客学 ...

  8. 游戏控制杆OUYA游戏开发快速入门教程

    游戏控制杆OUYA游戏开发快速入门教程 1.2.2  游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4  游戏控制杆各个角度的 ...

  9. OUYA游戏开发快速入门教程1.2OUYA的硬件规格

    OUYA游戏开发快速入门教程1.2OUYA的硬件规格 从官网上购买回来的OUYA产品,包含游戏主机.游戏控制杆.说明书.电源线.HDMI线.电源线和电池,如图1-2所示.本节就来简要介绍下,游戏主机和 ...

最新文章

  1. 偶尔,当拍摄从相册或图片相机拍摄照片黑色解决问题的方法,解决问题和头部转动的方法...
  2. java实现excel的导入导出(poi详解)
  3. Selenium v2.45.0 发布,此版本现已提供下载:http://selenium-rele
  4. lisp 角平分线_最佳VisualLISP及VBAforAutoCAD2000程序123例 张光斌.pdf
  5. openssh升级sftp_Centos7 升级 openSSH 到7.9p1的详细步骤
  6. 问题:循环元素,被选中元素个数,全选
  7. (25)VHDL实现与(数据流描述)
  8. token 微信access 过期_如何设计 QQ、微信等第三方账号登陆 ?以及设计数据库表!...
  9. Windows平台下的session0创建进程的问题与解决办法
  10. Https下字体文件无法加载的解决方案
  11. ActiveMQ(14):Destination(目的地)高级特性
  12. hdu 6129 Just do it
  13. 今有物不知其数三三数之JAVA_今有物不知其数.三三数之剩二.五五数之剩三.七七数之剩二.问物几何? 题目和参考答案——青夏教育精英家教网——...
  14. internet协议dns服务器地址,DNS服务器配置使用 及全国DNS地址大全
  15. nlp-知识图谱简介
  16. ssh登录极路由后台_十八聊智能 篇一百一十:搭建个人云盘,蒲公英企业级路由G5评测:个人私有云+企业异地组网两大杀手锏_路由器...
  17. 创建一个简单的workflow工作流(WF4)
  18. Codeforces 371D. Vessels【并查集】
  19. c语言求13为质数的代码,C语言求质数.doc
  20. X61T装上Windows8 CP了

热门文章

  1. (纪录片)数学的故事 The Story of Maths (2008)
  2. 数学故事(统计学的妙用)
  3. linux与linux之间共享目录
  4. Cloudsim和算法
  5. docker 开机自启动容器docker运行自启动
  6. 全国计算机网络评课测试,第一次网络评课
  7. c语言程序设计 大学考试题库,广东工业大学《C语言程序设计》考试复习重点题库.pdf...
  8. 复合材料层合板数值模拟_51CAE_新浪博客
  9. Android悬浮窗口开发
  10. facenet-tensorflow人脸识别