2017-5-29 Excel VBA 小游戏

---恢复内容开始---

转一个Excel VBA的小游戏,最近对excel有了更深入的了解,功能很强大,也刷新了我对待事情的态度。

一、准备界面

我们先来把游戏界面准备好,选中前4行,行高调成50,这时候单元格就近似一个正方形。然后给4*4的单元格加上全部框线,再加粗外框线。字体改成微软雅黑,加粗,居中。第6行A列写上SCORE,C列写上MOVES,都加粗。

一般2048这样的游戏需要用状态机来实现,就是程序无限运行直到游戏结束。在Excel中这种方法不太合适,使用工作表自带的Worksheet_SelectionChange方法来获取键盘状态使游戏往下进行更方便。

二、初始状态

我们先来制作游戏的初始状态,游戏变量很少,需要一个4*4的二维数组,用来记录和操作盘面,一个score变量记录分数,一个moves变量记录步数。初始状态就是让他们都为0,当然也可以加入历史最高纪录,不过考虑到在Excel单元格中记录可以随时修改,意义不大。

这里没有使用状态机,也就没有用类模块来做面向对象式编程,所以用全局变量来代替。

Public numAreaArr
Public score As Double
Public moves As Integer

Public Sub Reset()

ReDim numAreaArr(1 To 4, 1 To 4) As Integer
score = 0
moves = 0

End Sub

这只是变量的初始状态,我们还需要将它输出到单元格上,所以需要一个输出方法。

Public Sub Output(ByVal numArr, ByVal score As Double, ByVal moves As Integer)
‘界面输出

Sheet1.Range("A1:D4") = numArr
Sheet1.Cells(6, 2) = score
Sheet1.Cells(6, 4) = moves

End Sub

游戏初始时,盘面上是有两个随机数字的,我们需要一个 在空白地方随机生成数字2或4 的方法。2和4出现的概率比例是9:1,别问我为什么,我看到的算法就是这样的。

Public Sub Spawn()
‘随机数字

Dim newElement%, n%, i%, j%
newElement = 2

Randomize (Timer)
t = 100 * Rnd()
If t > 90 Then newElement = 4

n = Int(16 * Rnd())
i = Int(n / 4) + 1
j = n Mod 4 + 1

Do While (numAreaArr(i, j) <> 0)
  n = Int(16 * Rnd())
  i = Int(n / 4) + 1
  j = n Mod 4 + 1
Loop

numAreaArr(i, j) = newElement
Call Output(numAreaArr, score, moves)

End Sub

接下来在Reset方法中最后加上下面的代码就可以了。

Call Spawn
Call Spawn
Call Output(numAreaArr, score, moves)

三、移动

键盘状态的读取需要用到一个接口,在Sheet1中添加如下代码:

#If VBA7 And Win64 Then
  Private Declare PtrSafe Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
#Else
  Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
#End If

这里读取的是GetKeyboardState的接口,而且在VBA7和64位windows系统中,VBA的调用方式略有不同,所以加了一个IF判断。具体使用方法如下:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
Application.ScreenUpdating = False

Dim keycode(0 To 255) As Byte
GetKeyboardState keycode(0)

If keycode(37) > 127 Then Call Num_Move(0)  ‘左
If keycode(38) > 127 Then Call Num_Move(1)  ‘上
If keycode(39) > 127 Then Call Num_Move(2)  ‘右
If keycode(40) > 127 Then Call Num_Move(3)  ‘下

Sheet1.Cells(4, 4).Select

Application.EnableEvents = True
Application.ScreenUpdating = True

If Game_Over Then MsgBox "游戏结束!", , "Game Over"
End Sub

我们 先屏蔽掉工作表事件和屏幕刷新,避免产生迭代以及加快屏显速度 。然后用keycode数组记录了键盘状态,数组索引的37到40分别对应了键盘上的左上右下,对应的我们将状态0到3传给了Num_Move方法。最后将屏蔽掉的事件恢复,再通过Game_Over函数判断游戏是否结束。

Num_Move方法就是让盘面上数字移动的方法,我们先来分析一下这其中都发生了什么。

1、获取盘面上的数字;

