學(xué)員寧嘉欣的高光時刻!
? ? 經(jīng)過近一年的VBA編程學(xué)習(xí),學(xué)員寧嘉欣從零基礎(chǔ)到把我狂虐,不禁深深的被當(dāng)代大學(xué)生的聰明與智慧所折服!
? ? 事情的起因是這樣的(最后附上學(xué)員代碼及照片):
? ? 2023年7月18日晚上課時,我說:“今天做個2048游戲,在表格內(nèi)畫個4X4的游戲區(qū)域,增加兩個按鈕,一個是開始,一個是上,今天只寫上鍵的代碼?!?游戲界面如下圖:

? ? 我繼續(xù)說:“我以前寫的代碼分兩部分,一是先做合并,二是再做移動,那么,我們能不能用一步來完成合并和移動這兩個動作呢?”
? ? 然后我就和學(xué)員們一起寫起代碼來,我雖然做到了一步完成合并和移動這兩個動作,但代碼有50行之多,且包含非常多的判斷。非常的不如意!
? ? 此時學(xué)員寧嘉欣向我示意,她也完成了代碼,當(dāng)我看到她的代碼時,驚出了一身的冷汗,她只用了22行代碼就完成了任務(wù),且連隨機(jī)放置下一數(shù)也做好了。代碼如下:

? ? 我問她:“你能給我講一下嗎?”
? ? 她簡單給我描述了一下原理,大意如下,她為了省去過多的、煩人的判斷,采用了數(shù)組與表格的互動方式進(jìn)行制作,先用數(shù)組arr取得游戲區(qū)域的數(shù)值,再將表格內(nèi)游戲區(qū)域的2-3行內(nèi)容清空,定義變量endRow用于取表格內(nèi)游戲區(qū)域最后一行的行號。然后判斷數(shù)組arr的當(dāng)前位置是否為空,不為空,就將內(nèi)容放置回表格的相應(yīng)位置,再判斷表格內(nèi)上下相鄰的兩個數(shù)是否相等,相等則相加,并清空多余的數(shù)。
? ? 看完她的代碼并運(yùn)行后,基本沒有什么錯誤,我就說,你試試224組合,如下圖:

? ? 結(jié)果出現(xiàn)了錯誤,原因當(dāng)然出在取最后一行的行號上。
? ? 沒想到,她很快就改好了代碼,只增加了一個判斷和一條語句:
? ? arr(endRow, i) <> 1? ??
? ? arr(endRow, i) = 1
更改后的代碼如下:

最后點(diǎn)評一下:
? ? 1、因?yàn)橛螒騾^(qū)域只剩第一行了,所以,內(nèi)循環(huán)為 2 to 4 ,這點(diǎn)非常的好;
? ? 2、使用endRow取最后一行的行號的方法是點(diǎn)睛之筆;
? ??
附上學(xué)員寧嘉欣的全部代碼:
Sub UP_Click()? ? ? '上鍵
? ? Dim i&, j&, endRow&
? ? arr = Range("a1:d4")
? ? Range("a2:d4").ClearContents
? ? For i = 1 To 4
? ? ? ? For j = 2 To 4
? ? ? ? ? ? endRow = Cells(Rows.Count, i).End(xlUp).Row
? ? ? ? ? ? If arr(j, i) <> "" Then
? ? ? ? ? ? ? ? If Cells(1, i) = "" Then
? ? ? ? ? ? ? ? ? ? Cells(endRow, i) = arr(j, i)
? ? ? ? ? ? ? ? Else
? ? ? ? ? ? ? ? ? ? Cells(endRow + 1, i) = arr(j, i)
? ? ? ? ? ? ? ? End If
? ? ? ? ? ? End If
? ? ? ? ? ? If Cells(endRow + 1, i) = Cells(endRow, i) And Cells(endRow, i) <> "" And arr(endRow, i) <> 1 Then
? ? ? ? ? ? ? ? Cells(endRow, i) = Cells(endRow, i) + Cells(endRow + 1, i)
? ? ? ? ? ? ? ? Cells(endRow + 1, i) = ""
? ? ? ? ? ? ? ? arr(endRow, i) = 1
? ? ? ? ? ? End If
? ? ? ? Next
? ? Next
? ? Call t
End Sub
Sub t()? ? ? ? ?'隨機(jī)放置一個2
? ? Dim i&, r&, c&, arr(1 To 16), js&
? ? For i = 0 To 15
? ? ? ? r = i \ 4 + 1
? ? ? ? c = i Mod 4 + 1
? ? ? ? If Cells(r, c) = "" Then
? ? ? ? ? ? js = js + 1
? ? ? ? ? ? arr(js) = i + 1
? ? ? ? End If
? ? Next
? ? If arr(1) = "" Then
? ? ? ? MsgBox "你輸了"
? ? Else
? ? ? ? i = arr(Rnd * (js - 1) + 1) - 1
? ? ? ? r = i \ 4 + 1
? ? ? ? c = i Mod 4 + 1
? ? ? ? Cells(r, c) = 2
? ? End If
End Sub
Sub kaishi()? ? ? ? '開始按鈕
? ? Dim i&
? ? Range("a1:d4").ClearContents
? ? For i = 1 To 8
? ? ? ? Call t
? ? Next
End Sub
最后附上學(xué)員照片:
