-
Notifications
You must be signed in to change notification settings - Fork 0
/
deck.py
79 lines (62 loc) · 2.24 KB
/
deck.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
"""
Definition of the deck class.
"""
def hash2deck(d_hash):
"""
Separates numbers and letter in the hash and creates
:param d_hash: the hash of a deck
:return: two lists, a list of numbers and a list of faces
"""
faces = {'A', 'B', 'C', 'D'}
hash_new = ''
for i, s in enumerate(d_hash):
if i > 0 and (d_hash[i - 1] in faces) ^ (s in faces):
hash_new += ' '
hash_new += s
# hash_new = [w for i, s in enumerate(d_hash) if (i > 0 and (d_hash[i - 1] in faces) ^ (s in faces)) else w += s]
# split the string by the separator ' '
hash_list = hash_new.split(' ')
return [[int(hash_list[i]), hash_list[i+1]] for i in range(0, len(hash_list) - 1, 2)]
class Deck:
def __init__(self, parameter=None):
if isinstance(parameter, str):
self.cards = hash2deck(parameter)
if isinstance(parameter, list):
self.cards = parameter
# self.origin = Deck() # The origin can be assigned without initialisation.
self.actions = []
self.prev = None
def __eq__(self, other):
# use 'is' to compare for identity of two deck objects
if not isinstance(other, Deck):
# don't attempt to compare against unrelated types
return NotImplemented
return self.cards == other.cards
def __hash__(self):
# necessary for instances to behave sanely in dicts and sets.
return hash(self.hash_str)
def __len__(self):
return len(self.cards)
@property
def top_number(self):
return self.cards[0][0]
@property
def top_face(self):
return self.cards[0][1]
@property
def hash_str(self):
"""
The method is a property. Use assignment
new = Deck(other.hash_str)
to get the hash_str for a new deck
new.hash_str
:return: int hash
"""
return ''.join([str(card[0]) + card[1] for card in self.cards])
def add_action(self, action):
self.actions += [element for element in action]
def game(self):
if self.prev:
return [self.prev] + self.prev.game()
else:
return []