在前一天,我們已經完成了 Sudoku 基本盤面繪製,能在畫面上顯示 9x9 的格子結構。
今天的目標是讓玩家能夠「操作遊戲」,具體來說:
// DetectCursor - 游標移動
func (gameLayout *GameLayout) DetectCursor() {
// 游標移動偵測
if inpututil.IsKeyJustPressed(ebiten.KeyArrowUp) {
gameLayout.gameInstance.Board.DecreaseCursorRow()
return
}
if inpututil.IsKeyJustPressed(ebiten.KeyArrowDown) {
gameLayout.gameInstance.Board.IncreaseCursorRow()
return
}
if inpututil.IsKeyJustPressed(ebiten.KeyArrowLeft) {
gameLayout.gameInstance.Board.DecreaseCursorCol()
return
}
if inpututil.IsKeyJustPressed(ebiten.KeyArrowRight) {
gameLayout.gameInstance.Board.IncreaseCursorCol()
return
}
}
// DetectInput - 處理鍵盤輸入
func (gameLayout *GameLayout) DetectInput() {
board := gameLayout.gameInstance.Board
targetRow := board.CursorRow
targetCol := board.CursorCol
targetCell := board.Cells[targetRow][targetCol]
// 偵測合法數字輸入
// 數字輸入
for key := ebiten.KeyDigit1; key <= ebiten.KeyDigit9; key++ {
if inpututil.IsKeyJustPressed(key) {
if targetCell.Type != game.Preset {
value := int(key - ebiten.KeyDigit0)
// 檢查輸入的值是否為放入是否能會造成 Conflict
if !board.IsSafe(targetRow, targetCol, value) {
// 標示為 Conflict Input
board.Cells[targetRow][targetCol].Type = game.InputConflict
} else {
board.Cells[targetRow][targetCol].Type = game.Input
}
// 更新輸入
board.Cells[targetRow][targetCol].Value = value
}
return
}
}
// 清除輸入
if inpututil.IsKeyJustPressed(ebiten.Key0) || inpututil.IsKeyJustPressed(ebiten.KeyDelete) {
if targetCell.Type != game.Preset {
// 清空目前 Cell 的值
board.Cells[targetRow][targetCol].Value = 0
board.Cells[targetRow][targetCol].Type = game.Empty
}
return
}
}
https://github.com/leetcode-golang-classroom/sudoku-game/actions/runs/17530043633
明天我們將實作 即時規則檢查: