This repository has been archived by the owner on Nov 9, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquince.py
104 lines (82 loc) · 2.54 KB
/
quince.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
"""
quince.py
"""
from itertools import combinations
from textwrap import dedent
class Player:
"""
Representa un jugador.
"""
def __init__(self, name):
self.name = name
self.numbers = []
@property
def fifteen(self):
fifteen = (c for c in combinations(self.numbers, 3) if sum(c) == 15)
return next(fifteen, None)
def __repr__(self):
numbers = (str(number) for number in self.numbers)
numbers = ', '.join(numbers) if self.numbers else '(vacío)'
return f'{self.name:8.8} --> {numbers}'
class Game:
"""
Representa un juego de Quince.
"""
def __init__(self, p1, p2):
self.round = 1
self.p1 = Player(p1 or 'Mario')
self.p2 = Player(p2 or 'Luigi')
@property
def current(self):
return self.p1 if self.round % 2 else self.p2
@property
def available(self):
return [
number
for number in range(1, 10)
if number not in self.p1.numbers + self.p2.numbers
]
@property
def winner(self):
return next((p for p in (self.p1, self.p2) if p.fifteen), None)
def get_number(self):
number = None
while not number:
try:
number = int(input('¿Número? '))
except ValueError:
print('Error: esto no es un número válido.')
print('Por favor, intenta de nuevo.')
continue
if number not in self.available:
print(f'Error: {number} no está disponible.')
print('Por favor, intenta de nuevo.')
number = None
return number
def start(self):
def print_header(title):
print(dedent(f"""
{title}
{"=" * len(title)}
El turno es de {self.current.name}.
Los números disponibles son {self.available}."""))
def print_footer():
print(dedent(f"""
{self.p1}
{self.p2}
"""))
while self.available and not self.winner:
print_header(f'Ronda #{self.round}')
number = self.get_number()
self.current.numbers.append(number)
print_footer()
self.round += 1
print(
f'Hay un ganador: {self.winner.name} --> {self.winner.fifteen}'
if self.winner else 'No hay ganador.'
)
if __name__ == '__main__':
Game(
input('Escribe el nombre de P1: '),
input('Escribe el nombre de P2: '),
).start()