clone

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

feat/elo-difficulty
puzzletea / games / sudoku / gamemode.go
gamemode.go 2.1K
1package sudoku23import (4 _ "embed"5 "math/rand/v2"67 "github.com/FelineStateMachine/puzzletea/difficulty"8 "github.com/FelineStateMachine/puzzletea/game"9 "github.com/FelineStateMachine/puzzletea/gameentry"10 "github.com/FelineStateMachine/puzzletea/puzzle"11)1213//go:embed help.md14var HelpContent string1516type SudokuMode struct {17 game.BaseMode18 ProvidedCount int19}2021var (22 _ game.Mode = SudokuMode{}23 _ game.Spawner = SudokuMode{}24 _ game.SeededSpawner = SudokuMode{}25 _ game.EloSpawner = SudokuMode{}26)2728func NewMode(title, description string, providedCount int) SudokuMode {29 return SudokuMode{30 BaseMode: game.NewBaseMode(title, description),31 ProvidedCount: providedCount,32 }33}3435func (s SudokuMode) Spawn() (game.Gamer, error) {36 return New(s, GenerateProvidedCells(s))37}3839func (s SudokuMode) SpawnSeeded(rng *rand.Rand) (game.Gamer, error) {40 return New(s, GenerateProvidedCellsSeeded(s, rng))41}4243var Modes = []game.Mode{44 NewMode("Beginner", "45–52 clues. Single Candidate / Scanning.", 45),45 NewMode("Easy", "38–44 clues. Naked Singles.", 38),46 NewMode("Medium", "32–37 clues. Hidden Pairs / Pointing.", 32),47 NewMode("Hard", "27–31 clues. Box-Line Reduction / Triples.", 27),48 NewMode("Expert", "22–26 clues. X-Wing / Y-Wing.", 22),49 NewMode("Diabolical", "17–21 clues. Swordfish / XY-Chains.", 17),50}5152var ModeDefinitions = sudokuModeDefinitions(Modes)5354func sudokuModeDefinitions(modes []game.Mode) []puzzle.ModeDef {55 defs := gameentry.BuildModeDefs(modes)56 presets := []difficulty.Elo{0, 600, 1200, 1800, 2400, 3000}57 for i := range defs {58 if i >= len(presets) {59 break60 }61 elo := presets[i]62 defs[i].PresetElo = &elo63 }64 return defs65}6667var Definition = puzzle.NewDefinition(puzzle.DefinitionSpec{68 Name: "Sudoku",69 Description: "Fill the 9x9 grid following sudoku rules.",70 Modes: ModeDefinitions,71 DailyModeIDs: puzzle.SelectModeIDsByIndex(ModeDefinitions, 1, 2),72})7374var Entry = gameentry.NewEntry(gameentry.EntrySpec{75 Definition: Definition,76 Help: HelpContent,77 Import: game.AdaptImport(ImportModel),78 Modes: Modes,79 Print: PDFPrintAdapter,80})