January 6, 2012

撰寫 Java 與 Android 多人連線橋牌 Bridge 遊戲

大三下的期末專題,分別撰寫 Java 與 Android 多人連線橋牌 Bridge 遊戲。Java 版本為純文字介面,Android 版本則為圖形介面。


目錄


(一) 規劃

在 Android 手機上實作一個可多人連線的橋牌遊戲。

1. 介面設計與互動方式

2. 系統流程

3. 系統架構

4. 開發工具與環境

  • Java 6
  • SQLite
  • Eclipse (with Android SDK)
  • Android 2.2 OS platform

(二) Java 版本

在規劃階段由於我比較忙,幾乎都由 Lance 和 小劉 處理。

為了彌補他們,順便測試一下未來實作在 Android 上時可能運到的問題,於是我自己先實作了一個 Java 版本的多人連線橋牌。

1. 開發提示

說穿了就是一個 Server 與三個 Client 的 Java Socket Programming 而已。

Socket 部分寫完後,剩下就是設計 API、資料結構、邏輯處理及實作橋牌遊戲規則。

最麻煩的應該是測試吧,在沒有自動化測試的前提下,每次測試都要花上 2~5 分鐘。

由於橋牌本身規則的特性,我採用 State Machine 來控制遊戲流程:

  • WaitingRoom State:等待連線(四個人連上後遊戲才開始)。
  • ChooseSeat State:選擇位置(與隊友做對面,與對手坐左右),選完後決定莊家。
  • ShuffleDeal State:洗牌並發牌。
  • Auction State:由莊家開始叫牌,直到所有人 Pass 為止。
  • GameStart State:遊戲開始,輪流出牌吃墩直到結束。
  • GameOver State:遊戲結束。

2. 成果

等待連線中。左上角為 Server,其餘為 Client:

所有 Client 都連上了,選擇位置並指定莊家:

洗牌並發牌完成,由剛剛指定的莊家開始叫牌:
(由於只有文字介面,因此我分別以四種顏色表示撲克牌的四個花色)

經過激烈的叫牌後,遊戲開始,由叫到牌的下家先出牌:

每個人出玩牌後,其資訊或 broadcast 給所有玩家,並輪到下個人出牌:

當四個人都出牌完畢後,顯示該墩由哪兩個玩家吃掉,並由剛剛吃掉的玩家出牌:

當輪到我出牌時,輸入 0 可以觀看歷史出牌紀錄,包含:
- 目前座位。
- 王是哪個花色。
- 我需要贏幾墩才能贏得遊戲。
- 我已經贏了幾墩。
- 對手需要贏幾墩才能贏得遊戲。
- 對手已經贏了幾墩。
- 所有撲克牌,已經出現在場上過的牌以深色表示。
- 過去所有的出牌紀錄(包含誰出哪張牌,誰贏等等)

遊戲結束後,可以選擇要重新選座位,還是依照目前的座位直接繼續下一場遊戲:


(三) Android 版本

Java 版本做完後,基本上只要移植到 Android 上即可,但是 Java 版本只有文字介面,轉到 Android 上後,UI 部分會是個問題。

我當時在交大創新中心的公司打工,並使用 Corona SDK 開發跨平台的 App。

而那時 Corona SDK 除了商業用途以外皆可免費使用,於是我們改用 Corona SDK 與 Lua 程式語言 來撰寫我們的橋牌遊戲。

Corona SDK 比用 Java 開發要簡單得多了。雖然沒有嚴謹的 OOP,但 UI 的效果很令人滿意,內建的模擬器也解決了我們測試的困擾,大大加速開發速度。

最後的成果如以下的展示影片:

https://www.youtube.com/watch?v=iJ1tl20YDj0

我負責寫 Lua,小劉提供遊戲的圖形 UI,Lance 負責測試。