This repository has been archived by the owner on Mar 24, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreto.py
289 lines (231 loc) · 10.4 KB
/
reto.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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
#!/usr/bin/python3
import random
import os
def create_board(length):
'''CREA DOS MATRICES, UNA CON EL TABLERO CUADRADO DE LA LONGITUD DE LADO INTRODUCIDO, Y OTRA MATRIZ QUE REFLEJA
SI LAS CARTAS ESTAN REVELADAS, OCULTAS, O ELIMINADAS, ESTABLECIENDOLAS COMO OCULTAS POR DEFECTO'''
card_pairs = int((length**2) / 2)
number_list = [x for x in range(1, (card_pairs + 1))] * 2
random.shuffle(number_list)
board = [] # Donde van a ir guardados los números de las cartas
board_status = [] # Donde van a ir guardados el estado actual de cada carta
# None == Eliminada
# True == Revelada
# False == Oculta
# Indice para avanzar en la lista numérica aleatoria
index = 0
for i in range(length):
board.append([])
board_status.append([])
for j in range(length):
board[i].append(number_list[index])
board_status[i].append(False) # Por defecto las cartas están ocultas
index += 1
return board, board_status, card_pairs
def print_board(board_cards, board_status):
'''MUESTRA EL TABLERO EN LA PANTALLA'''
os.system('cls')
side_length = len(board_cards)
# Estas dos variables se usan para ajustar y alinear el tablero
max_card_len = len(str(int((side_length**2) / 2)))
max_row_number_len = len(str(side_length - 1))
# Imprime la primera fila
print('{} '.format(' ' * max_row_number_len), end='')
for i in range(0, side_length):
print('{}{} '.format(i, ' ' * (max_card_len - len(str(i)))), end='')
print()
# Imprime cada fila
for i in range(side_length):
print('\n{}{}'.format(i, ' ' * (max_row_number_len - len(str(i)))),
end='')
for j in range(side_length):
card_number_len = len(str(board_cards[i][j]))
# Si la carta ya fue eliminada
if board_status[i][j] is None:
print(' {}'.format(' ' * max_card_len), end='')
# Si la carta esta revelada
elif board_status[i][j]:
print((' ' + ' ' * (max_card_len - card_number_len)) +
str(board_cards[i][j]),
end='')
# Si la carta esta oculta
else:
print(' ' + '-' * max_card_len, end='')
# Nueva línea
print()
def is_int(string):
''''DETERMINA SI UN VALOR DADO PUEDE SER CONVERTIDO A ENTERO O NO'''
try:
int(string)
except ValueError:
return False
else:
return True
def ask_for_coordinates(board, board_status, player_text):
'''PIDE LOS VALORES DE COORDENADAS AL USUARIO'''
previous_guess_invalid = False
number_of_guesses = 0
coords_list = []
board_length = len(board)
# Continua hasta que haya dos valores válidos para las coordenadas
while number_of_guesses < 2:
print_board(board, board_status)
if previous_guess_invalid:
print('\nVALOR INVALIDO, revisa los valores e intenta nuevamente')
print('\nTURNO {}'.format(player_text))
card_coords = input(
'Introduce las coordenadas (x, y) de la carta a revelar: ')
print()
coords = card_coords.split(',')
# Comprobar si las coordenadas introducidas no son validas
# Si las coordenadas validas no estan en el formato correcto
if len(coords) != 2 or (not is_int(coords[0]) or not is_int(coords[1])) or \
(int(coords[0]) >= board_length or int(coords[1]) >= board_length):
previous_guess_invalid = True
# Si estan en el formato correcto
else:
# En una matriz en Python los valores se referencian primero en el eje y y despues en el x
coords = [int(x) for x in coords]
coords.reverse()
card_status = board_status[coords[0]][coords[1]]
# Si son las mismas coordenadas que acaban de ser introducidas o si la carta está eliminada
if card_status == True or card_status is None:
previous_guess_invalid = True
else:
previous_guess_invalid = False
coords_list.append(coords)
board_status[coords[0]][coords[1]] = True
number_of_guesses += 1
return coords_list
def main():
''''FUNCION PRINCIPAL QUE SE CORRE POR DEFECTO EN EL PROGRAMA'''
os.system('cls')
# Obtiene el valor para la longitud del tablero
while True:
board_length = input(
'Escoge un numero par para el tamaño del tablero (deja en blanco para el valor por defecto): '
)
if board_length.strip() == '':
board_length = 6 # Valor por defecto
break
elif not is_int(board_length) or (int(board_length) % 2) != 0:
print('VALOR INVALIDO, elige un numero par valido')
else:
board_length = int(board_length)
break
# Obtiene el valor para el numero de rounds a jugar
while True:
number_of_rounds = input(
'Elige un numero de rounds a jugar (deja en blanco para el valor por defecto): '
)
if number_of_rounds.strip() == '':
number_of_rounds = 1 # Valor por defecto
break
elif not is_int(number_of_rounds):
print('VALOR INVALIDO, elige un numero valido')
else:
number_of_rounds = int(number_of_rounds)
break
# Obtiene los valores de los nombres de los jugadores para mensajes personalizados
player_strings = {'1': {}, '2': {}}
for k in player_strings:
player = input(
'Introduce el nombre del jugador {}: '.format(k)).strip()
if player == '': # Valores por defecto
player_strings[k]['normal'] = 'el jugador {}'.format(k)
player_strings[k]['sentence_case'] = 'El jugador {}'.format(k)
player_strings[k]['upper_case'] = 'DEL JUGADOR {}'.format(k)
else:
player_strings[k]['normal'], player_strings[k][
'sentence_case'] = player, player
player_strings[k]['upper_case'] = 'DE {}'.format(player.upper())
# Obtiene si se decide borrar las cartas del tablero en lugar de solo mostrarlas una vez acertado un par
hard_mode_enabled = input('Activar modo dificil (s/N): ')
if hard_mode_enabled.lower() == 's':
hard_mode_enabled = True
# El jugador 1 empieza por defecto
player_turn = 1
won_rounds = {'1': 0, '2': 0}
'''Ciclo principal, que pertenece el número de rounds escogidos'''
for round in range(number_of_rounds):
if number_of_rounds > 1:
print()
print('-' * 2 * board_length)
print('ROUND #{}'.format(round + 1))
print('-' * 2 * board_length)
print()
found_pairs = 0
board, board_status, card_pairs = create_board(board_length)
score = {'1': 0, '2': 0}
'''Ciclo anidado #1, que pertenece a dejar que un jugador juegue su turno despues del otro hasta que se encuentren todos los pares'''
while True:
# Detecta si el texto dl jugador es el default, para imprimirlo en un formato correcto
card_coords_guesses = ask_for_coordinates(
board, board_status,
player_strings[str(player_turn)]['upper_case'])
card_value_guesses = []
for i, coords in enumerate(card_coords_guesses):
card_value_guesses.append(board[coords[0]][coords[1]])
print_board(board, board_status)
# Si la eleccion es correcta
if card_value_guesses[0] == card_value_guesses[1]:
# Si se han encontrado todos los pares, DETIENE el ciclo de turnos
if found_pairs == (card_pairs - 1):
break
else:
print(
'\nBien hecho, has encontrado un par. Vuelve a ser tu turno.'
)
if hard_mode_enabled:
new_card_status = None
else:
new_card_status = True
score[str(player_turn)] += 1
found_pairs += 1
# Si la eleccion es incorrecta
else:
print(
'\nLo siento, no has encontrado un par valido. Es el turno del siguiente jugador.'
)
if player_turn == 1:
player_turn = 2
else:
player_turn = 1
new_card_status = False
# Establece el estado de las cartas de regreso a ocultas, o a eliminadas
for i, coords in enumerate(card_coords_guesses):
board_status[coords[0]][coords[1]] = new_card_status
input('Presiona ENTER para continuar... ')
print()
# Si hay un empate, el jugador que empieza es al azar
if score['1'] == score['2']:
print('\n\nHa habido un empate de {} puntos.'.format(score['1'] +
1))
player_turn = random.randint(1, 2)
# En el siguiente round empieza el perdedor ;)
else:
if score['1'] > score['2']:
won_player = 1
player_turn = 2
else:
won_player = 2
player_turn = 1
os.system('cls')
print('{} ha ganado con {} puntos.'.format(
player_strings[str(won_player)]['sentence_case'],
score[str(won_player)] + 1))
won_rounds[str(won_player)] += 1
if number_of_rounds > 1 and round != (number_of_rounds - 1):
input(
'Presiona ENTER para continuar con el siguiente round, comenzando con {}...'
.format(player_strings[str(player_turn)]['normal']))
if number_of_rounds > 1:
print()
for i in player_strings:
print('{} ganó {} ronda(s)'.format(
player_strings[i]['sentence_case'], won_rounds['1']))
# Ciclo infinito que vuelve a comienza el juego hasta que se elija no continuar
while True:
main()
if input('\n\n¿Volver a jugar? (S/n): ').lower() == 'n':
break