(转)用Excel编写小游戏

本文介绍了如何利用Excel的VBA(Visual Basic for Applications)功能,编写并运行一个简单的平面游戏。游戏的目标是通过操作Excel单元格,将混乱的数字恢复成1至15的顺序。通过提供的代码示例,读者可以了解如何在Excel中实现游戏逻辑、初始化游戏状态、处理玩家操作以及判断游戏胜利条件。

游戏要给予人的是欢娱快乐而非困扰闹心,要满足玩乐之心,有时一片树叶已经足够。对于我们这些游戏开发爱好者来说,asm、c、c++、directx、opengl、flash等并非是我们必需的知识和工具,有时一些意想不到的实现更能体现游戏简单的真意。

办公软件Excel大家熟悉不过,其功能我不多说。但大家可有想过在Excel中也可实现个把小游戏?这个不是指97版Excel中的复活节彩旦游戏,而是实实在在的利用Excel资源编写、在Excel下运行的小游戏。经过几代的升级,ms office下的vba(visual basic for application)语言的功能有了很大的提高,在Excel中实现个把平面游戏理论上是可能的。当然这里面也要因应Excel工作区的特点。在Excel中编写应用一般都是通过vba编写宏,这些小游戏也是。至于如何开始编写宏、如何插入窗体及一些选择行列单元格、改变单元格颜色、清除单元格内容等的语句,这里假设大家都知道了,不明白的参考帮助吧。老实说,我对visual basic for application也不大熟悉,做起来整个过程也要不停地看帮助。下面结合代码与大家介绍一下。

先说个简单的。大家玩过那个外国华容道吧,就是有n*n个格,有一格是空的,其他格是次序混乱的拼图或数字,游戏的目的就是利用这唯一的这个空格移动各块拼图把混乱的拼图(数字)恢复(顺序)。这里我们小游戏的目的是要把1至15这15个次序混乱的数字恢复从1到15的顺序排列,就像瑞星网站上那个(不知现在还在不在)。

打开Excel后打开代码编写器(Alt + F11),将如下代码写入其中一个工作表(Sheet)的通用代码部分中。程序首先是初始化。定义数据结构,选择4*4的空格,调整表格大小,改变单元格颜色(标示出游戏区域),然后是让1到15非重复随机分布到前15格空格中:

Type pos
    row As Integer
    col As Integer
End Type

'blank为空格的位置,初值为最后一格
Public blank As pos

'init_pos为游戏区域的左上角,控制游戏区域的位置,这里为(5,5)单元格
Public init_pos As pos

'border为游戏区域边界
Public border As pos

'N为游戏区域的大小,控制游戏的规模(N*N),这里N=4
Public N As Integer

'running用于判断游戏是否进行中,如果要中途退出或玩家需要重玩用此变量控制
Public running As Boolean


'此下是本游戏宏的总入口,由工作区中button启动,如果愿意也可以让游戏宏在打开该表时自动运行
Sub Begin()
If running Then
    Cells(border.row, border.col).ClearContents '将唯一的空格初始化在右下角
    running = False
End If
initialize  '调用全局初始化函数
End Sub

'全局初始化函数
Function initialize()
If Not running Then

Dim i As Integer
Dim ii As Integer
Dim temp As Integer
Dim a(14) As Integer

running = True
N = 4
init_pos.col = 5
init_pos.row = 5
border.row = init_pos.row + N - 1
border.col = init_pos.col + N - 1
blank.col = border.col
blank.row = border.row

'游戏区域(颜色)初始化,省略了单元格大小的调整,大家可以应该加入相应语句让游戏外观整齐
Range(Cells(init_pos.row, init_pos.col), Cells(border.row, border.col)).Interior.ColorIndex = 5

'随机数数组初始化,这里是编号0到编号14共15个数
For i = 0 To (N*N-2)
    a(i) = i + 1
Next i

'不重复随机分布各数
For i = N*N-2 To 0 Step -1
    Randomize
    ii = Int(Rnd * i)
    temp = a(i)
    a(i) = a(ii)
    Cells(init_pos.row + i / N, init_pos.col + (i Mod N)) = a(i)
    a(ii) = temp
Next i
End If
End Function

