Skip to content

Commit fbc3647

Browse files
committed
#33 - Python
1 parent 4330ba0 commit fbc3647

File tree

1 file changed

+173
-0
lines changed

1 file changed

+173
-0
lines changed
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
"""
2+
Crea un programa capaz de gestionar una pieza de Tetris.
3+
- La pantalla de juego tiene 10 filas y 10 columnas representadas por símbolos 🔲
4+
- La pieza de tetris a manejar será la siguiente (si quieres, puedes elegir otra):
5+
🔳
6+
🔳🔳🔳
7+
- La pieza aparecerá por primera vez en la parte superior izquierda de la pantalla de juego.
8+
🔳🔲🔲🔲🔲🔲🔲🔲🔲🔲
9+
🔳🔳🔳🔲🔲🔲🔲🔲🔲🔲
10+
🔲🔲🔲🔲🔲🔲🔲🔲🔲🔲
11+
🔲🔲🔲🔲🔲🔲🔲🔲🔲🔲
12+
🔲🔲🔲🔲🔲🔲🔲🔲🔲🔲
13+
🔲🔲🔲🔲🔲🔲🔲🔲🔲🔲
14+
🔲🔲🔲🔲🔲🔲🔲🔲🔲🔲
15+
🔲🔲🔲🔲🔲🔲🔲🔲🔲🔲
16+
🔲🔲🔲🔲🔲🔲🔲🔲🔲🔲
17+
🔲🔲🔲🔲🔲🔲🔲🔲🔲🔲
18+
- Debes desarrollar una función capaz de desplazar y rotar la pieza en el tablero,
19+
recibiendo una acción cada vez que se llame, mostrando cómo se visualiza en
20+
la pantalla de juego.
21+
- Las acciones que se pueden aplicar a la pieza son: derecha, izquierda, abajo, rotar.
22+
- Debes tener en cuenta los límites de la pantalla de juego.
23+
"""
24+
25+
from pynput import keyboard
26+
import os
27+
28+
class Tetris:
29+
"""
30+
Clase que representa un juego de Tetris.
31+
"""
32+
def __init__(self) -> None:
33+
"""
34+
Inicializa el juego de Tetris con el tablero y la pieza.
35+
36+
returns:
37+
None
38+
"""
39+
self.board_size = 10
40+
self.empty = "🔲"
41+
self.full = "🔳"
42+
43+
self.piece = [
44+
[self.full, self.empty, self.empty],
45+
[self.full, self.full, self.full]
46+
]
47+
48+
self.piece_h = len(self.piece)
49+
self.piece_w = len(self.piece[0])
50+
51+
self.row = 0
52+
self.col = 0
53+
54+
def render(self) -> None:
55+
"""
56+
Imprime el tablero completo con la pieza en su posición actual.
57+
58+
returns:
59+
None
60+
"""
61+
board = [[self.empty for _ in range(self.board_size)] for _ in range(self.board_size)]
62+
63+
for r_piece, row_data in enumerate(self.piece):
64+
for c_piece, cell in enumerate(row_data):
65+
if cell == self.full:
66+
board[self.row + r_piece][self.col + c_piece] = self.full
67+
68+
for r in range(self.board_size):
69+
print("".join(board[r]))
70+
print()
71+
72+
def clear_console(self) -> None:
73+
"""
74+
Limpia la consola para una mejor visualización.
75+
76+
returns:
77+
None
78+
"""
79+
os.system('cls' if os.name == 'nt' else 'clear')
80+
81+
def rotate(self) -> None:
82+
"""
83+
Rota la pieza 90° en sentido horario, respetando límites.
84+
85+
returns:
86+
None
87+
"""
88+
rotated = [list(row) for row in zip(*self.piece[::-1])]
89+
new_h = len(rotated)
90+
new_w = len(rotated[0])
91+
92+
if self.col + new_w > self.board_size:
93+
self.col = self.board_size - new_w
94+
if self.row + new_h > self.board_size:
95+
self.row = self.board_size - new_h
96+
97+
self.piece = rotated
98+
self.piece_h = new_h
99+
self.piece_w = new_w
100+
101+
def move_left(self) -> None:
102+
"""
103+
Mueve la pieza hacia la izquierda si no supera los límites.
104+
105+
returns:
106+
None
107+
"""
108+
if self.col > 0:
109+
self.col -= 1
110+
111+
def move_right(self) -> None:
112+
"""
113+
Mueve la pieza hacia la derecha si no supera los límites.
114+
115+
returns:
116+
None
117+
"""
118+
if self.col + self.piece_w < self.board_size:
119+
self.col += 1
120+
121+
def move_down(self) -> None:
122+
"""
123+
Mueve la pieza hacia abajo si no supera los límites.
124+
125+
returns:
126+
None
127+
"""
128+
if self.row + self.piece_h < self.board_size:
129+
self.row += 1
130+
131+
def action(self, key: keyboard.Key) -> None:
132+
"""
133+
Maneja la acción correspondiente según la tecla presionada.
134+
135+
args:
136+
key (keyboard.Key): Tecla presionada.
137+
138+
returns:
139+
None
140+
"""
141+
actions = {
142+
keyboard.Key.left: self.move_left,
143+
keyboard.Key.right: self.move_right,
144+
keyboard.Key.down: self.move_down,
145+
keyboard.Key.up: self.rotate
146+
}
147+
148+
action_to_run = actions.get(key)
149+
if action_to_run:
150+
action_to_run()
151+
self.clear_console()
152+
self.render()
153+
154+
155+
if __name__ == "__main__":
156+
print("Controla la pieza con flechas. Presiona ESC para salir.\n")
157+
158+
game = Tetris()
159+
game.render()
160+
161+
def on_press(key: keyboard.Key) -> None:
162+
"""
163+
Maneja la pulsación de teclas.
164+
- Flechas para mover/rotar la pieza.
165+
- ESC para salir.
166+
"""
167+
if key == keyboard.Key.esc:
168+
return False
169+
game.action(key)
170+
171+
with keyboard.Listener(on_press=on_press) as listener:
172+
listener.join()
173+
print()

0 commit comments

Comments
 (0)