// Package valueobjects provides domain value objects for the KnowFoolery application. package valueobjects // Scoring constants const ( // MaxScorePerQuestion is the maximum score for a correct answer without hint. MaxScorePerQuestion = 2 // ScoreWithHint is the score for a correct answer with hint. ScoreWithHint = 1 // ScoreIncorrect is the score for an incorrect answer. ScoreIncorrect = 0 // MaxAttempts is the maximum number of attempts per question. MaxAttempts = 3 ) // Score represents a game score value. type Score struct { value int } // NewScore creates a new Score with validation. func NewScore(value int) Score { if value < 0 { value = 0 } return Score{value: value} } // Zero returns a zero score. func Zero() Score { return Score{value: 0} } // Value returns the score value. func (s Score) Value() int { return s.value } // Add adds points to the score and returns a new Score. func (s Score) Add(points int) Score { newValue := s.value + points if newValue < 0 { newValue = 0 } return Score{value: newValue} } // CalculateQuestionScore calculates the score for a question based on correctness and hint usage. func CalculateQuestionScore(isCorrect bool, usedHint bool) int { if !isCorrect { return ScoreIncorrect } if usedHint { return ScoreWithHint } return MaxScorePerQuestion } // Attempt represents an attempt at answering a question. type Attempt struct { Number int Answer string Correct bool UsedHint bool Score int } // NewAttempt creates a new Attempt. func NewAttempt(number int, answer string, correct bool, usedHint bool) Attempt { return Attempt{ Number: number, Answer: answer, Correct: correct, UsedHint: usedHint, Score: CalculateQuestionScore(correct, usedHint), } } // CanRetry checks if another attempt is allowed. func CanRetry(attemptNumber int) bool { return attemptNumber < MaxAttempts } // RemainingAttempts returns the number of remaining attempts. func RemainingAttempts(attemptNumber int) int { remaining := MaxAttempts - attemptNumber if remaining < 0 { return 0 } return remaining }