Ascii Pong
Die Herausforderung besteht darin, das klassische Spiel "Pong" in ASCII-Zeichen in kürzestem Code nachzubilden.
Anforderungen / Spezifikationen
- Der "Bildschirm" sollte 45x25 Zeichen groß sein.
- Leerraum sollte eigentlich Leerraum sein.
- Die Paddel sollten 9 Gleichheitszeichen haben:
=========
und sollten sich in der obersten und untersten Reihe befinden (ich weiß, dass das Original von Seite zu Seite statt von oben nach unten gespielt wird, aber ich denke, dass dies für ASCII Pong besser funktioniert ). - Der Ball kann ein Klein- oder Großbuchstabe
o
oder eine Null sein. - Zwei Eingabetasten jeglicher Art (es ist in Ordnung, wenn der Benutzer eine Taste drückt, mit der ein Buchstabe in der Eingabe angezeigt wird, das ist auch in Ordnung), um das Paddel des Spielers jeweils um ein oder zwei Zeichen nach links und rechts zu bewegen.
- Der Ball muss beim Auftreffen auf ein Paddel oder eine Wand im richtigen Winkel abprallen (Hinweis: Negieren Sie den x- oder y-Differenzwert).
- Die Partitur sollte irgendwo in der Ausgabe angezeigt werden. Die Punktzahl gibt an, wie oft der Spieler den Ball erfolgreich schlägt.
- Wenn der Ball das Paddel des Spielers verfehlt, beenden Sie das Programm.
- Es sollte einige Art von AI (auch wenn die Paddel der KI nur der x - Wert des Balls übereinstimmt).
- Der Ball kann sich weder vertikal noch horizontal in einer geraden Linie bewegen.
Der Startbildschirm / das erste Bild sollte ungefähr so aussehen:
=========
o
=========
score: 0
Wertung Dies ist Code-Golf , also gewinnt der kürzeste Code ... es gibt jedoch einige Boni, um die Anzahl Ihrer Charaktere zu verringern:
- -30 Zeichen: Ändert die Flugbahn des Balls je nachdem, wo er auf das Paddel trifft
- -10 Zeichen: Beschleunigen Sie das Spiel im Laufe der Zeit
- -20 Zeichen: Mach die KI schlagbar
- -20 Zeichen: Vermeiden Sie Situationen, in denen der Spieler still bleibt und das Spiel für immer weitergeht, ohne zu gewinnen oder zu verlieren (verursacht durch bestimmte Flugbahnen und KI-Muster).
- -20 Zeichen: Lassen Sie den Ball sich auf einer (halb-) zufälligen Flugbahn bewegen
- -25 Zeichen: Fügen Sie eine Rücksetzoption hinzu
Hier ist ein Beispiel ohne Golf ohne Boni in 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>
Lasst die Spiele beginnen!
Antworten:
Perl,
760 611 592 535515 (640-30-10-20-20-20-25)Eine Konsolenlösung mit all dem Bonusmaterial.
Es sollte auf jedem Terminal funktionieren, das die ANSI-Escape-Codes versteht (\ e [...). Auf Cygwin getestet.
Tastatursteuerung:
Links: 4
Rechts: 6
Zurücksetzen: 8
quelle
print
mehr als vier Mal verwenden, sollte es billiger sein, ein neues Sub einzurichten und das aufzurufensub p{print@_}
. Wenn Sie keine anderen Tasten etwas dagegen , sowie diejenigen , die Sie spezifisch verwendet werden, können Sie ersetzenif(defined($k=ReadKey(-1))){L(-1)if's'eq$k;L(1)if'd'eq$k;I,if'r'eq$k}
mitL 114<=>ord$k if$k=ReadKey -1;
. Dies konvertiert nur <r: -1, r: 0,> r: 1, was möglicherweise nicht das ist, wonach Sie suchen. Wenn Sie damit zufrieden sind, können Sie [4] [5] [6] als Schlüssel verwenden mit :L$k<=>5 if$k=ReadKey -1;
.if
Prüfung ersetzen oder durch ternäre ersetzen, um weitere Einsparungen zu erzielen. Dies könnte sich jedoch bei der Verschachtelung als schwierig erweisen. Sie haben einen anderen Block,$d--if$d>6
den Sie$d-=$d>6
für eine 2-Byte-Speicherung ändern können könnte auch an ein paar weiteren Stellen funktionieren und eine weitere kleine Ersparnis ist;$p=H.'='x9 .$"
statt$p="H========= "
. Hoffe, einige davon sind nützlich!$}
umgehen , indem Sie nicht-alphabetische Variablennamen ( oder etwas anderes) oder Barewords ($a.H
) verwenden. Sie sind sich nicht sicher, ob dies in diesem Fall hilfreich ist oder nicht. Etwas, das mir aufgefallen ist, ist,sub P
wenn Sie immer nur ein Argument dafür haben, das Sieprint"\e[@_"
stattdessen haben könnten,.pop
da es kein Feldtrennzeichen gibt, über das Sie sich Sorgen machen müssen. Auch, wenn Sie die numpad anstelle von Buchstaben verwenden, müssen Sie nicht verwenden müssenord
, als$k
wären4
oder6
so Sie tun können ,5<=>$k
statt.JavaScript, 618 Bytes + HTML, 99 Bytes
Nun, hier ist meine Antwort auf Golf-JavaScript, auch wenn dies in anderen Sprachen nicht möglich ist:
-20 und -25 für Boni
quelle
&&
Token ersetzen&
, viele;
Token entfernen, unnötige Leerzeichen danach entfernen{
und sogar einige Anführungszeichen im HTML-Code entfernen. Und wahrscheinlich sogar noch viel mehr. Dies ist nur eine Vermutung, aber Sie sollten versuchen, UglifyJS zu vermeiden und von Hand zu minimieren. :)