aboutsummaryrefslogtreecommitdiff
path: root/logic/score.go
diff options
context:
space:
mode:
Diffstat (limited to 'logic/score.go')
-rw-r--r--logic/score.go107
1 files changed, 107 insertions, 0 deletions
diff --git a/logic/score.go b/logic/score.go
new file mode 100644
index 0000000..65eac12
--- /dev/null
+++ b/logic/score.go
@@ -0,0 +1,107 @@
+package logic
+
+import (
+ "errors"
+ "fmt"
+)
+
+type Score struct {
+ values [13]int
+ names [13]string
+}
+
+func NewScore() Score {
+ return Score{values: [13]int{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+ names: [13]string{"Aces", "Twos", "Threes", "Fours", "Fives", "Sixes",
+ "ThreeOfAKind", "FourOfAKind", "FullHouse", "SmallStraight",
+ "LargeStraight", "Yahtzee", "Chance"}}
+}
+
+func (s Score) bonus() int {
+ sum := s.values[0] + s.values[1] + s.values[2]
+ sum += s.values[3] + s.values[4] + s.values[5]
+
+ if sum >= 63 {
+ return 35
+ }
+ return 0
+}
+
+func (s Score) Score() (res int) {
+ for _, v := range s.values {
+ if v > 0 {
+ res += v
+ }
+ }
+ res += s.bonus()
+ return
+}
+
+func (s Score) String() string {
+ str := "Score:\n"
+ for i, v := range s.values {
+ p := ""
+ if v < 0 {
+ p = ""
+ } else {
+ p = fmt.Sprintf("%d", v)
+ }
+ str += fmt.Sprintf("%s: %s\n", s.names[i], p)
+ if i == 5 {
+ str += fmt.Sprintf("Bonus: %d\n\n", s.bonus())
+ }
+ }
+ return str
+}
+
+func (s *Score) Insert(d Dices, pos int) (int, error) {
+ if pos < 0 || pos > 12 {
+ return 0, errors.New("Index out of range")
+ }
+ if s.values[pos] == -1 {
+ switch pos {
+ case 6:
+ if d.IsThreeOfAKind() {
+ s.values[pos] = d.Sum(0)
+ return s.values[pos], nil
+ }
+ return 0, errors.New("Not three of a kind")
+ case 7:
+ if d.IsFourOfAKind() {
+ s.values[pos] = d.Sum(0)
+ return s.values[pos], nil
+ }
+ return 0, errors.New("Not four of a kind")
+ case 8:
+ if d.IsFullHouse() {
+ s.values[pos] = 25
+ return 25, nil
+ }
+ return 0, errors.New("Not a full house")
+ case 9:
+ if d.IsSmallStraight() {
+ s.values[pos] = 30
+ return 30, nil
+ }
+ return 0, errors.New("Not a small straight")
+ case 10:
+ if d.IsLargeStraight() {
+ s.values[pos] = 40
+ return 40, nil
+ }
+ return 0, errors.New("Not a large straight")
+ case 11:
+ if d.IsYahtzee() {
+ s.values[pos] = 50
+ return 50, nil
+ }
+ return 0, errors.New("Not a yahtzee")
+ case 12:
+ s.values[pos] = d.Sum(0)
+ return s.values[pos], nil
+ }
+ s.values[pos] = d.Sum(pos + 1)
+ return s.values[pos], nil
+ }
+ return 0, errors.New("Already recorded")
+}