clone

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

feat/app-decomposition
puzzletea / games / shikaku / gamemode.go
gamemode.go 2.0K
1package shikaku23import (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 ShikakuMode struct {16 game.BaseMode17 Width int18 Height int19 MaxRectSize int20}2122var (23 _ game.Mode = ShikakuMode{}24 _ game.Spawner = ShikakuMode{}25 _ game.SeededSpawner = ShikakuMode{}26)2728func NewMode(title, description string, width, height, maxRectSize int) ShikakuMode {29 return ShikakuMode{30 BaseMode: game.NewBaseMode(title, description),31 Width: width,32 Height: height,33 MaxRectSize: maxRectSize,34 }35}3637func (s ShikakuMode) Spawn() (game.Gamer, error) {38 puzzle, err := GeneratePuzzle(s.Width, s.Height, s.MaxRectSize)39 if err != nil {40 return nil, err41 }42 return New(s, puzzle), nil43}4445func (s ShikakuMode) SpawnSeeded(rng *rand.Rand) (game.Gamer, error) {46 puzzle, err := GeneratePuzzleSeeded(s.Width, s.Height, s.MaxRectSize, rng)47 if err != nil {48 return nil, err49 }50 return New(s, puzzle), nil51}5253var Modes = []game.Mode{54 NewMode("Mini 5x5", "5x5 grid, gentle introduction.", 5, 5, 5),55 NewMode("Easy 7x7", "7x7 grid, straightforward puzzles.", 7, 7, 8),56 NewMode("Medium 8x8", "8x8 grid, moderate challenge.", 8, 8, 12),57 NewMode("Hard 10x10", "10x10 grid, requires careful planning.", 10, 10, 15),58 NewMode("Expert 12x12", "12x12 grid, maximum challenge.", 12, 12, 20),59}6061var ModeDefinitions = gameentry.BuildModeDefs(Modes)6263var Definition = puzzle.NewDefinition(puzzle.DefinitionSpec{64 Name: "Shikaku",65 Description: "Divide the grid into rectangles with set sizes.",66 Aliases: []string{"rectangles"},67 Modes: ModeDefinitions,68 DailyModeIDs: puzzle.SelectModeIDsByIndex(ModeDefinitions, 1, 2),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})