Ascii Pong
Wyzwanie polega na odtworzeniu klasycznej gry „pong” w postaci ASCII w możliwie najkrótszym kodzie.
Wymagania / specyfikacje
- „Ekran” powinien mieć 45 x 25 znaków.
- Biała przestrzeń powinna być właściwie białą przestrzenią.
- Łopatki powinny mieć 9 znaków równości:
=========
i powinny znajdować się na najwyższych i najniższych rzędach (wiem, że oryginał jest odtwarzany bokiem do boku zamiast od góry do dołu, ale myślę, że działa to lepiej w przypadku ascii ponga ). - Piłka może być małą
o
lub dużą literą lub zerową. - Dwa przyciski wprowadzania dowolnego rodzaju (jest w porządku, jeśli użytkownik naciśnie klawisz powodujący wyświetlenie litery na wejściu, to też jest w porządku), aby przesunąć wiosło gracza w lewo lub w prawo o jeden lub dwa znaki na raz.
- Po uderzeniu w wiosło lub ścianę piłka musi rykoszetować pod odpowiednim kątem (wskazówka: zaneguj wartość różnicy x lub y).
- Wynik powinien być wyświetlony gdzieś na wyjściu. Wynik pokazuje, ile razy gracz z powodzeniem uderza piłkę.
- Jeśli piłka nie trafi w wiosło gracza, zakończ program.
- Powinno być jakieś AI (nawet jeśli wiosło AI po prostu odpowiada wartości x piłki).
- Piłka nie może poruszać się w linii prostej w pionie lub w poziomie.
Ekran startowy / pierwsza klatka powinny wyglądać mniej więcej tak:
=========
o
=========
score: 0
Punktacja Jest to gra w golfa , więc wygrywa najkrótszy kod ... jednak istnieją pewne bonusy, które zmniejszają liczbę twoich postaci:
- -30 znaków: Zmień trajektorię piłki w zależności od tego, gdzie trafi w wiosło
- -10 znaków: Z czasem gra przyspiesza
- -20 znaków: Spraw, aby AI było do pokonania
- -20 postaci: Unikaj sytuacji, w których gracz pozostaje nieruchomy, a gra toczy się wiecznie, nie wygrywając ani nie przegrywając (spowodowane pewnymi trajektoriami i wzorami sztucznej inteligencji)
- -20 znaków: Spraw, aby piłka zaczęła się poruszać na (pół-) losowej trajektorii
- -25 znaków: Dodaj opcję resetowania
Oto przykład bez gry w golfa bez bonusów w 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>
Niech rozpocznie się gra!