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 / takuzuplus / gamemode.go
gamemode.go 3.0K
1package takuzuplus23import (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 TakuzuPlusMode struct {17 game.BaseMode18 Size int19 Prefilled float6420 profile relationProfile21}2223var (24 _ game.Mode = TakuzuPlusMode{}25 _ game.Spawner = TakuzuPlusMode{}26 _ game.SeededSpawner = TakuzuPlusMode{}27 _ game.EloSpawner = TakuzuPlusMode{}28)2930func NewMode(title, desc string, size int, prefilled float64, profile relationProfile) TakuzuPlusMode {31 return TakuzuPlusMode{32 BaseMode: game.NewBaseMode(title, desc),33 Size: size,34 Prefilled: prefilled,35 profile: profile,36 }37}3839func (t TakuzuPlusMode) Spawn() (game.Gamer, error) {40 complete := generateComplete(t.Size)41 puzzle, provided, rels := generatePuzzle(complete, t.Size, t.Prefilled, t.profile)42 return New(t, puzzle, provided, rels)43}4445func (t TakuzuPlusMode) SpawnSeeded(rng *rand.Rand) (game.Gamer, error) {46 complete := generateCompleteSeeded(t.Size, rng)47 puzzle, provided, rels := generatePuzzleSeeded(complete, t.Size, t.Prefilled, t.profile, rng)48 return New(t, puzzle, provided, rels)49}5051var modeProfiles = relationProfiles()5253var Modes = []game.Mode{54 NewMode("Beginner", "6×6 grid, relation clues ease early logic.", 6, 0.50, modeProfiles[0]),55 NewMode("Easy", "6×6 grid with additive = and x clues.", 6, 0.40, modeProfiles[1]),56 NewMode("Medium", "8×8 grid, mixed Takuzu and relation deductions.", 8, 0.40, modeProfiles[2]),57 NewMode("Tricky", "10×10 grid, uniqueness and relation clues interact.", 10, 0.38, modeProfiles[3]),58 NewMode("Hard", "10×10 grid, longer deduction chains with relation clues.", 10, 0.32, modeProfiles[4]),59 NewMode("Very Hard", "12×12 grid, sparse givens plus relation clues.", 12, 0.30, modeProfiles[5]),60 NewMode("Extreme", "14×14 grid, maximum size with additive relation clues.", 14, 0.28, modeProfiles[6]),61}6263var ModeDefinitions = takuzuPlusModeDefinitions(Modes)6465func takuzuPlusModeDefinitions(modes []game.Mode) []puzzle.ModeDef {66 defs := gameentry.BuildModeDefs(modes)67 presets := []difficulty.Elo{300, 700, 1100, 1600, 2100, 2500, 2900}68 for i, mode := range modes {69 if i >= len(defs) || i >= len(presets) {70 break71 }72 if _, ok := mode.(game.EloSpawner); !ok {73 continue74 }75 elo := presets[i]76 defs[i].PresetElo = &elo77 }78 return defs79}8081var Definition = puzzle.NewDefinition(puzzle.DefinitionSpec{82 Name: "Takuzu+",83 Description: "Fill the grid with ● and ○ using some relational clues. No 3 in a row.",84 Aliases: []string{"takuzu plus", "binario+", "binario plus"},85 Modes: ModeDefinitions,86 DailyModeIDs: puzzle.SelectModeIDsByIndex(ModeDefinitions, 2, 3),87})8889var Entry = gameentry.NewEntry(gameentry.EntrySpec{90 Definition: Definition,91 Help: HelpContent,92 Import: game.AdaptImport(ImportModel),93 Modes: Modes,94 Print: PDFPrintAdapter,95})