2、判断是否可以进行移动,如果不能则退出方法;

3、先把所有数字都按方向移动到底,再把相邻的相同数字合并,再把合并后的数字移动到底;

4、加入新的随机数字,输出盘面。

分析之后,让我们一步一步来解决。

1、获取数据

首先是,获取盘面上数字的方法,与输出方法刚好相反:

Public Sub Get_Data()

numAreaArr = Sheet1.Range("A1:D4")
score = Sheet1.Cells(6, 2)
moves = Sheet1.Cells(6, 4)

End Sub

2、可移动判断

接下来是,判断是否可以进行移动的方法,以向下移动为例:任意不为0数字下方的单元格数值为0的,与下方单元格数字相同,即为可以移动。代码如下:

Public Function Move_Is_Possible(ByVal direction As Integer) As Boolean

Move_Is_Possible = False

Dim numArr
numArr = numAreaArr

‘向下验证
For i = 1 To 3
  For j = 1 To 4
    If numArr(i, j) <> 0 And numArr(i + 1, j) = 0 Then Move_Is_Possible = True: Exit Function
    If numArr(i, j) <> 0 And numArr(i, j) = numArr(i + 1, j) Then Move_Is_Possible = True: Exit Function
  Next j
Next i

End Function

这里的问题是,如果上下左右的判断要分开写的话,那就太麻烦,太不智能了。考虑到,在移动紧缩、数字合并的时候都需要分上下左右四中情况来写,我们还是想一些更机智的办法(其实并没有)。

因为是对数组进行处理,我们可以考虑使用矩阵的一些方法。比如,向右验证的判断,我们可以把数组 转置 ,然后向下判断;向左验证,可以 翻转 为向右验证,再回到前一个问题;向上验证,可以转置为向左验证,再回到前一个问题。 这种将未知问题转化为已知,是数学中的化归思想。

所以,现在我们只需要数组的转置函数和翻转函数就可以了。代码如下:

Public Function Transpose(ByVal numArr) As Variant
‘转置

Dim newArr(1 To 4, 1 To 4) As Integer
For i = 1 To 4
  For j = 1 To 4
    newArr(i, j) = numArr(j, i)
  Next j
Next i
Transpose = newArr

End Function

Public Function Invert(ByVal numArr) As Variant
‘左右翻转

Dim newArr(1 To 4, 1 To 4) As Integer
For i = 1 To 4
  For j = 1 To 4
    newArr(i, j) = numArr(i, 5 - j)
  Next j
Next i
Invert = newArr

End Function

这时候自然而然的就需要一个通过键盘状态操作改变数组的函数,这里参数direction的0、1、2、3分别对应方向的左上右下。数组操作的方法如之前提到的:右变下:转置,左变下:翻转->转置,上变下:转置->翻转->转置。

Public Function Arr_Change(ByVal numArr, ByVal direction As Integer, Optional status As Integer = 0) As Variant

If direction = 0 And status = 1 Then
  Arr_Change = Invert(Transpose(numArr))
  Exit Function
End If

Select Case direction
  Case 0
    numArr = Transpose(Invert(numArr))
  Case 1
    numArr = Transpose(Invert(Transpose(numArr)))
  Case 2
    numArr = Transpose(numArr)
End Select
Arr_Change = numArr

End Function

这里解释一下为什么需要加一个可选参数status,刚才说过在数组移动紧缩和合并的时候也要用到这个方法,但是用完后我们还需要将数组还原回去才能输出到盘面上。方向1、2对应的操作都是对称的,所以还原的时候还是用相同的方法;而方向0的操作并不对称,所以在输出前调用方法还原数组时,如果碰到方向0,需要通过status参数提示做相反的操作。

现在,把Arr_Change函数加到Move_Is_Possible函数中,让numArr变量的赋值变成

numArr = Arr_Change(numAreaArr, direction)

就可以根据方向来判断了。

3、移动操作

有了上面的方法做基础,移动的操作我没只考虑向下的就可以了。

首先是执行紧缩,将数组从下至上读取,如果有为0的单元格,则将该列由下至上第一个不为0的单元格与之交换。代码如下:

