做什么?vba不仅可以给工作带来便捷,提高工作效率(之前做了个Excel合并、拆分分割的工具),还能做单机小游戏。
网上看了下,可以做好多单机游戏。
怎么做?通过网上看了下大致的算法逻辑,自己尝试写了个。
主要是理解算法逻辑就好写了:前(后)移动,合并(包括相加)。
学会了:1.过程或函数中可选参数及默认值的写法,optionalisBFasboolean=true。
2.数组的重新定义,redimpreserve。
3.过程中怎么设置类似函数返回值。可以利用数组的地址引用byRef来获取返回值。
4.随机数的生成,Randomize,rnd()。
5.进一步熟悉数组使用。二维数组拆分一维数组,()。
6.按键监控触发事件,"{up}","过程名"向上键。
……
……
还有疑问:1.就是按键监控触发事件,"{up}","过程名",过程是否可以带参数呢?
2.算法逻辑是否可以优化。
主要过程sub代码如下:Sub数字前后移动(ByRefarr(),OptionalisBFAsBoolean=True)Dimi%,l%,u%,j%Diminx(1To4)l=LBound(arr)u=UBound(arr)IfisBFThenFori=lTouIfarr(i)""Andarr(i)0Thenj=j+1inx(j)=arr(i)IfNextiElsej=uFori=uTolStep-1Ifarr(i)""Andarr(i)0Theninx(j)=arr(i)j=j-1IfNextiIfFori=1To4arr(i)=inx(i)NextiSub
'isBFb表示back后开始相加f表示前相加forward,默认true为前Sub合并相加(ByRefinx(),OptionalisBFAsBoolean=True)Dimi%IfisBFThenFori=1ToUBound(inx)-1'(i)Ifinx(i)=""Orinx(i)=0ThenGoToAIfIfinx(i)=inx(i+1)Theninx(i)=inx(i)*2inx(i+1)=""IfA:NextiElseFori=UBound(inx)ToLBound(inx)+1Step-1Ifinx(i)=""Orinx(i)=0ThenGoToBIfIfinx(i)=inx(i-1)Theninx(i)=inx(i)*2inx(i-1)=""IfB:NextiIfSub
''向下移动SubmoveDown()DimshtAsWorksheetDimi%,j%,tempDimarr(),brr()Setsht=(2)arr=("a1:d4")ReDimcrr(1ToUBound(arr))arr=(arr)Fori=1To4crr=(arr,i)Call数字往前移动(crr,False)Call合并相加(crr,0)Call数字往前移动(crr,0)ReDimPreservebrr(1Toi)brr(i)=crrNextibrr=(brr)("a1:d4")=brrErasecrrErasebrrErasecrrSub