clone

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

bug/architecture-test-trim-path
puzzletea / games / takuzu / gamemode.go
gamemode.go 2.6K
1package takuzu23import (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 TakuzuMode struct {17 game.BaseMode18 Size int19 Prefilled float6420}2122var (23 _ game.Mode = TakuzuMode{}24 _ game.Spawner = TakuzuMode{}25 _ game.SeededSpawner = TakuzuMode{}26 _ game.EloSpawner = TakuzuMode{}27)2829func NewMode(title, desc string, size int, prefilled float64) TakuzuMode {30 return TakuzuMode{31 BaseMode: game.NewBaseMode(title, desc),32 Size: size,33 Prefilled: prefilled,34 }35}3637func (t TakuzuMode) Spawn() (game.Gamer, error) {38 complete := generateComplete(t.Size)39 puzzle, provided := generatePuzzle(complete, t.Size, t.Prefilled)40 return New(t, puzzle, provided)41}4243func (t TakuzuMode) SpawnSeeded(rng *rand.Rand) (game.Gamer, error) {44 complete := generateCompleteSeeded(t.Size, rng)45 puzzle, provided := generatePuzzleSeeded(complete, t.Size, t.Prefilled, rng)46 return New(t, puzzle, provided)47}4849var Modes = []game.Mode{50 NewMode("Beginner", "6×6 grid, ~50% clues. Doubles and sandwich patterns.", 6, 0.50),51 NewMode("Easy", "6×6 grid, ~40% clues. Counting required.", 6, 0.40),52 NewMode("Medium", "8×8 grid, ~40% clues. Larger grid, moderate deduction.", 8, 0.40),53 NewMode("Tricky", "10×10 grid, ~38% clues. Uniqueness rule needed.", 10, 0.38),54 NewMode("Hard", "10×10 grid, ~32% clues. Long deduction chains.", 10, 0.32),55 NewMode("Very Hard", "12×12 grid, ~30% clues. Deep logic required.", 12, 0.30),56 NewMode("Extreme", "14×14 grid, ~28% clues. Maximum challenge.", 14, 0.28),57}5859var ModeDefinitions = takuzuModeDefinitions(Modes)6061func takuzuModeDefinitions(modes []game.Mode) []puzzle.ModeDef {62 defs := gameentry.BuildModeDefs(modes)63 presets := []difficulty.Elo{300, 700, 1100, 1600, 2100, 2500, 2900}64 for i, mode := range modes {65 if i >= len(defs) || i >= len(presets) {66 break67 }68 if _, ok := mode.(game.EloSpawner); !ok {69 continue70 }71 elo := presets[i]72 defs[i].PresetElo = &elo73 }74 return defs75}7677var Definition = puzzle.NewDefinition(puzzle.DefinitionSpec{78 Name: "Takuzu",79 Description: "Fill the grid with ● and ○. No 3 in a row.",80 Aliases: []string{"binairo", "binary"},81 Modes: ModeDefinitions,82 DailyModeIDs: puzzle.SelectModeIDsByIndex(ModeDefinitions, 2, 3),83})8485var Entry = gameentry.NewEntry(gameentry.EntrySpec{86 Definition: Definition,87 Help: HelpContent,88 Import: game.AdaptImport(ImportModel),89 Modes: Modes,90 Print: PDFPrintAdapter,91})