clone

fifteen puzzle games for the terminal, with daily puzzles, weekly ladders and xp, built on bubble tea

chore/regenerate-vhs-gifs
puzzletea / sudoku / gamemode.go
gamemode.go 1.7K
1package sudoku23import (4 _ "embed"5 "math/rand/v2"67 "github.com/FelineStateMachine/puzzletea/game"8 "github.com/FelineStateMachine/puzzletea/gameentry"9 "github.com/FelineStateMachine/puzzletea/puzzle"10)1112//go:embed help.md13var HelpContent string1415type SudokuMode struct {16 game.BaseMode17 ProvidedCount int18}1920var (21 _ game.Mode = SudokuMode{}22 _ game.Spawner = SudokuMode{}23 _ game.SeededSpawner = SudokuMode{}24)2526func NewMode(title, description string, providedCount int) SudokuMode {27 return SudokuMode{28 BaseMode: game.NewBaseMode(title, description),29 ProvidedCount: providedCount,30 }31}3233func (s SudokuMode) Spawn() (game.Gamer, error) {34 return New(s, GenerateProvidedCells(s))35}3637func (s SudokuMode) SpawnSeeded(rng *rand.Rand) (game.Gamer, error) {38 return New(s, GenerateProvidedCellsSeeded(s, rng))39}4041var Modes = []game.Mode{42 NewMode("Beginner", "45–52 clues. Single Candidate / Scanning.", 45),43 NewMode("Easy", "38–44 clues. Naked Singles.", 38),44 NewMode("Medium", "32–37 clues. Hidden Pairs / Pointing.", 32),45 NewMode("Hard", "27–31 clues. Box-Line Reduction / Triples.", 27),46 NewMode("Expert", "22–26 clues. X-Wing / Y-Wing.", 22),47 NewMode("Diabolical", "17–21 clues. Swordfish / XY-Chains.", 17),48}4950var ModeDefinitions = gameentry.BuildModeDefs(Modes)5152var Definition = puzzle.NewDefinition(puzzle.DefinitionSpec{53 Name: "Sudoku",54 Description: "Fill the 9x9 grid following sudoku rules.",55 Modes: ModeDefinitions,56 DailyModeIDs: puzzle.SelectModeIDsByIndex(ModeDefinitions, 1, 2),57})5859var Entry = gameentry.NewEntry(gameentry.EntrySpec{60 Definition: Definition,61 Help: HelpContent,62 Import: game.AdaptImport(ImportModel),63 Modes: Modes,64 Print: PDFPrintAdapter,65})