Public Function Tighten(ByVal numArr) As Variant
‘向下紧缩

For i = 4 To 1 Step -1
  For j = 1 To 4

    If numArr(i, j) = 0 Then

      For k = i - 1 To 1 Step -1
        If numArr(k, j) <> 0 Then
          numArr(i, j) = numArr(k, j)
          numArr(k, j) = 0
          Exit For
        End If
      Next k

    End If

  Next j
Next i
Tighten = numArr

End Function

然后执行合并,也是从下至上读取,如果有不为0单元格与前一行相同的数字,则加到该行,前一行归0;同时把合并后的数字加到分数中。代码如下:

Public Function Merge(ByVal numArr) As Variant
‘向下合并

For i = 4 To 2 Step -1
  For j = 1 To 4

    If numArr(i, j) <> 0 And numArr(i, j) = numArr(i - 1, j) Then
      numArr(i, j) = numArr(i, j) * 2
      score = score + numArr(i, j)
      numArr(i - 1, j) = 0
    End If

  Next j
Next i
Merge = numArr

End Function

有了以上这些函数,我们就能拼凑出Num_Move方法:

Public Sub Num_Move(ByVal direction As Integer)

Call Get_Data

If Move_Is_Possible(direction) = False Then Exit Sub

numAreaArr = Arr_Change(numAreaArr, direction)
numAreaArr = Tighten(Merge(Tighten(numAreaArr)))
numAreaArr = Arr_Change(numAreaArr, direction, 1)

moves = moves + 1
Call Spawn
Call Output(numAreaArr, score, moves)

End Sub

四、游戏结束

游戏结束的判断函数,就是遍历所有方向,如果Move_Is_Possible都返回False则返回True,代码如下:

Public Function Game_Over() As Boolean

Call Get_Data
Game_Over = True

For i = 0 To 3
  If Move_Is_Possible(i) Then Game_Over = False: Exit Function
Next i

End Function

五、界面优化

以上代码已经能完成游戏基本功能,不过白底黑字的2048并不能满足我们的需求。我用比写功能代码更长的时间去找了下游戏原本的配色方案,然后加在了Output方法中。

优化内容如下:

1、给0到4096的单元格不同的背景色,更大数字和4096颜色相同;

2、给0的单元格字体颜色和背景色相同,2、4为黑色,其他数字为白色;

3、四位以上数字字号调整为16,始终保持列宽为8.38;

4、插入按钮,调用Reset方法,让游戏可以重新开始。

Public Sub Output(ByVal numArr, ByVal score As Double, ByVal moves As Integer)
‘界面输出

Dim index%, redArr, greenArr, blueArr
redArr = Array(204, 238, 238, 243, 243, 248, 249, 239, 239, 239, 239, 239, 95)
greenArr = Array(192, 228, 224, 177, 177, 149, 94, 207, 207, 203, 199, 195, 218)
blueArr = Array(179, 218, 198, 116, 116, 90, 50, 108, 99, 82, 57, 41, 147)

For i = 1 To 4
  For j = 1 To 4
    ‘背景色索引
    If numArr(i, j) = 0 Then
      index = 0
    ElseIf numArr(i, j) <= 4096 Then
      index = Log(numArr(i, j)) / Log(2)
    Else
      index = 11
    End If

    ‘字体颜色
    If numArr(i, j) = 0 Then
      Sheet1.Cells(i, j).Font.Color = RGB(redArr(index), greenArr(index), blueArr(index))
    ElseIf numArr(i, j) <= 4 Then
      Sheet1.Cells(i, j).Font.Color = vbBlack
    Else
      Sheet1.Cells(i, j).Font.Color = vbWhite
    End If

    If numArr(i, j) >= 1024 Then
      Sheet1.Cells(i, j).Font.Size = 16
    Else
      Sheet1.Cells(i, j).Font.Size = 20
    End If
    Sheet1.Cells(i, j).Interior.Color = RGB(redArr(index), greenArr(index), blueArr(index))
  Next j
Next i

Sheet1.Range("A1:D4") = numArr
Sheet1.Range("A:D").ColumnWidth = 8.38
Sheet1.Cells(6, 2) = score
Sheet1.Cells(6, 4) = moves

