玩家端範例
事件迴圈:Dispatcher.eventLoop
, PlayerCtrl.eventLoop
佇列:_inbox
, _outbox
執行緒:Dispatcher.eventLoop
, PlayerCtrl.eventLoop
信號:_ACTIVE
※ PlayerCtrl 其實就是跟遊戲引擎的事件迴圈,因為還沒正式嫁接,故採用模擬的方式呈現。
主控端範例
事件迴圈:playerLoop
x2
佇列:_pipes_from
x2, _pipes_to
x2
執行緒:playerAtionTest
, playerLoop
x2,
forceEnd_countDown
, gameOver_countDown
信號:_actived
x2, _next
, _gameOver
執行緒大致分成兩種:
- 單次執行:完成特定任務,執行結束後會自動釋放
如:倒數計時器、玩家行動模擬函式
- 常駐待命:類似後台服務,使用信號控制啟動。
特色是外面雙層 while True:
Host-demo.py (Repl.it線上執行版) 更新摘要:
- 修正 ActionTest ,改成可外部控制的形式,避免無法中斷的窘境。
於是 ActionTest 變成單次執行,取消無窮迴圈
- 擴充輸出文字,提供更多資訊以便了解執行緒的運作
- 找到設計不良的 Thread,將 playerLoop 改成常駐待命
在 GameCtrl 初始化時建立,避免程式建立重複的執行緒
- 把「事件訊息」封裝成 cmdPack 物件。
不必再考慮是否有額外參數的問題,同時美化無參數的 cmdPack 的列印字串
TODO:
- 封裝主控端和玩家端溝通的介面,保護內部資料
- 實作 GameCtrl「註冊事件」功能,動態控制監聽的事件
- 實作可切換的事件迴圈(大廳操作、賽局操作),增加系統彈性
- 導入 logging 套件(列印文字的靈感來源)至專案
後面工作:
- 整合系統,處理鍵盤滑鼠輸出的事件迴圈、處理玩家端和系統端的連線通訊
- 實作玩家連線建立對戰的流程,可能會用 asyncio 協程處理,玩玩看剛學到的非同步操作
- 實作卡牌層、物件層、規則層
- 把爐石的卡牌機制實作出來
- 嚐試導入 TDD 測試導向開發,讓專案更完善
- 紀錄開發過程中的體驗和心得,結束鐵人賽