[Scratch] 數字賓果遊戲 (Number Bingo Game)

[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) 囉~

 

(本頁面已被瀏覽過 136 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料