End Sub

以上,Excel版2048完成,完整代码照例在附录中,可直接复制粘贴使用。

附录:工作表代码

#If VBA7 And Win64 Then
  Private Declare PtrSafe Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
#Else
  Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
#End If

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
Application.ScreenUpdating = False

Dim keycode(0 To 255) As Byte
GetKeyboardState keycode(0)

If keycode(37) > 127 Then Call Num_Move(0)  ‘左
If keycode(38) > 127 Then Call Num_Move(1)  ‘上
If keycode(39) > 127 Then Call Num_Move(2)  ‘右
If keycode(40) > 127 Then Call Num_Move(3)  ‘下

Sheet1.Cells(4, 4).Select

Application.EnableEvents = True
Application.ScreenUpdating = True

If Game_Over Then MsgBox "游戏结束!", , "Game Over"
End Sub

附录:模块代码

Public numAreaArr
Public score As Double
Public moves As Integer

Public Sub Get_Data()

numAreaArr = Sheet1.Range("A1:D4")
score = Sheet1.Cells(6, 2)
moves = Sheet1.Cells(6, 4)

End Sub

Public Sub Num_Move(ByVal direction As Integer)

Call Get_Data

‘Debug.Print Move_Is_Possible(direction)
If Move_Is_Possible(direction) = False Then Exit Sub

numAreaArr = Arr_Change(numAreaArr, direction)
numAreaArr = Tighten(Merge(Tighten(numAreaArr)))
numAreaArr = Arr_Change(numAreaArr, direction, 1)

moves = moves + 1
Call Spawn
Call Output(numAreaArr, score, moves)

End Sub

Public Function Merge(ByVal numArr) As Variant
‘向下合并

For i = 4 To 2 Step -1
  For j = 1 To 4

    If numArr(i, j) <> 0 And numArr(i, j) = numArr(i - 1, j) Then
      numArr(i, j) = numArr(i, j) * 2
      score = score + numArr(i, j)
      numArr(i - 1, j) = 0
    End If

  Next j
Next i
Merge = numArr

End Function

Public Function Tighten(ByVal numArr) As Variant
‘向下紧缩

For i = 4 To 1 Step -1
  For j = 1 To 4

    If numArr(i, j) = 0 Then

      For k = i - 1 To 1 Step -1
        If numArr(k, j) <> 0 Then
          numArr(i, j) = numArr(k, j)
          numArr(k, j) = 0
          Exit For
        End If
      Next k

    End If

  Next j
Next i
Tighten = numArr

End Function

Public Function Arr_Change(ByVal numArr, ByVal direction As Integer, Optional status As Integer = 0) As Variant

If direction = 0 And status = 1 Then
  Arr_Change = Invert(Transpose(numArr))
  Exit Function
End If

Select Case direction
  Case 0
    numArr = Transpose(Invert(numArr))
  Case 1
    numArr = Transpose(Invert(Transpose(numArr)))
  Case 2
    numArr = Transpose(numArr)
End Select
Arr_Change = numArr

End Function

Public Function Move_Is_Possible(ByVal direction As Integer) As Boolean

Move_Is_Possible = False

Dim numArr
numArr = Arr_Change(numAreaArr, direction)

‘向下验证
For i = 1 To 3
  For j = 1 To 4
    If numArr(i, j) <> 0 And numArr(i + 1, j) = 0 Then Move_Is_Possible = True: Exit Function
    If numArr(i, j) <> 0 And numArr(i, j) = numArr(i + 1, j) Then Move_Is_Possible = True: Exit Function
  Next j
Next i

End Function

Public Function Invert(ByVal numArr) As Variant
‘左右翻转

Dim newArr(1 To 4, 1 To 4) As Integer
For i = 1 To 4
  For j = 1 To 4
    newArr(i, j) = numArr(i, 5 - j)
  Next j
Next i
Invert = newArr

End Function

Public Function Transpose(ByVal numArr) As Variant
‘转置

Dim newArr(1 To 4, 1 To 4) As Integer
For i = 1 To 4
  For j = 1 To 4
    newArr(i, j) = numArr(j, i)
  Next j
