Ascii Pong
O desafio é recriar o clássico jogo "pong" em caracteres ASCII no menor código possível.
Requisitos / especificações
- A "tela" deve ter 45 x 25 caracteres.
- Espaço em branco deve realmente ser espaço em branco.
- As pás devem ter 9 sinais de igual:
=========
e devem estar nas linhas superior e inferior (eu sei que o original é tocado de um lado para o outro em vez de de cima para baixo, mas acho que isso funciona melhor para ascii pong ) - A bola pode ser minúscula ou maiúscula
o
ou zero. - Dois botões de entrada de qualquer tipo (é bom se o usuário pressionar uma tecla que faz com que uma letra apareça na entrada, também é bom) para mover a raquete do jogador para a esquerda e para a direita, um ou dois caracteres de cada vez.
- A bola precisa ricochetear no ângulo apropriado ao bater em uma raquete ou em uma parede (dica: negue o valor da diferença x ou y).
- A pontuação deve ser exibida em algum lugar na saída. A pontuação é quantas vezes o jogador bate com sucesso na bola.
- Se a bola falhar na raquete do jogador, encerre o programa.
- Deve haver algum tipo de IA (mesmo que a raquete da IA corresponda ao valor x da bola).
- A bola não pode viajar em linha reta vertical ou horizontalmente.
A tela inicial / primeiro quadro deve se parecer com isso:
=========
o
=========
score: 0
Pontuação Este é o código-golfe , então o código mais curto vence ... no entanto, existem alguns bônus para diminuir sua contagem de caracteres:
- -30 caracteres: Mude a trajetória da bola dependendo de onde ela bate na raquete
- -10 caracteres: faça o jogo acelerar com o tempo
- -20 caracteres: torne a IA imbatível
- -20 caracteres: evite qualquer situação em que o jogador fique parado e o jogo continue para sempre sem vencer ou perder (causado por certas trajetórias e padrões de IA)
- -20 caracteres: faça a bola começar a se mover em uma trajetória (semi-) aleatória
- -25 caracteres: adicione uma opção de redefinição
Aqui está um exemplo sem golfe, sem bônus em 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 os jogos comecem!
3
Ok, alguém pode pelo menos explicar por que votou contra isso? Estou genuinamente curioso porque achei que seria divertido, mas não tenho muita experiência.
—
Eric Vincent
Imprimir coisas ASCII é bom, mas com a interação do teclado, teríamos que criar um aplicativo inteiro. Esse tipo de desafio é desaprovado, porque muitos idiomas não suportam E / S assim. Implementando uma IA, física. Quase como um aplicativo em grande escala. Se você der uma olhada em outros desafios, eles têm uma tarefa que recebe uma entrada (ou não) e produz uma saída relevante. Adicionando um AI, física e knteraction teclado é apenas maneira muito para um desafio
—
Downgoat
@vihan a IA do pong é extremamente simples, basta seguir o valor x da bola. Mesmo torná-lo superável não é tão difícil, basta limitar a velocidade da raquete. O único problema real com o conceito é a interação do teclado, que pode ser gerenciada em uma variedade razoável de idiomas. O resumo é, no entanto, bastante vago e aberto (dado que somos defensores da ambiguidade e justiça por aqui), e a vasta gama de bônus não ajuda nisso.
—
Level River St
A interação do teclado também teve que ser resolvida no (Re) Implementing Tetris , mas isso não diminuiu a popularidade da tarefa. (Sim, eu sei, isso foi realmente um concurso de popularidade , não é.) A única coisa que pessoalmente acho perturbadora é a quantidade de bônus. Mas certamente não precisa ser do meu gosto.
—
manatwork