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!
Odpowiedzi:
Perl,
760 611 592 535515 (640-30-10-20-20-20-25)Rozwiązanie konsolowe ze wszystkimi dodatkami.
Powinien działać na każdym terminalu, który rozumie kody specjalne ANSI (\ e [...). Testowane na cygwinie.
Sterowanie za pomocą klawiatury: w
lewo: 4 w
prawo: 6
reset: 8
źródło
print
więcej niż 4 razy, skonfigurowanie nowego subwoofera i wywołanie tego powinno być tańszesub p{print@_}
. Jeśli nie przeszkadza inne klawisze wykorzystywane, jak również te, które konkretne, można wymienićif(defined($k=ReadKey(-1))){L(-1)if's'eq$k;L(1)if'd'eq$k;I,if'r'eq$k}
zL 114<=>ord$k if$k=ReadKey -1;
. To po prostu konwertuje <r: -1, r: 0,> r: 1, co może nie być tym, czego szukasz. Jeśli jesteś zadowolony z tego, można użyć [4] [5] [6] jako klucze z:L$k<=>5 if$k=ReadKey -1;
.if
sprawdzeniem postfiksów lub zamienić na trójskładnik, aby uzyskać więcej oszczędności, ale może to okazać się trudne przy zagnieżdżaniu ... Masz inny blok, na$d--if$d>6
który możesz zmienić$d-=$d>6
2-bajtowe zapisywanie, które może działać również w kilku innych miejscach, a;$p=H.'='x9 .$"
zamiast tego jest kolejna mała oszczędność$p="H========= "
. Mam nadzieję, że niektóre z nich są przydatne!$}
lub czegoś takiego) lub za pomocą słów kluczowych ($a.H
), nie jestem pewien, czy to pomoże ci w tym przypadku, czy nie. Zauważyłem coś,sub P
jeśli kiedykolwiek miałeś tylko jeden argument, możeszprint"\e[@_"
zamiast tego,.pop
ponieważ nie będzie się martwić separatorem pól. Ponadto, jeśli używasz NUM zamiast liter, nie trzeba do użytkuord
, jak$k
będzie4
albo6
tak można robić5<=>$k
zamiast tego.JavaScript, 618 bajtów + HTML, 99 bajtów
Oto moja odpowiedź JavaScript na golfa, nawet jeśli nie jest to możliwe w innych językach:
-20 i -25 za bonusy
źródło
&&
tokenów&
, wyeliminować wiele;
tokenów, pozbyć się niepotrzebnych spacji,{
a nawet pozbyć się niektórych znaków cudzysłowu w HTML. I prawdopodobnie nawet o wiele więcej. To tylko przypuszczenie, ale możesz spróbować uniknąć UglifyJS i ręcznie zminimalizować. :)