[Scratch] 數字賓果遊戲 (Number Bingo Game)
最近想到用 Scratch 做數字賓果遊戲,
原本以為很簡單,不就是 25 個數字圈一下,
連幾條線,誰的線達到 5 條,誰就獲勝而已嗎?
結果一做,發現事情不是憨人想的那麼簡單…
先看看最終完成的遊戲畫面如下:
1. 產生棋盤
一開始產生 5×5 棋盤並不難,
先將畫面分割成左右兩半,
算一下 5×5 每一格的長度和寬度,
用畫筆畫直線,就能畫出整個棋盤:
2. 初始雙方的數字排列
至於玩家和電腦 (敵人) 的數字排列,
就是 1~25 插入一個陣列的隨機位置,
這樣數字的排列就有足夠的亂度了:
原本是讓玩家自己填數字要擺哪,
不過後來發現要填 25 個數字太花時間了,
因此改成玩家的數字也是隨機產生就好~
3. 將數字顯示在棋盤上
接著將陣列裡的 25 個數字「畫」到棋盤上~
我是使用一個角色,它有 n1, n2, …, n25 等裝扮 (costume),
要畫 17 這個數字時,就切換裝扮到 n17,
再用 stamp 指令把角色「印」到舞台上:
這邊有一點要注意的,
就是裝扮的名稱不能只取數字如 1, 2, … 25,
因為切換裝扮 (switch costume) 的參數給數字時,
Scratch 會認為是切換到第 (數字) 個裝扮,
很有可能跟你預期的不同,因此我都會在前面加個文字 (變成如 n1, n2…),
確保 Scratch 是使用裝扮的「名稱」而非「索引」值~
4. 讓玩家圈選數字
開始圈選數字的階段,就是玩家和電腦交替操作,
一方圈選完數字後,就換另一方圈選,
同時要一直計算雙方的連線數,
如果有人達到 5 條線以上,遊戲就結束了:
如果現在是換玩家圈選時,
我用了一個圓圈角色,它會隨著滑鼠移動,
讓玩家可以圈選數字,直到玩家選到某個數字為止:
當玩家用滑鼠點下某個數字時,事實上是點在舞台 (stage)上,
(因為這些數字都不是角色,只是角色的圖印在舞台上)
因此我在舞台那邊加上了被點擊的事件:
而當收到了滑鼠點擊的事件時,
就用點下的座標,計算出這應該是哪一個格子,
從而得出被圈選到的是哪一個數字:
這時把圈圈印在選定的數字上,
將陣列中的數字改成 “C”,代表已被圈選,
(圈選之後,原本的數字是多少已經不重要了)
並同時檢查是否有構成新的連線:
5. 檢查是否連線
檢查連線時,我是依序檢查 5 條橫線、直線、以及兩條斜線:
不管是哪一種線,檢查的過程一樣,
5 個數字裡如果有任何一個不為 C (代表尚未圈選),這條線就尚未完成~
同時,會把這條線上的每個數字存成 “數字_數字_數字_數字_數字” 這種字串:
如果這條線真的完成時,可以拿來比較是否是以前就完成的線。
如果是新的線的話,就將其畫出來:
以檢查橫線為例,
對於每一條橫線,由左至右檢查此橫線是否能形成。
直線的檢查也是類似的方法:
兩條斜線也是類似的檢查方法:
6. 讓電腦圈選數字
這應該是最困難的部分了…
理論上可以找出圈選哪個數字,會比較快構成線,
但那得掃瞄每一條線並計算權重,
老實說得再寫不少程式,
因此我現在只是簡單做,就隨機選一個還沒圈選的數字。
想當然耳,電腦的智慧就蠻低的,幾乎是不可能贏過玩家…
另一種想做的人工智慧,是類似蒙地卡羅的方法,
以隨機模擬的方式,看看圈選某個數字後,
模擬出棋盤最終的狀態,來計算勝率。
但這以 Scratch 來寫的話,一樣是不太好寫,
要儲存很多資料,而且 Scratch 的變數又不太方便使用…
只能以後看看能不能改進了…
有興趣的人,可以玩一下 數字賓果遊戲 (Number Bingo Game) 囉~