Next i
Transpose = newArr

End Function

Public Function Game_Over() As Boolean

Call Get_Data
Game_Over = True

For i = 0 To 3
  If Move_Is_Possible(i) Then Game_Over = False: Exit Function
Next i

End Function

Public Sub Reset()

ReDim numAreaArr(1 To 4, 1 To 4) As Integer
score = 0
moves = 0

Call Spawn
Call Spawn
Call Output(numAreaArr, score, moves)

End Sub

Public Sub Output(ByVal numArr, ByVal score As Double, ByVal moves As Integer)
‘界面输出

Dim index%, redArr, greenArr, blueArr
redArr = Array(204, 238, 238, 243, 243, 248, 249, 239, 239, 239, 239, 239, 95)
greenArr = Array(192, 228, 224, 177, 177, 149, 94, 207, 207, 203, 199, 195, 218)
blueArr = Array(179, 218, 198, 116, 116, 90, 50, 108, 99, 82, 57, 41, 147)

For i = 1 To 4
  For j = 1 To 4
    ‘背景色索引
    If numArr(i, j) = 0 Then
      index = 0
    ElseIf numArr(i, j) <= 4096 Then
      index = Log(numArr(i, j)) / Log(2)
    Else
      index = 11
    End If

    ‘字体颜色
    If numArr(i, j) = 0 Then
      Sheet1.Cells(i, j).Font.Color = RGB(redArr(index), greenArr(index), blueArr(index))
    ElseIf numArr(i, j) <= 4 Then
      Sheet1.Cells(i, j).Font.Color = vbBlack
    Else
      Sheet1.Cells(i, j).Font.Color = vbWhite
    End If

    If numArr(i, j) >= 1024 Then
      Sheet1.Cells(i, j).Font.Size = 16
    Else
      Sheet1.Cells(i, j).Font.Size = 20
    End If
    Sheet1.Cells(i, j).Interior.Color = RGB(redArr(index), greenArr(index), blueArr(index))
  Next j
Next i

Sheet1.Range("A1:D4") = numArr
Sheet1.Range("A:D").ColumnWidth = 8.38
Sheet1.Cells(6, 2) = score
Sheet1.Cells(6, 4) = moves

End Sub

Public Sub Spawn()
‘随机数字

Dim newElement%, n%, i%, j%
newElement = 2

Randomize (Timer)
t = 100 * Rnd()
If t > 90 Then newElement = 4

n = Int(16 * Rnd())
i = Int(n / 4) + 1
j = n Mod 4 + 1

Do While (numAreaArr(i, j) <> 0)
  n = Int(16 * Rnd())
  i = Int(n / 4) + 1
  j = n Mod 4 + 1
Loop

numAreaArr(i, j) = newElement

End Sub
时间: 2024-10-08 20:26:33

2017-5-29 Excel VBA 小游戏的相关文章

用Kotlin破解Android版微信小游戏-跳一跳

前言 微信又更新了,从更新日志上来看,似乎只是一次不痛不痒的小更新.不过,很快就有人发现,原来微信这次搞了个大动作--在小程序里加入了小游戏.今天也是朋友圈被刷爆的缘故. 看到网上 有人弄了一个破解版的,于是自己也跟着网上的案例整了一下,感觉挺有意思的. 游戏如下: 来玩游戏 劳动成果 跳一跳 微信小程序可以玩游戏了,我们来破解一下<跳一跳>这个官方出品的小游戏吧. 思路 用usb调试安卓手机,用adb截图并用鼠标测量距离,然后计算按压时间后模拟按压. $ adb shell input sw

Chrome自带恐龙小游戏的源码研究(完)

