在我們開始進入連線傳輸資料、規則運算之前,我們是不是忘了很重要的主角?
是的,談到卡牌遊戲當然一定要講卡牌這個部份。
在我們小時候剛學程式,應該或多或少都有寫過撲克牌吧?
作法差不多有兩類:
牌定義好之後,就創造一個陣列把所有的牌丟進去,洗牌、抽牌之類的操作。我想這一類的程式對於初學者來說並不陌生,難度並不高,所以我想針對比較細節的部份談。
通常在實作的時候,我們會用另外一個比陣列方便一點的結構:Stack(堆疊)
它的優點是在抽牌部份很方便,只要用 POP 就可以了,在牌庫使用 Stack 算是不二之選
但是實作手牌的時候,就會很杯具
如果你想要實作比較擬真的手牌操作,像是把牌抽出,插到另外一個位置,就要稍微思考一下怎麼處理了。一般電腦內的陣列都是固定位置的,所以要讓手牌可以任意調整位置,你需要創造一個可以動態抽出和插入的結構。我目前迴避掉這個問題,但我希望未來的卡牌遊戲可以實作這項功能。這在一般網頁好像已經有類似操作了(任意搬移項目),所以應該是可以解決的問題
以我自己實作的部份來說,我針對卡牌操作的部份定義了四個類別:Card, Cards, HandCards, Deck。
Card 就是最基本的卡片沒話說,大致是用 符號+數字命名卡牌,沒有用 id,這是因為有後面的考量。
Cards 是卡片堆,內部其實就是用陣列去裝卡片,可以抽牌,或是把別堆牌合成一疊
HandCards 是手牌堆,額外實作了兩個操作:選牌、出牌。這跟一般在打撲克牌要出牌的過程是一樣的。
Deck 是牌庫,跟卡牌堆一樣,不過複寫了抽牌。它會在牌庫抽乾的時候自動重新洗牌,很 Nice。
今天大概是簡單談,因為卡牌遊戲畢竟還是要有卡牌,所以從這開始談。
再來會談卡牌上面建構抽象的虛擬世界,我們明天見!