aW1wb3J0IHJhbmRvbQppbXBvcnQgdGltZQoKIyBDb25maWd1cmFjaSZvYWN1dGU7biBpbmljaWFsCkFOQ0hPID0gMzAgICMgQW5jaG8gZGUgbGEgJnF1b3Q7cGFudGFsbGEmcXVvdDsKQUxUTyA9IDE1ICAgIyBBbHRvIGRlIGxhICZxdW90O3BhbnRhbGxhJnF1b3Q7CgojIFBvc2ljaW9uZXMgaW5pY2lhbGVzIGRlIGxhIHBhbGV0YSB5IGxhIGJvbGEKcGFsZXRhX3BvcyA9IEFOQ0hPIC8vIDIKYm9sYV94ID0gQU5DSE8gLy8gMgpib2xhX3kgPSBBTFRPIC8vIDIKYm9sYV9keCA9IHJhbmRvbS5jaG9pY2UoWy0xLCAxXSkKYm9sYV9keSA9IDEKCiMgVmFyaWFibGVzIGRlbCBqdWVnbwpyZWJvdGVzID0gMApwZXJkaWRvID0gRmFsc2UKCmRlZiBkaWJ1amFyX3RhYmxlcm8oKToKICAgICZxdW90OyZxdW90OyZxdW90O0RpYnVqYSBlbCB0YWJsZXJvIGVuIGNvbnNvbGEuJnF1b3Q7JnF1b3Q7JnF1b3Q7CiAgICBmb3IgeSBpbiByYW5nZShBTFRPKToKICAgICAgICBsaW5lYSA9ICZxdW90OyZxdW90OwogICAgICAgIGZvciB4IGluIHJhbmdlKEFOQ0hPKToKICAgICAgICAgICAgaWYgeSA9PSAwIG9yIHkgPT0gQUxUTyAtIDE6ICAjIEJvcmRlcyBzdXBlcmlvciBlIGluZmVyaW9yCiAgICAgICAgICAgICAgICBsaW5lYSArPSAmcXVvdDstJnF1b3Q7CiAgICAgICAgICAgIGVsaWYgeCA9PSAwIG9yIHggPT0gQU5DSE8gLSAxOiAgIyBCb3JkZXMgaXpxdWllcmRvIHkgZGVyZWNobwogICAgICAgICAgICAgICAgbGluZWEgKz0gJnF1b3Q7fCZxdW90OwogICAgICAgICAgICBlbGlmIHkgPT0gYm9sYV95IGFuZCB4ID09IGJvbGFfeDogICMgUG9zaWNpJm9hY3V0ZTtuIGRlIGxhIGJvbGEKICAgICAgICAgICAgICAgIGxpbmVhICs9ICZxdW90O08mcXVvdDsKICAgICAgICAgICAgZWxpZiB5ID09IEFMVE8gLSAyIGFuZCBwYWxldGFfcG9zIC0gMiAmbHQ7PSB4ICZsdDs9IHBhbGV0YV9wb3MgKyAyOiAgIyBQYWxldGEKICAgICAgICAgICAgICAgIGxpbmVhICs9ICZxdW90Oz0mcXVvdDsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxpbmVhICs9ICZxdW90OyAmcXVvdDsKICAgICAgICBwcmludChsaW5lYSkKCmRlZiBtb3Zlcl9wYWxldGEoZGlyZWNjaW9uKToKICAgICZxdW90OyZxdW90OyZxdW90O011ZXZlIGxhIHBhbGV0YSBhIGxhIGl6cXVpZXJkYSBvIGRlcmVjaGEuJnF1b3Q7JnF1b3Q7JnF1b3Q7CiAgICBnbG9iYWwgcGFsZXRhX3BvcwogICAgaWYgZGlyZWNjaW9uID09ICZxdW90O2EmcXVvdDsgYW5kIHBhbGV0YV9wb3MgJmd0OyAyOgogICAgICAgIHBhbGV0YV9wb3MgLT0gMQogICAgZWxpZiBkaXJlY2Npb24gPT0gJnF1b3Q7ZCZxdW90OyBhbmQgcGFsZXRhX3BvcyAmbHQ7IEFOQ0hPIC0gMzoKICAgICAgICBwYWxldGFfcG9zICs9IDEKCmRlZiBhY3R1YWxpemFyX2JvbGEoKToKICAgICZxdW90OyZxdW90OyZxdW90O0FjdHVhbGl6YSBsYSBwb3NpY2kmb2FjdXRlO24gZGUgbGEgYm9sYSB5IHZlcmlmaWNhIGNvbGlzaW9uZXMuJnF1b3Q7JnF1b3Q7JnF1b3Q7CiAgICBnbG9iYWwgYm9sYV94LCBib2xhX3ksIGJvbGFfZHgsIGJvbGFfZHksIHJlYm90ZXMsIHBlcmRpZG8KCiAgICAjIE1vdmVyIGxhIGJvbGEKICAgIGJvbGFfeCArPSBib2xhX2R4CiAgICBib2xhX3kgKz0gYm9sYV9keQoKICAgICMgVmVyaWZpY2FyIGNvbGlzaSZvYWN1dGU7biBjb24gbG9zIGJvcmRlcyBpenF1aWVyZG8geSBkZXJlY2hvCiAgICBpZiBib2xhX3ggJmx0Oz0gMSBvciBib2xhX3ggJmd0Oz0gQU5DSE8gLSAyOgogICAgICAgIGJvbGFfZHggKj0gLTEKCiAgICAjIFZlcmlmaWNhciBjb2xpc2kmb2FjdXRlO24gY29uIGVsIGJvcmRlIHN1cGVyaW9yCiAgICBpZiBib2xhX3kgJmx0Oz0gMToKICAgICAgICBib2xhX2R5ICo9IC0xCgogICAgIyBWZXJpZmljYXIgY29saXNpJm9hY3V0ZTtuIGNvbiBsYSBwYWxldGEKICAgIGlmIGJvbGFfeSA9PSBBTFRPIC0gMyBhbmQgcGFsZXRhX3BvcyAtIDIgJmx0Oz0gYm9sYV94ICZsdDs9IHBhbGV0YV9wb3MgKyAyOgogICAgICAgIGJvbGFfZHkgKj0gLTEKICAgICAgICByZWJvdGVzICs9IDEKCiAgICAjIFZlcmlmaWNhciBzaSBsYSBib2xhIHNlIHBpZXJkZQogICAgaWYgYm9sYV95ICZndDs9IEFMVE8gLSAxOgogICAgICAgIHBlcmRpZG8gPSBUcnVlCgojIEJ1Y2xlIHByaW5jaXBhbCBkZWwganVlZ28KcHJpbnQoJnF1b3Q7JmlleGNsO0JpZW52ZW5pZG8gYSBQb25nIGVuIGNvbnNvbGEhJnF1b3Q7KQpwcmludCgmcXVvdDtVc2EgJ2EnIHBhcmEgbW92ZXIgbGEgcGFsZXRhIGEgbGEgaXpxdWllcmRhIHkgJ2QnIHBhcmEgbW92ZXJsYSBhIGxhIGRlcmVjaGEuJnF1b3Q7KQpwcmludCgmcXVvdDtQcmVzaW9uYSBFbnRlciBwYXJhIGluaWNpYXIuJnF1b3Q7KQppbnB1dCgpCgp3aGlsZSBub3QgcGVyZGlkbzoKICAgICMgRGlidWphciBlbCB0YWJsZXJvCiAgICBwcmludCgmcXVvdDtcMDMzYyZxdW90OywgZW5kPSZxdW90OyZxdW90OykgICMgTGltcGlhciBsYSBwYW50YWxsYQogICAgZGlidWphcl90YWJsZXJvKCkKCiAgICAjIE1vc3RyYXIgaW5mb3JtYWNpJm9hY3V0ZTtuIGRlbCBqdWVnbwogICAgcHJpbnQoZiZxdW90O1JlYm90ZXM6IHtyZWJvdGVzfSZxdW90OykKICAgIHByaW50KCZxdW90O0NvbnRyb2xlczogJ2EnIChpenF1aWVyZGEpLCAnZCcgKGRlcmVjaGEpJnF1b3Q7KQoKICAgICMgTW92ZXIgbGEgcGFsZXRhIHNlZyZ1YWN1dGU7biBsYSBlbnRyYWRhIGRlbCBqdWdhZG9yCiAgICBpZiByZWJvdGVzICUgNSA9PSAwIGFuZCByZWJvdGVzICZndDsgMDoKICAgICAgICBwcmludCgmcXVvdDsrK011bHRpcGxlIHF1ZSBjb2xvcmVzIHB1ZWRlcyZxdW90OykKICAgICAgICAKICAgIGVudHJhZGEgPSBpbnB1dCgmcXVvdDtUdSBtb3ZpbWllbnRvOiAmcXVvdDspLnN0cmlwKCkubG93ZXIoKQogICAgaWYgZW50cmFkYSBpbiBbJnF1b3Q7YSZxdW90OywgJnF1b3Q7ZCZxdW90O106CiAgICAgICAgbW92ZXJfcGFsZXRhKGVudHJhZGEpCgogICAgIyBBY3R1YWxpemFyIGxhIHBvc2ljaSZvYWN1dGU7biBkZSBsYSBib2xhCiAgICBhY3R1YWxpemFyX2JvbGEoKQoKICAgICMgRXNwZXJhciB1biBwb2NvIHBhcmEgcXVlIGVsIGp1ZWdvIHNlYSBqdWdhYmxlCiAgICB0aW1lLnNsZWVwKDAuMSkKCiMgTW9zdHJhciBtZW5zYWplIGRlIGRlcnJvdGEKcHJpbnQoJnF1b3Q7XDAzM2MmcXVvdDssIGVuZD0mcXVvdDsmcXVvdDspICAjIExpbXBpYXIgbGEgcGFudGFsbGEKcHJpbnQoJnF1b3Q7JmlleGNsO1BlcmRpc3RlISBMYSBib2xhIGFtYXJpbGxhIHNhbGkmb2FjdXRlOyBkZSBsYSBwYW50YWxsYS4mcXVvdDspCnByaW50KGYmcXVvdDtSZWJvdGVzIGxvZ3JhZG9zOiB7cmVib3Rlc30mcXVvdDsp
import random
import time
# Configuración inicial
ANCHO = 30 # Ancho de la "pantalla"
ALTO = 15 # Alto de la "pantalla"
# Posiciones iniciales de la paleta y la bola
paleta_pos = ANCHO // 2
bola_x = ANCHO // 2
bola_y = ALTO // 2
bola_dx = random.choice([-1, 1])
bola_dy = 1
# Variables del juego
rebotes = 0
perdido = False
def dibujar_tablero():
"""Dibuja el tablero en consola."""
for y in range(ALTO):
linea = ""
for x in range(ANCHO):
if y == 0 or y == ALTO - 1: # Bordes superior e inferior
linea += "-"
elif x == 0 or x == ANCHO - 1: # Bordes izquierdo y derecho
linea += "|"
elif y == bola_y and x == bola_x: # Posición de la bola
linea += "O"
elif y == ALTO - 2 and paleta_pos - 2 <= x <= paleta_pos + 2: # Paleta
linea += "="
else:
linea += " "
print(linea)
def mover_paleta(direccion):
"""Mueve la paleta a la izquierda o derecha."""
global paleta_pos
if direccion == "a" and paleta_pos > 2:
paleta_pos -= 1
elif direccion == "d" and paleta_pos < ANCHO - 3:
paleta_pos += 1
def actualizar_bola():
"""Actualiza la posición de la bola y verifica colisiones."""
global bola_x, bola_y, bola_dx, bola_dy, rebotes, perdido
# Mover la bola
bola_x += bola_dx
bola_y += bola_dy
# Verificar colisión con los bordes izquierdo y derecho
if bola_x <= 1 or bola_x >= ANCHO - 2:
bola_dx *= -1
# Verificar colisión con el borde superior
if bola_y <= 1:
bola_dy *= -1
# Verificar colisión con la paleta
if bola_y == ALTO - 3 and paleta_pos - 2 <= bola_x <= paleta_pos + 2:
bola_dy *= -1
rebotes += 1
# Verificar si la bola se pierde
if bola_y >= ALTO - 1:
perdido = True
# Bucle principal del juego
print("¡Bienvenido a Pong en consola!")
print("Usa 'a' para mover la paleta a la izquierda y 'd' para moverla a la derecha.")
print("Presiona Enter para iniciar.")
input()
while not perdido:
# Dibujar el tablero
print("\033c", end="") # Limpiar la pantalla
dibujar_tablero()
# Mostrar información del juego
print(f"Rebotes: {rebotes}")
print("Controles: 'a' (izquierda), 'd' (derecha)")
# Mover la paleta según la entrada del jugador
if rebotes % 5 == 0 and rebotes > 0:
print("++Multiple que colores puedes")
entrada = input("Tu movimiento: ").strip().lower()
if entrada in ["a", "d"]:
mover_paleta(entrada)
# Actualizar la posición de la bola
actualizar_bola()
# Esperar un poco para que el juego sea jugable
time.sleep(0.1)
# Mostrar mensaje de derrota
print("\033c", end="") # Limpiar la pantalla
print("¡Perdiste! La bola amarilla salió de la pantalla.")
print(f"Rebotes logrados: {rebotes}")