aboutsummaryrefslogtreecommitdiff
path: root/logic/score.go
blob: 65eac12060b6bf96f433290e2a7d0244949c76e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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")
}