Ascii Pong
Zorluk klasik oyun "pong" ASCII karakterlerde mümkün olan en kısa kodda yeniden oluşturmaktır.
Gereksinimler / özellikler
- "Ekran" 45x25 karakter olmalıdır.
- Beyaz boşluk aslında beyaz boşluk olmalıdır.
- Kürekler 9 işaretine eşit
=========
olmalıdır : ve en üstte ve en altta satırlarda olmalıdır (Orijinalin yukarıdan aşağıya yerine yan yana oynandığını biliyorum, ancak bunun ascii pong için daha iyi çalıştığını düşünüyorum ). - Top küçük veya büyük harf
o
veya sıfır olabilir. - Her türden iki giriş düğmesi (kullanıcı girişte bir harfi gösteren bir tuşa basarsa iyi olur, bu da iyidir) oyuncunun raketini bir kerede bir veya iki karakter sola ve sağa hareket ettirmek için.
- Top, bir raket veya duvara çarptıktan sonra uygun açıyla sekmelidir (ipucu: x veya y fark değerini ortadan kaldırın).
- Skor, çıktıda bir yerde gösterilmelidir. Skor, oyuncunun topa başarılı bir şekilde kaç kez vurduğudur.
- Top oyuncunun raketini kaçırırsa, programı sonlandırın.
- Olmamalıdır bazı (AI küreği sadece topun x değerle eşleşen bile) AI tür.
- Top düz bir çizgide dikey veya yatay olarak hareket edemez.
Başlangıç ekranı / ilk kare şöyle görünmelidir:
=========
o
=========
score: 0
Puanlama Bu kod golf , bu yüzden en kısa kod kazanır ... Ancak, karakter sayınızı azaltmak için bazı bonuslar vardır:
- -30 karakter: Topun raketine vuracağı yere bağlı olarak yörüngesini değiştirme
- -10 karakter: Oyunun zaman içinde hızlanmasını sağla
- -20 karakter: AI'yı yenilebilir yapın
- -20 karakter: Oyuncunun hareketsiz kaldığı ve oyunun kazanmadan veya kaybetmeden sonsuza kadar devam ettiği durumlardan kaçının (belirli yörüngeler ve AI desenlerinden kaynaklanır)
- -20 karakter: Topun (yarı) rastgele bir yörüngede hareket etmesini sağlayın
- -25 karakter: Sıfırlama seçeneği ekle
JavaScript'te ikramiye bulunmayan golf oynamayan bir örnek:
//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>
Oyunlar başlasın!
3
Tamam, birileri en azından bunu neden aşağı indirdiklerini açıklayabilir mi? Gerçekten merak ediyorum çünkü bunun eğlenceli olacağını düşündüm ama fazla tecrübem yok.
—
Eric Vincent
ASCII malzemelerini yazdırmak iyidir, ancak klavye etkileşimi ile tüm bir uygulama oluşturmamız gerekir. Bu tür zorluklar ön plana çıkar, çünkü birçok dil bu şekilde desteklemeyi desteklemez. Bir yapay zeka, fizik uygulamak. Neredeyse tam ölçekli bir uygulama gibi. Diğer zorluklara bakarsanız, bir girdi alan (ya da almayan) ve ilgili çıktı üreten bir görevi vardır. Bir AI, fizik ve klavye knteraction eklemek bir meydan okuma için çok yol
—
Downgoat
@vihan pong için AI son derece basittir, sadece topun x değerini takip etmek zorundadır. Dövülebilir hale getirmek bile o kadar zor değil, sadece kürek hızını sınırlayın. Konseptle ilgili tek gerçek sorun, makul çeşitli dillerde yönetilebilen klavye etkileşimi. Ancak özet oldukça belirsiz ve açık (burada belirsizlik ve adalet için sopa olduğumuz göz önüne alındığında) ve çok çeşitli bonuslar buna yardımcı olmuyor.
—
Level River St
Klavye etkileşimi de Tetris'in (Re) Uygulanmasında çözülmek zorundaydı , ancak bu görevin popülerliğini azaltmadı. (Evet, biliyorum, bu aslında popülerlik yarışmasıydı , bu değil.) Kişisel olarak rahatsız edici bulduğum tek şey bonus miktarı. Ama kesinlikle benim zevkime bağlı olmak zorunda değil.
—
manatwork