Ascii Pong
Le défi est de recréer le jeu classique "pong" en caractères ASCII dans le code le plus court possible.
Exigences / spécifications
- L '"écran" doit contenir 45 x 25 caractères.
- L'espace blanc doit en fait être un espace blanc.
- Les palettes doivent avoir 9 signes égaux:
=========
et doivent être sur les rangées les plus hautes et les plus basses (je sais que l'original est joué côte à côte au lieu de haut en bas, mais je pense que cela fonctionne mieux pour ascii pong ). - La balle peut être un minuscule ou un majuscule
o
ou un zéro. - Deux boutons de saisie de toute sorte (c'est bien si l'utilisateur appuie sur une touche qui fait apparaître une lettre dans l'entrée, c'est bien aussi) pour déplacer la palette du joueur à gauche et à droite un ou deux caractères à la fois.
- La balle doit ricocher à l'angle approprié lorsqu'elle frappe une raquette ou un mur (indice: annuler la valeur de différence x ou y).
- Le score doit être affiché quelque part dans la sortie. Le score est le nombre de fois où le joueur frappe le ballon avec succès.
- Si le ballon manque la raquette du joueur, mettez fin au programme.
- Il devrait y avoir une sorte d'IA (même si la palette de l'IA correspond juste à la valeur x de la balle).
- Le ballon ne peut pas voyager en ligne droite verticalement ou horizontalement.
L'écran de démarrage / première image devrait ressembler à ceci:
=========
o
=========
score: 0
Score C'est du golf de code , donc le code le plus court gagne ... cependant, il y a quelques bonus pour diminuer le nombre de vos personnages:
- -30 personnages: changez la trajectoire de la balle en fonction de l'endroit où elle frappe sur la raquette
- -10 personnages: accélérez le jeu au fil du temps
- -20 caractères: rendez l'IA battable
- -20 personnages: évitez toute situation où le joueur reste immobile et le jeu se poursuit indéfiniment sans gagner ni perdre (causé par certaines trajectoires et modèles d'IA)
- -20 caractères: faire bouger la balle sur une trajectoire (semi-) aléatoire
- -25 caractères: ajouter une option de réinitialisation
Voici un exemple sans golf sans bonus 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 les jeux commencent!
Réponses:
Perl,
760 611 592 535515 (640-30-10-20-20-20-25)Une solution console avec tous les bonus.
Il devrait fonctionner sur n'importe quel terminal qui comprend les codes d'échappement ANSI (\ e [...). Testé sur cygwin.
Commandes du clavier:
Gauche: 4
Droite: 6
Réinitialisation: 8
la source
print
plus de 4 fois, il devrait être moins cher de configurer un nouveau sous-marin et d'appeler celasub p{print@_}
. Si cela ne vous dérange pas que d'autres clés soient utilisées ainsi que celles que vous spécifiez, vous pouvez les remplacerif(defined($k=ReadKey(-1))){L(-1)if's'eq$k;L(1)if'd'eq$k;I,if'r'eq$k}
parL 114<=>ord$k if$k=ReadKey -1;
. Cela convertit simplement <r: -1, r: 0,> r: 1, ce qui n'est peut-être pas ce que vous recherchez. Si vous êtes satisfait, vous pouvez utiliser [4] [5] [6] comme les touches avec:L$k<=>5 if$k=ReadKey -1;
.if
contrôle postfix ou remplacer par ternary pour quelques économies supplémentaires, mais cela pourrait s'avérer difficile avec l'imbrication ... Vous avez un autre bloc$d--if$d>6
que vous pouvez changer$d-=$d>6
pour une sauvegarde de 2 octets qui pourrait fonctionner dans quelques autres endroits aussi et une autre petite économie est;$p=H.'='x9 .$"
au lieu de$p="H========= "
. J'espère que certains d'entre eux sont utiles!$}
ou quelque chose) ou en utilisant des mots nus ($a.H
), je ne sais pas si cela vous aidera dans ce cas ou non. Quelque chose que j'ai remarqué, c'est quesub P
si vous n'avez qu'un seul argument, vous pourriez en avoirprint"\e[@_"
au lieu de.pop
car il n'y aura pas de séparateur de champ à craindre. De plus, si vous utilisez le pavé numérique au lieu de lettres, vous n'avez pas besoin de l'utiliserord
, comme vous le$k
feriez4
ou6
vous pourriez le faire à la5<=>$k
place.JavaScript, 618 octets + HTML, 99 octets
Eh bien voici ma réponse JavaScript golfée même si elle n'est pas possible dans d'autres langues:
-20 et -25 pour les bonus
la source
&&
jetons&
, éliminer beaucoup de;
jetons, vous débarrasser des espaces inutiles après{
et même vous débarrasser de certains caractères de citation dans le HTML. Et probablement beaucoup plus, même. Ce n'est qu'une supposition, mais vous voudrez peut-être éviter UglifyJS et réduire à la main. :)