57 lines
1.2 KiB
Go
57 lines
1.2 KiB
Go
package sudoku
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"git.kleiax.de/homepage/field"
|
|
"git.kleiax.de/homepage/logic"
|
|
"git.kleiax.de/homepage/parser"
|
|
)
|
|
|
|
type Game struct {
|
|
field *field.Field
|
|
solver logic.Solver
|
|
}
|
|
|
|
func New(input parser.Parser, solver logic.Solver, data []byte, fieldIndex int) (*Game, error) {
|
|
if input == nil {
|
|
return nil, errors.New("cannot create game: nil parser")
|
|
}
|
|
if err := input.Parse(data); err != nil {
|
|
return nil, fmt.Errorf("cannot create game: %w", err)
|
|
}
|
|
parsedField, err := input.GetField(fieldIndex)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cannot create game: %w", err)
|
|
}
|
|
if parsedField == nil || !parsedField.IsValid() {
|
|
return nil, fmt.Errorf("cannot create game: %w", field.ErrInvalidField)
|
|
}
|
|
return &Game{solver: solver, field: parsedField}, nil
|
|
}
|
|
|
|
func (g *Game) Solve() error {
|
|
if g == nil || g.field == nil {
|
|
return field.ErrInvalidField
|
|
}
|
|
if err := g.solver.InitStrategies(g.field); err != nil {
|
|
return err
|
|
}
|
|
solved, err := g.solver.Run(0)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !solved {
|
|
return logic.ErrNoProgress
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (g *Game) GetField() *field.Field {
|
|
if g == nil {
|
|
return nil
|
|
}
|
|
return g.field
|
|
}
|