背景
題主現在是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 協議》,轉載必須註明作者和本文連結