很明显,Excel的单元格是游戏的主角。初始化后游戏开始,逻辑很简单:玩家每单击一个单元格(产生Worksheet中的SelectionChange事件),游戏就判断这个格是否在游戏区域中,若是就判断上下左右4个方向是否有空格,如果有空格就把原单元格中的数传到空格中,原单元格清空(空格与原单元格交换),然后判断游戏是否结束(1到15顺序排序了?),若还没有,什么都不做,等下一次单击事件发生。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If running Then
'所单击单元格是否就是空格
If (Target.row <> blank.row Or Target.Column <> blank.col) Then
'所单击单元格是否在游戏区域
    If ((Target.row >= init_pos.row And Target.row <= border.row) And (Target.Column >= init_pos.col And Target.Column <= border.col)) Then
'所单击单元格上下左右是否有空格
    If ((Abs(blank.col - Target.Column) <= 1 And blank.row = Target.row) Or (Abs(blank.row - Target.row) <= 1 And blank.col = Target.Column)) Then
'单元格与空格交换
Cells(blank.row, blank.col) = Cells(Target.row, Target.Column)
        Cells(Target.row, Target.Column).ClearContents
        blank.col = Target.Column
        blank.row = Target.row
    End If
    End If
End If

'判断游戏是否结束?
Dim i As Integer
i = 0
Do While (i < N*N And Cells(init_pos.row + i / N, init_pos.col + i Mod N) = i + 1)
i = i + 1
Loop
If i = N*N-1 Then
MsgBox ("你成功了!")
running = False
End If
End If
End Sub

最后在Excel工作区中放个button,用来调用游戏宏启动游戏。双击button,输入代码
Private Sub button_Click()
    Call Begin
End Sub

保存后单击button,游戏开始了!

这个游戏还可以再加上记时、限时、计算移动步数等功能,并记录在表中某个位置作为游戏纪录。游戏没有防作弊功能,人们能够随便修改单元格中的数值,而这可以通过Worksheet_Change事件加以限制(不过这样的游戏都要作弊我无话可说)。