在上一篇<Chrome自带恐龙小游戏的源码研究(七)>中研究了恐龙与障碍物的碰撞检测,这一篇主要研究组成游戏的其它要素. 游戏分数记录 如图所示,分数及最高分记录显示在游戏界面的右上角,每达到100分就会出现闪烁特效,游戏第一次gameover时显示历史最高分.分数记录器由DistanceMeter构造函数实现,以下是它的全部代码: 1 DistanceMeter.dimensions = { 2 WIDTH: 10, //每个字符的宽度 3 HEIGHT: 13, //每个字符的高 4 DE

Chrome自带恐龙小游戏的源码研究(七)

在上一篇<Chrome自带恐龙小游戏的源码研究(六)>中研究了恐龙的跳跃过程,这一篇研究恐龙与障碍物之间的碰撞检测. 碰撞盒子 游戏中采用的是矩形(非旋转矩形)碰撞.这类碰撞优点是计算比较简单,缺点是对不规则物体的检测不够精确.如果不做更为精细的处理,结果会像下图: 如图所示,两个盒子虽然有重叠部分,但实际情况是恐龙和仙人掌之间并未发生碰撞.为了解决这个问题,需要建立多个碰撞盒子: 不过这样还是有问题,观察图片,恐龙和仙人掌都有四个碰撞盒子,如果每次Game Loop里都对这些盒子进行碰撞检测

贪吃蛇小游戏 (一)

贪吃蛇是一款儿时爱不释手的游戏.近日修行,想玩玩游戏开发.便简单写了个控制台版的贪吃蛇. 程序的简单框架: 建立一张固定大小的MAP,保存输出信息. 当信息有变动时,用system("cls")进行清屏操作,再重新输出实现伪动态. 重点算法在蛇身的移动,转向与增长.三者均基于链表实现. 移动与转向:通过判定移动方向,确定下一步移动的位置后,新建表头结点.将新表头结点置为表头.删除末尾结点. 增长:通过判断尾部移动方向,确定位置后在尾部添加节点. 熟练运用链表的同学,相信也是小菜一碟了.

【python游戏编程之旅】第九篇---嗷大喵快跑小游戏开发实例

本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 前几期博客我们一起学习了,pygame中的冲突检测技术以及一些常用的数据结构. 这次我们来一起做一个简单的酷跑类游戏综合运用以前学到的知识. 程序下载地址:http://yunpan.cn/cLIcJgTvq4tZS 访问密码 901f 源代码网盘地址:http://yunpan.cn/cLIc67S4nNRFY 访问密码 c139 github地址:https://github.com/XINCGer/

js实现2048小游戏

这是学完javascript基础,编写的入门级web小游戏 游戏规则:在玩法规则也非常的简单,一开始方格内会出现2或者4等这两个小数字,玩家只需要上下左右其中一个方向来移动出现的数字,所有的数字就会想滑动的方向靠拢,而滑出的空白方块就会随机出现一个数字,相同的数字相撞时会叠加靠拢,然后一直这样,不断的叠加最终拼凑出2048这个数字就算成功.但是我们的程序没有终点. 一.HTML部分 1 <body> 2 <!-- 分数行 --> 3 <p id="scorePane

自制Unity小游戏TankHero-2D(3)开始玩起来

自制Unity小游戏TankHero-2D(3)开始玩起来 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的.仅为学习Unity之用.图片大部分是自己画的,少数是从网上搜来的.您可以到我的github页面(https://github.com/bitzhuwei/TankHero-2D)上得到工程源码. 本篇主要记录金币.按钮.坦克工厂.小地图等小部件,让整个场景初步成为一个可玩的游戏. 在本篇在制作过程中,

小游戏●贪吃蛇1(利用二维数组制作)

利用二维数组编写简单贪吃蛇小游戏,由于是初学C#,用的是单线程,所以蛇不会自动前进 代码及简要分析如下: 1 //定义地图,0为空,1为墙,2为蛇,3为食物 2 int[,] map = new int[15, 15]{ 3 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 4 {1,2,0,0,0,0,0,0,0,0,0,0,0,0,1}, 5 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 6 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

C# 开发2048小游戏

这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的童鞋完成了. 更改建议: a.当数字超过四位数时,显示的时候有部分被它的容器TextBox遮挡了,能不能把显示的数值变小点?答案是可以的.代码里有一段通过矩阵数据填充TextBox值的操作,可以在填充时,判断下数值长度,然后修改TextBox的文字大小. b.玩游戏的时候,使用方向键移动时,焦点可能