iT邦幫忙

2025 iThome 鐵人賽

DAY 9
1

主題

使用 Ebiten inpututil 偵測鍵盤方向鍵,並驅動滑動邏輯更新盤面。

今日目標

  1. 偵測方向鍵輸入
  • 使用 Ebiten 的 inpututil.IsKeyJustPressed 方法監聽方向鍵(↑、↓、←、→)事件。
  • 確保玩家快速連按時仍能準確觸發一次滑動,不會因為長按重複觸發多次。
  1. 滑動邏輯整合
  • 將 Day 5(左滑)與 Day 6(四方向滑動)邏輯整合成一個 MoveBoard(direction Direction) 方法。
  • direction 可定義成枚舉型態,例如:
type Direction int
const (
    Up Direction = iota
    Down
    Left
    Right
)
  1. 每次滑動後執行:
  • 更新棋盤狀態
  • 新增隨機數字(Day 4 的邏輯)
  • 檢查是否 Game Over(Day 10 預備)
  1. 渲染更新
  • 當滑動邏輯更新棋盤資料結構後,觸發 Ebiten 畫面重新渲染(利用 Day 7、Day 8 的渲染系統)。

實作重點

使用 Update() 處理鍵盤輸入:

package layout

import (
	"github.com/hajimehoshi/ebiten/v2"
	"github.com/hajimehoshi/ebiten/v2/inpututil"
	"github.com/leetcode-golang-classroom/2048-game/internal/game"
)

// Update - 用來處理畫面偵測,與使用者互動,並且觸發狀態變更
func (g *GameLayout) Update() error {
	if inpututil.IsKeyJustPressed(ebiten.KeyArrowUp) {
		g.gameInstance.MoveUp()
		g.gameInstance.AddRandomTile(game.DirectionUp)
	}
	if inpututil.IsKeyJustPressed(ebiten.KeyArrowDown) {
		g.gameInstance.MoveDown()
		g.gameInstance.AddRandomTile(game.DirectionDown)
	}
	if inpututil.IsKeyJustPressed(ebiten.KeyArrowLeft) {
		g.gameInstance.MoveLeft()
		g.gameInstance.AddRandomTile(game.DirectionLeft)
	}
	if inpututil.IsKeyJustPressed(ebiten.KeyArrowRight) {
		g.gameInstance.MoveRight()
		g.gameInstance.AddRandomTile(game.DirectionRight)
	}

	return nil
}
  • 確保一次按鍵對應一次滑動,避免「長按多移動」。
  • 把 遊戲邏輯(滑動、合併、新增數字) 與 渲染邏輯(顯示畫面) 分開,保持程式結構乾淨。

驗收條件

  • 執行遊戲後,使用鍵盤方向鍵可以控制數字格滑動。
  • 每次滑動後畫面立即更新,並正確新增一個隨機數字(2 或 4)。
  • 連續快速操作方向鍵時,不會漏掉或重複觸發滑動。

使用 gemini cli 產生測試案例的 prompt

gemini -p  "你是一位 Golang + Ebiten 遊戲測試專家。請依照以下規格生成可驗證 2048 遊戲鍵盤控制與盤面更新的單元測試案例,格式為 Golang `*_test.go` 檔案。

【測試目標】
1. 確認按下方向鍵(↑、↓、←、→)時,對應的 MoveBoard(direction) 方法會被正確呼叫。
2. 驗證每次滑動後,棋盤狀態有正確更新。
3. 確認每次滑動後,會新增一個隨機的 2 或 4。
4. 按鍵只觸發一次滑動,不會因為長按而多次觸發。
5. 測試快速連按多個方向鍵時,盤面更新正確。

【前置條件】
- 使用 Ebiten 的 inpututil 偵測鍵盤輸入。
- MoveBoard(direction) 已實作並可正常運作。
- 新增隨機數字邏輯已完成(Day 4 的功能)。
- 棋盤資料結構為 4x4 int 二維陣列。
- 渲染部分可忽略,不在測試範圍。

【測試案例需求】
- 使用 table-driven test 設計多組方向鍵輸入測試。
- 模擬鍵盤輸入(可用自訂 mock Input API 或模擬 key press 狀態)。
- 測試檔案命名為 `game_input_test.go`。
- 每個測試案例需附上簡短註解說明測試目的。

請依據上述規格輸出完整的 Golang 單元測試程式碼,並確保可直接執行 `go test` 驗證。"

執行畫面

https://ithelp.ithome.com.tw/upload/images/20250823/20111580r2aToc5kPg.png

測試結果

https://github.com/leetcode-golang-classroom/2048-game/actions/runs/17163776490/job/48699159378

🎯 本日收穫(Day 9)

今天的重點是將 Ebiten 的 inpututil 鍵盤事件偵測 與 2048 的滑動邏輯 整合,讓遊戲可以透過鍵盤方向鍵操作:

  • 學會使用 inpututil.IsKeyJustPressed 來偵測「按下瞬間」的事件,避免長按多次觸發。
  • 成功將鍵盤輸入映射到 MoveBoard(direction) 方法,讓滑動邏輯與資料更新同步。
  • 每次滑動後能自動新增一個隨機的 2 或 4,遊戲互動性完成。
  • 完成了初步的 事件驅動遊戲循環,遊戲從此可以被完整地「玩」起來。

🔮 明日預告(Day 10)

明天我們將進入 遊戲結束判斷 的開發:
實作 Game Over 條件檢查:
盤面已無空格。
任意方向都無法再合併方塊。
在遊戲結束時顯示 Game Over 提示文字。
保留盤面供玩家檢視,並等待重新開始的按鍵事件。


上一篇
2048 遊戲 - 顯示數字格與顏色
下一篇
2048 遊戲:判斷 Game Over
系列文
在 ai 時代 gopher 遊戲開發者的 30 天自我養成20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言