1package takuzu23import (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 TakuzuMode struct {16 game.BaseMode17 Size int18 Prefilled float6419}2021var (22 _ game.Mode = TakuzuMode{}23 _ game.Spawner = TakuzuMode{}24 _ game.SeededSpawner = TakuzuMode{}25)2627func NewMode(title, desc string, size int, prefilled float64) TakuzuMode {28 return TakuzuMode{29 BaseMode: game.NewBaseMode(title, desc),30 Size: size,31 Prefilled: prefilled,32 }33}3435func (t TakuzuMode) Spawn() (game.Gamer, error) {36 complete := generateComplete(t.Size)37 puzzle, provided := generatePuzzle(complete, t.Size, t.Prefilled)38 return New(t, puzzle, provided)39}4041func (t TakuzuMode) SpawnSeeded(rng *rand.Rand) (game.Gamer, error) {42 complete := generateCompleteSeeded(t.Size, rng)43 puzzle, provided := generatePuzzleSeeded(complete, t.Size, t.Prefilled, rng)44 return New(t, puzzle, provided)45}4647var Modes = []game.Mode{48 NewMode("Beginner", "6×6 grid, ~50% clues. Doubles and sandwich patterns.", 6, 0.50),49 NewMode("Easy", "6×6 grid, ~40% clues. Counting required.", 6, 0.40),50 NewMode("Medium", "8×8 grid, ~40% clues. Larger grid, moderate deduction.", 8, 0.40),51 NewMode("Tricky", "10×10 grid, ~38% clues. Uniqueness rule needed.", 10, 0.38),52 NewMode("Hard", "10×10 grid, ~32% clues. Long deduction chains.", 10, 0.32),53 NewMode("Very Hard", "12×12 grid, ~30% clues. Deep logic required.", 12, 0.30),54 NewMode("Extreme", "14×14 grid, ~28% clues. Maximum challenge.", 14, 0.28),55}5657var ModeDefinitions = gameentry.BuildModeDefs(Modes)5859var Definition = puzzle.NewDefinition(puzzle.DefinitionSpec{60 Name: "Takuzu",61 Description: "Fill the grid with ● and ○. No 3 in a row.",62 Aliases: []string{"binairo", "binary"},63 Modes: ModeDefinitions,64 DailyModeIDs: puzzle.SelectModeIDsByIndex(ModeDefinitions, 2, 3),65})6667var Entry = gameentry.NewEntry(gameentry.EntrySpec{68 Definition: Definition,69 Help: HelpContent,70 Import: game.AdaptImport(ImportModel),71 Modes: Modes,72 Print: PDFPrintAdapter,73})