用Excel編寫小遊戲 (轉)

themoney發表於2007-10-04
用Excel編寫小遊戲 (轉)[@more@]

遊戲要給予人的是歡娛快樂而非困擾鬧心,要滿足玩樂之心,有時一片樹葉已經足夠。對於我們這些遊戲開發愛好者來說,asm、c、c++、、opengl、flash等並非是我們必需的知識和工具,有時一些意想不到的實現更能體現遊戲簡單的真意。

辦公大家熟悉不過,其功能我不多說。但大家可有想過在Excel中也可實現個把小遊戲?這個不是指97版Excel中的復活節彩旦遊戲,而是實實在在的利用Excel資源編寫、在Excel下執行的小遊戲。經過幾代的升級,ms 下的vba( 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_pAs 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
  Ranize
  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中的ionChange事件),遊戲就判斷這個格是否在遊戲區域中,若是就判斷上下左右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
L
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事件加以限制(不過這樣的遊戲都要作弊我無話可說)。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10794571/viewspace-974708/,如需轉載,請註明出處,否則將追究法律責任。

相關文章