-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkniffel.py
133 lines (93 loc) · 2.99 KB
/
kniffel.py
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import numpy as np
class task(object):
"""Baseclass for individual tasks."""
def __init__(self, name):
self._fulfilled = False
self._name = name
self._points = 0
def name(self):
return self._name
def points(self, dice):
pass
def do(self, dice):
if self._fulfilled:
return -1
else:
self._fulfilled = True
self._points = self.points(dice)
return self._points
class Numbers(task):
def __init__(self, n):
super(Numbers, self).__init__("numbers_%i" % n)
self.n = n
def points(self, dice):
return self.n * np.sum(np.array(dice) == self.n)
class XOfAKind(task):
def __init__(self, n):
self._required = n
if n == 3:
super(XOfAKind, self).__init__("ThreeOfAKind")
elif n == 4:
super(XOfAKind, self).__init__("FourOfAKind")
else:
raise ValueError("Only three or four of a kind exist.")
def points(self, dice):
dice = np.array(dice)
for number in range(1, 7, 1):
if np.sum(dice == number) >= self._required:
return np.sum(dice)
return 0
class FullHouse(task):
def __init__(self):
super(FullHouse, self).__init__("FullHouse")
def points(self, dice):
if len(np.unique(dice)) == 2:
c = np.sum(np.array(dice) == dice[0])
if (c >= 2) and (c <= 3):
return 25
return 0
class SmallStreet(task):
def __init__(self):
super(SmallStreet, self).__init__("SmallStreet")
def points(self, dice):
dices = np.unique(np.sort(dice))
if np.sum(dices[:-1] + 1 == dices[1:]) >= 3:
return 30
return 0
class BigStreet(task):
def __init__(self):
super(BigStreet, self).__init__("BigStreet")
def points(self, dice):
dices = np.unique(np.sort(dice))
if np.sum(dices[:-1] + 1 == dices[1:]) >= 4:
return 40
return 0
class Kniffel(task):
def __init__(self):
super(Kniffel, self).__init__("Kniffel")
def points(self, dice):
if len(np.unique(dice)) == 1:
return 50
return 0
class Chance(task):
def __init__(self):
super(Chance, self).__init__("Chance")
def points(self, dice):
return np.sum(dice)
class Tasks:
def __init__(self):
self.score = 0
self.tasks = [Numbers(i) for i in np.arange(1, 7, 1)]
self.tasks += SmallStreet()
self.tasks += BigStreet()
self.tasks += FullHouse()
self.tasks += XOfAKind(3)
self.tasks += XOfAKind(4)
self.tasks += Kniffel()
self.tasks += Chance()
def get_score(self):
return np.sum([_task._points for _task in self.tasks])
def get_fulfilled(self):
return np.array([_task._fulfilled for _task in self.tasks])
def get_numbers_score(self):
return np.sum([_task._points for _task in self.tasks[:6]])