Ascii Pong
El desafío es recrear el clásico juego "pong" en caracteres ASCII en el código más corto posible.
Requisitos / especificaciones
- La "pantalla" debe tener 45x25 caracteres.
- El espacio en blanco debería ser en realidad un espacio en blanco.
- Las paletas deben ser 9 signos iguales:
=========
y deben estar en las filas más altas y más bajas (sé que el original se juega de lado a lado en lugar de arriba a abajo, pero creo que esto funciona mejor para ascii pong ) - La pelota puede ser minúscula o mayúscula
o
o cero. - Dos botones de entrada de cualquier tipo (está bien si el usuario presiona una tecla que hace que aparezca una letra en la entrada, eso también está bien) para mover la paleta del jugador de izquierda a derecha uno o dos caracteres a la vez.
- La pelota necesita rebotar en el ángulo apropiado al golpear una paleta o una pared (pista: negar el valor de diferencia x o y).
- La puntuación debe mostrarse en algún lugar de la salida. El puntaje es cuántas veces el jugador golpea con éxito la pelota.
- Si la pelota pierde la paleta del jugador, finalice el programa.
- Debería haber algún tipo de IA (incluso si la paleta de la IA solo coincide con el valor x de la bola).
- La pelota no puede viajar en línea recta vertical u horizontalmente.
La pantalla de inicio / primer fotograma debería verse así:
=========
o
=========
score: 0
Puntuación Este es el código de golf , por lo que gana el código más corto ... sin embargo, hay algunas bonificaciones para disminuir el recuento de tu personaje:
- -30 caracteres: cambia la trayectoria de la pelota dependiendo de dónde golpea la pala
- -10 personajes: haz que el juego se acelere con el tiempo
- -20 caracteres: haz que la IA sea superable
- -20 caracteres: evita cualquier situación en la que el jugador se quede quieto y el juego continúe para siempre sin ganar o perder (causado por ciertas trayectorias y patrones de IA)
- -20 caracteres: hacer que la pelota comience a moverse en una trayectoria (semi) aleatoria
- -25 caracteres: agregue una opción de reinicio
Aquí hay un ejemplo sin golf sin bonos en JavaScript:
//init
var x = 22,
y = 12,
xd = Math.random() < 0.5 ? -1 : 1,
yd = 1,
player = opponent = 18,
score = 0,
//interval that runs 10x per second (minus the runtimeof one cycle)
interval = setInterval(function() {
//move ball
x += xd;
y += yd;
//move opponent
opponent = x - 4;
//collision with walls
if(x <= 0 || x >= 44) xd = -xd;
//collision with paddles
if(y == 1) {
if(x >= opponent && x < opponent + 9) yd = -yd;
else {
//you win
clearInterval(interval);
document.body.innerHTML = "You win!<br>Your score was: " + score;
return;
}
}
else if(y == 23) {
if(x >= player && x < player + 9) {
yd = -yd;
score++;
}
else {
//you lose
clearInterval(interval);
document.body.innerHTML = "You lose!<br>Your score was: " + score;
return;
}
}
draw();
}, 100);
function draw() {
var body = document.body;
body.innerHTML = "";
for(var i = 0; i < 25; i++) {
for(var j = 0; j < 45; j++) {
//white space is default
var char = " ";
//ball
if(j == x && i == y) char = "o";
//paddles
if(i === 0) {
if(j >= opponent && j < opponent + 9) char = "=";
}
else if(i == 24) {
if(j >= player && j < player + 9) char = "=";
}
body.innerHTML += char;
}
body.innerHTML += "<br>";
}
body.innerHTML += "score: " + score;
}
//key press listener for left and right movement
window.onkeydown = function() {
if (window.event.keyCode == 37) player -= 2;
else if(window.event.keyCode == 39) player += 2;
};
<body style="font-family: monospace; white-space: pre">
</body>
¡Que empiecen los juegos!
Respuestas:
Perl, 760611592
535515 (640-30-10-20-20-20-25-25)Una solución de consola con todas las bonificaciones.
Debería funcionar en cualquier terminal que entienda los códigos de escape ANSI (\ e [...]). Probado en cygwin.
Controles del teclado:
Izquierda: 4
Derecha: 6
Restablecer: 8
fuente
print
más de 4 veces, debería ser más barato configurar un nuevo sub y llamar a esosub p{print@_}
. Si no le importa que se usen otras teclas además de las que usted especifica, puede reemplazarlasif(defined($k=ReadKey(-1))){L(-1)if's'eq$k;L(1)if'd'eq$k;I,if'r'eq$k}
porL 114<=>ord$k if$k=ReadKey -1;
. Esto solo convierte <r: -1, r: 0,> r: 1, que podría no ser lo que buscas. Si está satisfecho con esto, se podía utilizar [4] [5] [6] como las claves con:L$k<=>5 if$k=ReadKey -1;
.if
comprobación de postfix o reemplazar con ternary para obtener más ahorros, pero eso podría resultar complicado con la anidación ... Tiene otro bloque al$d--if$d>6
que puede cambiar$d-=$d>6
para un ahorro de 2 bytes que podría funcionar en algunos lugares más también y otro pequeño ahorro es en;$p=H.'='x9 .$"
lugar de$p="H========= "
. ¡Espero que algunos de estos sean útiles!$}
o algo así) o usando palabras vacías ($a.H
), no estoy seguro de si eso lo ayudará en este caso o no. Algo que noté es quesub P
si alguna vez tiene un argumento, podría tenerlo enprint"\e[@_"
lugar de hacerlo,.pop
ya que no habrá un separador de campo por el que preocuparse. Además, si está usando el teclado numérico en lugar de letras, no necesita usarloord
, como$k
sería4
o6
podría hacerlo en su5<=>$k
lugar.JavaScript, 618 bytes + HTML, 99 bytes
Bueno, aquí está mi respuesta JavaScript de golf, incluso si no es factible en otros idiomas:
-20 y -25 por bonificaciones
fuente
&&
tokens&
, eliminar muchos;
tokens, deshacerse de espacios innecesarios después{
e incluso deshacerse de algunos caracteres de comillas en el HTML. Y probablemente mucho más, incluso. Esto es solo una suposición, pero es posible que desee intentar evitar UglifyJS y minificar a mano. :)