Ascii Pong
Tantangannya adalah membuat ulang game klasik "pong" dalam karakter ASCII dengan kode sesingkat mungkin.
Persyaratan / spesifikasi
- "Layar" harus 45x25 karakter.
- Ruang putih sebenarnya harus ruang putih.
- Dayung harus 9 sama dengan tanda-tanda:
=========
dan harus di baris paling atas dan paling bawah (saya tahu aslinya dimainkan dari sisi ke sisi, bukan dari atas ke bawah, tapi saya pikir ini bekerja lebih baik untuk ascii pong ). - Bola bisa menjadi huruf kecil atau huruf besar
o
atau nol. - Dua tombol input apa pun (baik-baik saja jika pengguna menekan tombol yang membuat huruf muncul di input, itu juga baik-baik saja) untuk memindahkan dayung pemain ke kiri dan kanan satu atau dua karakter sekaligus.
- Bola harus memantul pada sudut yang tepat saat memukul dayung atau dinding (petunjuk: meniadakan nilai perbedaan x atau y).
- Skor harus ditampilkan di suatu tempat di output. Skornya adalah berapa kali pemain berhasil mengenai bola.
- Jika bola melewati dayung pemain, hentikan programnya.
- Harus ada beberapa jenis AI (bahkan jika dayung AI hanya cocok nilai x bola).
- Bola tidak dapat melakukan perjalanan dalam garis lurus secara vertikal atau horizontal.
Layar mulai / bingkai pertama akan terlihat seperti ini:
=========
o
=========
score: 0
Skor Ini adalah kode-golf , jadi kode terpendek menang ... namun, ada beberapa bonus untuk mengurangi jumlah karakter Anda:
- -30 karakter: Ubah lintasan bola tergantung di mana bola itu mengenai dayungnya
- -10 karakter: Buat game lebih cepat dari waktu ke waktu
- -20 karakter: Membuat AI beatable
- -20 karakter: Hindari situasi di mana pemain tetap diam dan permainan berlangsung selamanya tanpa menang atau kalah (disebabkan oleh lintasan tertentu dan pola AI)
- -20 karakter: Buat bola mulai bergerak pada lintasan acak (semi-)
- -25 karakter: Tambahkan opsi reset
Ini adalah contoh un-golfed tanpa bonus dalam 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>
Biarkan game dimulai!
Jawaban:
Perl,
760 611 592 535515 (640-30-10-20-20-20-25)Solusi konsol dengan semua hal bonus.
Ini harus bekerja pada terminal apa pun yang memahami kode pelarian ANSI (\ e [...). Diuji pada cygwin.
Kontrol keyboard:
Kiri: 4
Kanan: 6
Reset: 8
sumber
print
lebih dari 4 kali, seharusnya lebih murah untuk membuat sub baru dan menyebutnyasub p{print@_}
. Jika Anda tidak keberatan menggunakan tombol lain seperti yang Anda spesifik, Anda dapat menggantinyaif(defined($k=ReadKey(-1))){L(-1)if's'eq$k;L(1)if'd'eq$k;I,if'r'eq$k}
denganL 114<=>ord$k if$k=ReadKey -1;
. Ini hanya mengkonversi <r: -1, r: 0,> r: 1 yang mungkin bukan yang Anda cari. Jika Anda senang dengan ini, Anda bisa menggunakan [4] [5] [6] sebagai kunci dengan:L$k<=>5 if$k=ReadKey -1;
.if
memeriksa atau mengganti dengan ternary untuk penghematan lebih banyak, tetapi itu mungkin terbukti rumit dengan bersarang ... Anda memiliki blok lain$d--if$d>6
yang dapat Anda ubah ke$d-=$d>6
untuk penghematan 2-byte yang mungkin bekerja di beberapa tempat lagi dan penghematan kecil lainnya;$p=H.'='x9 .$"
bukan$p="H========= "
. Semoga beberapa di antaranya bermanfaat!$}
atau sesuatu) atau menggunakan kata kunci ($a.H
), tidak yakin apakah itu akan membantu Anda dalam kasus ini atau tidak. Sesuatu Aku melihat, dalamsub P
jika Anda hanya pernah memiliki satu argumen untuk itu, Anda bisa memilikiprint"\e[@_"
bukan.pop
karena tidak akan ada pemisah lapangan untuk khawatir tentang. Juga, jika Anda menggunakan papan angka bukan huruf, Anda tidak perlu digunakanord
, karena$k
akan4
atau6
sehingga Anda bisa melakukan5<=>$k
sebaliknya.JavaScript, 618 byte + HTML, 99 byte
Baiklah, inilah jawaban JavaScript yang saya mainkan meskipun tidak layak dalam bahasa lain:
-20 dan -25 untuk bonus
sumber
&&
token&
, menghilangkan banyak;
token, menyingkirkan spasi yang tidak perlu setelah{
dan bahkan menyingkirkan beberapa karakter kutipan dalam HTML. Dan mungkin lebih banyak, bahkan. Ini hanya dugaan, tetapi Anda mungkin ingin mencoba menghindari UglifyJS dan memperkecil dengan tangan. :)