clone

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

chore/regenerate-vhs-gifs
puzzletea / takuzuplus / gamemode.go
gamemode.go 2.5K
1package takuzuplus23import (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 TakuzuPlusMode struct {16 game.BaseMode17 Size int18 Prefilled float6419 profile relationProfile20}2122var (23 _ game.Mode = TakuzuPlusMode{}24 _ game.Spawner = TakuzuPlusMode{}25 _ game.SeededSpawner = TakuzuPlusMode{}26)2728func NewMode(title, desc string, size int, prefilled float64, profile relationProfile) TakuzuPlusMode {29 return TakuzuPlusMode{30 BaseMode: game.NewBaseMode(title, desc),31 Size: size,32 Prefilled: prefilled,33 profile: profile,34 }35}3637func (t TakuzuPlusMode) Spawn() (game.Gamer, error) {38 complete := generateComplete(t.Size)39 puzzle, provided, rels := generatePuzzle(complete, t.Size, t.Prefilled, t.profile)40 return New(t, puzzle, provided, rels)41}4243func (t TakuzuPlusMode) SpawnSeeded(rng *rand.Rand) (game.Gamer, error) {44 complete := generateCompleteSeeded(t.Size, rng)45 puzzle, provided, rels := generatePuzzleSeeded(complete, t.Size, t.Prefilled, t.profile, rng)46 return New(t, puzzle, provided, rels)47}4849var modeProfiles = relationProfiles()5051var Modes = []game.Mode{52 NewMode("Beginner", "6×6 grid, relation clues ease early logic.", 6, 0.50, modeProfiles[0]),53 NewMode("Easy", "6×6 grid with additive = and x clues.", 6, 0.40, modeProfiles[1]),54 NewMode("Medium", "8×8 grid, mixed Takuzu and relation deductions.", 8, 0.40, modeProfiles[2]),55 NewMode("Tricky", "10×10 grid, uniqueness and relation clues interact.", 10, 0.38, modeProfiles[3]),56 NewMode("Hard", "10×10 grid, longer deduction chains with relation clues.", 10, 0.32, modeProfiles[4]),57 NewMode("Very Hard", "12×12 grid, sparse givens plus relation clues.", 12, 0.30, modeProfiles[5]),58 NewMode("Extreme", "14×14 grid, maximum size with additive relation clues.", 14, 0.28, modeProfiles[6]),59}6061var ModeDefinitions = gameentry.BuildModeDefs(Modes)6263var Definition = puzzle.NewDefinition(puzzle.DefinitionSpec{64 Name: "Takuzu+",65 Description: "Fill the grid with ● and ○ using some relational clues. No 3 in a row.",66 Aliases: []string{"takuzu plus", "binario+", "binario plus"},67 Modes: ModeDefinitions,68 DailyModeIDs: puzzle.SelectModeIDsByIndex(ModeDefinitions, 2, 3),69})7071var Entry = gameentry.NewEntry(gameentry.EntrySpec{72 Definition: Definition,73 Help: HelpContent,74 Import: game.AdaptImport(ImportModel),75 Modes: Modes,76 Print: PDFPrintAdapter,77})