Excel编写贪吃蛇游戏需要结合VBA(Visual Basic for Applications)来实现。下面是一个简单的贪吃蛇游戏的实现步骤和代码示例。 ### 准备工作 1. 打开Excel,按 `Alt + F11` 打开VBA编辑器。 2. 在VBA编辑器中,插入一个新的用户窗体(UserForm),命名为 `SnakeGame`。 3. 在用户窗体上添加以下控件: - 一个 `Image` 控件(用于绘制游戏区域),命名为 `GameArea`。 - 一个 `CommandButton` 控件(用于开始游戏),命名为 `StartButton`。 - 一个 `Label` 控件(用于显示分数),命名为 `ScoreLabel`。 ### 代码实现 在用户窗体的代码模块中,添加以下代码: ```vba Option Explicit ' 定义蛇的身体和食物的位置 Private Type Position X As Integer Y As Integer End Type Private Snake() As Position Private Food As Position Private Direction As String Private GameOver As Boolean Private Score As Integer Private TimerInterval As Integer ' 初始化游戏 Private Sub UserForm_Initialize() ' 设置游戏区域的大小 GameArea.Width = 400 GameArea.Height = 400 ' 初始化游戏参数 ReDim Snake(0) Snake(0).X = 5 Snake(0).Y = 5 Direction = "Right" GameOver = False Score = 0 TimerInterval = 200 ' 生成第一个食物 GenerateFood ' 更新分数显示 ScoreLabel.Caption = "分数: " & Score End Sub ' 开始游戏 Private Sub StartButton_Click() ' 重置游戏状态 ReDim Snake(0) Snake(0).X = 5 Snake(0).Y = 5 Direction = "Right" GameOver = False Score = 0 ScoreLabel.Caption = "分数: " & Score ' 生成第一个食物 GenerateFood ' 启动游戏循环 StartGameLoop End Sub ' 游戏主循环 Private Sub StartGameLoop() Do While Not GameOver ' 移动蛇 MoveSnake ' 检查碰撞 CheckCollision ' 检查是否吃到食物 CheckFood ' 重绘游戏区域 DrawGame ' 延迟 Application.Wait Now + TimeValue("0:00:00.05") Loop ' 游戏结束 MsgBox "游戏结束! 你的分数是: " & Score, vbInformation, "游戏结束" End Sub ' 移动蛇 Private Sub MoveSnake() Dim i As Integer Dim NewX As Integer, NewY As Integer ' 根据方向计算新的头部位置 Select Case Direction Case "Up" NewX = Snake(0).X NewY = Snake(0).Y - 1 Case "Down" NewX = Snake(0).X NewY = Snake(0).Y + 1 Case "Left" NewX = Snake(0).X - 1 NewY = Snake(0).Y Case "Right" NewX = Snake(0).X + 1 NewY = Snake(0).Y End Select ' 将蛇的身体向前移动 For i = UBound(Snake) To 1 Step -1 Snake(i).X = Snake(i - 1).X Snake(i).Y = Snake(i - 1).Y Next i ' 更新头部位置 Snake(0).X = NewX Snake(0).Y = NewY End Sub ' 检查碰撞 Private Sub CheckCollision() Dim i As Integer ' 检查是否撞墙 If Snake(0).X < 0 Or Snake(0).X >= GameArea.Width / 10 Or _ Snake(0).Y < 0 Or Snake(0).Y >= GameArea.Height / 10 Then GameOver = True End If ' 检查是否撞到自己 For i = 1 To UBound(Snake) If Snake(0).X = Snake(i).X And Snake(0).Y = Snake(i).Y Then GameOver = True Exit For End If Next i End Sub ' 检查是否吃到食物 Private Sub CheckFood() If Snake(0).X = Food.X And Snake(0).Y = Food.Y Then ' 增加蛇的长度 ReDim Preserve Snake(UBound(Snake) + 1) ' 更新分数 Score = Score + 10 ScoreLabel.Caption = "分数: " & Score ' 生成新的食物 GenerateFood End If End Sub ' 生成食物 Private Sub GenerateFood() Dim ValidPosition As Boolean Dim i As Integer Do ValidPosition = True Food.X = Int(Rnd() * (GameArea.Width / 10)) Food.Y = Int(Rnd() * (GameArea.Height / 10)) ' 确保食物不会出现在蛇的身体上 For i = 0 To UBound(Snake) If Food.X = Snake(i).X And Food.Y = Snake(i).Y Then ValidPosition = False Exit For End If Next i Loop Until ValidPosition End Sub ' 绘制游戏区域 Private Sub DrawGame() Dim i As Integer Dim gfx As Object ' 创建绘图对象 Set gfx = GameArea.Parent.Controls.Add("MSForms.PictureBox", "TempGfx") gfx.Width = GameArea.Width gfx.Height = GameArea.Height gfx.Visible = False ' 清除绘图区域 gfx.BackColor = RGB(255, 255, 255) gfx.ForeColor = RGB(0, 0, 0) gfx.DrawWidth = 1 ' 绘制蛇 For i = 0 To UBound(Snake) If i = 0 Then ' 头部用不同颜色 gfx.FillColor = RGB(0, 0, 255) Else ' 身体用另一种颜色 gfx.FillColor = RGB(0, 255, 0) End If gfx.FillStyle = fmFillStyleSolid gfx.Rectangle (Snake(i).X * 10, Snake(i).Y * 10), (Snake(i).X * 10 + 10, Snake(i).Y * 10 + 10) Next i ' 绘制食物 gfx.FillColor = RGB(255, 0, 0) gfx.FillStyle = fmFillStyleSolid gfx.Rectangle (Food.X * 10, Food.Y * 10), (Food.X * 10 + 10, Food.Y * 10 + 10) ' 将绘图复制到游戏区域 GameArea.Picture = gfx.Image ' 删除临时绘图对象 GameArea.Parent.Controls.Remove "TempGfx" End Sub ' 键盘控制 Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Select Case KeyCode Case vbKeyUp If Direction <> "Down" Then Direction = "Up" Case vbKeyDown If Direction <> "Up" Then Direction = "Down" Case vbKeyLeft If Direction <> "Right" Then Direction = "Left" Case vbKeyRight If Direction <> "Left" Then Direction = "Right" End Select End Sub ``` ### 使用说明 1. 返回Excel,按 `Alt + F8`,选择 `SnakeGame` 并点击 `运行`。 2. 点击 `开始游戏` 按钮开始游戏。 3. 使用键盘的方向键(上、下、左、右)控制蛇的移动。 4. 游戏目标是吃到红色的食物,每吃到一个食物,蛇的长度会增加,分数也会增加。 5. 如果蛇撞到墙壁或自己的身体,游戏结束。 ### 注意事项 1. 这个实现是一个简单的版本,可能需要根据需要进行调整和优化。 2. 游戏区域的大小和蛇的移动速度可以通过调整代码中的参数来修改。 3. 为了使键盘控制生效,需要在用户窗体的属性中设置 `KeyPreview` 为 `True`。 希望这个示例能帮助你在Excel中创建一个简单的贪吃蛇游戏!如果有任何问题或需要进一步的帮助,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值