爽!用golang 手擼了個簡單的貪吃蛇

xiaomifdsa發表於2022-07-20

背景

題主現在是php程式設計師, 學了一週的golang, 深刻的感受到了其特性的優雅及功能的強大, 為了增強熟練度, 決定來寫個貪吃蛇來踐行下.(底部有github專案連結)

需求構思

1. 確定元素
    --- 食物
    - 分數
    - 基本的提示資訊

2. 使用者故事
    - 蛇撞牆, 死亡
    - 蛇吃蛋分數加1, 身體增加一格長度.
    - 點選鍵盤左鍵, 蛇向左走
    - 點選鍵盤右鍵, 蛇向右走
    - 點選鍵盤上鍵, 蛇向上走
    - 點選鍵盤下鍵, 蛇向下走
    - 點esc, 退出遊戲

邏輯構思

元素使用者故事都確定了, 就要開始寫程式碼嗎? 寫專案不是這樣的!要踐行以終為始(很重要!, 否則可能會造成程式碼的荒草叢生), 先去思考一下我們的程式碼結構是什麼樣子的.

手持遊戲機為例.

  • 遊戲機其實就是一個服務(Service), 然後螢幕鍵盤統一由遊戲機調配.
    • 螢幕(provider)
    • 鍵盤控制(provider)

然後我們細分一下螢幕和鍵盤控制的元素:

  • 螢幕: 蛇,食物,螢幕寬及高,得分.
  • 鍵盤控制: 使用者移動指令,使用者退出指令, 蛇死亡指令.

程式碼結構

//game control 遊戲資料結構
type game struct {
   //控制
   control *control
   //螢幕
   screen *screen
}
//control 鍵盤控制
type control struct {
   moveChannel           chan int
   quitChannel           chan int
   playGameStatusChannel chan bool
   gameOver              bool
   direction             int
}
//screen 螢幕相關引數
type screen struct {
   snakes    *snake
   foodPoint *scope
   width     int
   height    int
   score     int
}
//NewGameService 例項化遊戲服務
func NewGameService() *gameService {
   return &gameService{screenApp: newScreenApp(), monitorApp: newMonitorApp()}
}
//newScreenApp 螢幕例項化
func newScreenApp() *screenApp {
   return &screenApp{Screen: initScreenHandle()}
}
//newMonitorApp 例項化
func newMonitorApp() *monitorApp {
   return &monitorApp{Monitor: initMonitor()}
}

小結

個人認為專案的程式碼的結構寫的還算清晰,所以不放過多程式碼了, 只是把一個全域性的結構圖景放到這裡, 留給你去探索. 這個小專案的程式碼邏輯肯定還不完善,你如果有什麼想法或者吐槽, 可以在下方留言,每個我都會認真閱讀和回覆.?

最後放上專案連結(?????? 感覺不錯, 別忘star哦 ??????):
github.com/TheOnlines/golang_snake...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章