iT邦幫忙

2025 iThome 鐵人賽

DAY 11
2

🎯 主題

當盤面已出現了 2048 的方格,會判斷顯示遊戲已達成勝利條件。
這是 2048 遊戲的重要勝利條件,能讓玩家在達成勝利條件時,看到明確的「You Win」提示。
並且可以讓玩家選擇是否繼續往下操作盤面。

📝 開發目標

  • 檢查盤面是否有達成勝利條件:判斷是否出現 2048(代表達成勝利狀態)。
  • 觸發 You Win 狀態:若上述條件滿足時,將 isPlayerWin = true。
  • 在畫面上顯示提示:當遊戲勝利時,在畫布中央顯示 "You Win" 文字。
  • 在畫面上顯示: 可以繼續遊戲的 button 區塊 ,例如顯示 continue 的方塊
  • 當使用者按下可以繼續遊戲的 button 區塊 ,需要把 isContinue 標記在遊戲狀態,避免影響其他狀態的判斷

🧩 核心邏輯

  1. 判斷盤面是否以達成勝利條件
// is2048tileShow - 檢查是否已經達成 2048 tile 的完成條件
func (g *Game) is2048tileShow() bool {
	for row := 0; row < sideSize; row++ {
		for col := 0; col < sideSize; col++ {
			if g.board[row][col] == 2048 {
				return true
			}
		}
	}

	return false
}

// IsPlayerWin - 檢查玩家是否達成勝利條件
func (g *Game) IsPlayerWin() bool {
	return g.is2048tileShow()
}
  1. 在 Ebiten 畫面顯示 You Win
// drawYouWin 畫出 You Win
func (g *GameLayout) drawYouWin(screen *ebiten.Image) {
	g.drawConverOnYouWin(screen)
	// 設定顯示 Game Over 文字
	textXPos := WinHeight / 2
	textYPos := WinWidth / 2
	textOpts := &text.DrawOptions{}
	textOpts.ColorScale.ScaleWithColor(color.RGBA{220, 220, 0, 255})
	textOpts.PrimaryAlign = text.AlignCenter
	textOpts.SecondaryAlign = text.AlignCenter
	textOpts.GeoM.Translate(float64(textXPos), float64(textYPos))
	text.Draw(screen, "You Win", &text.GoTextFace{
		Source: mplusFaceSource,
		Size:   48.0,
	}, textOpts)
	g.drawContinueButton(screen)
}
  1. 在 Update 中偵測觸發條件
// Update - 用來處理畫面偵測,與使用者互動,並且觸發狀態變更
func (g *GameLayout) Update() error {
	// 判斷是否遊戲結束
	if g.isGameOver {
		// 處理 restart 邏輯
		g.handleRestartGame()
		return nil
	}

	// 判斷是否 Player Win
	if g.isPlayerWin && !g.isContinue {
		g.handleContinueGame()
		return nil
	}
	// 根據輸入產生對應的更新
	g.handleInput()

	// 根據目前的盤面決定是否要顯示 You Win
	if !g.isContinue && g.gameInstance.IsPlayerWin() {
		g.isPlayerWin = true
		return nil
	}

	// 根據目前的盤面跟更新是否能夠繼續執行
	if g.gameInstance.IsGameOver() {
		g.isGameOver = true
	}
	return nil
}

執行結果

https://ithelp.ithome.com.tw/upload/images/20250824/20111580ZeDCISLbHE.png

✅ 驗收條件

  • 當盤面出現 2048 格子時,遊戲顯示 "You Win" 文字。
  • 遊戲在 You Win 後不再響應滑動,並且顯示 "Continue" 按鈕。
  • 當按下 Continue 按鈕後,玩家可以繼續操作。
  • 可保留棋盤內容供玩家查看。

github action 測試

https://github.com/leetcode-golang-classroom/2048-game/actions/runs/17187588331

📌 本日收穫

  • 學會用遊戲狀態檢查 判斷遊戲勝利條件顯示。
  • 完成 遊戲狀態管理,能鎖住畫面避免額外輸入。
  • 在 Ebiten 中動態繪製提示訊息。

🔮 明日預告

採地雷遊戲規則與玩法理解

  • 說明 遊戲目標:在不踩到地雷的情況下,翻開所有安全格子。
  • 介紹 基本操作:翻開格子、插旗標記地雷、數字代表周圍地雷數。
  • 探討 勝負條件:成功翻開所有安全格 → 勝利;踩到地雷 → 遊戲結束。

上一篇
2048 遊戲:判斷 Game Over
下一篇
採地雷遊戲:規則與玩法理解
系列文
在 ai 時代 gopher 遊戲開發者的 30 天自我養成20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言