Ассі Понг
Завдання полягає в тому, щоб відтворити класичну гру "понг" в символах ASCII в найкоротший термін.
Вимоги / характеристики
- "Екран" повинен містити 45x25 символів.
- Білий простір насправді повинен бути білим простором.
- Весла повинні мати 9 рівних знаків:
=========
і повинні знаходитися на верхніх і найнижчих рядах (я знаю, що оригінал відтворюється збоку, а не зверху донизу, але я думаю, що це краще працює для ascii pong ). - Куля може бути нижньою або верхньою буквою
o
або нулем. - Дві кнопки введення будь-якого типу (добре, якщо користувач натискає клавішу, яка відображає літеру на вводі, що теж добре), щоб переміщувати лопатку гравця вліво та вправо, одного або двох символів одночасно.
- М'яч повинен бути рикошетом під відповідним кутом при ударі про весло або стіну (підказка: заперечуйте значення різниці x або y).
- Оцінка повинна відображатися десь у висновку. Оцінка - скільки разів успішно гравець ударяє м'яч.
- Якщо м'яч пропустив весло гравця, припиніть програму.
- Має бути якийсь AI (навіть якщо лопатка AI просто відповідає значенню x).
- М'яч не може рухатись по прямій вертикалі чи горизонталі.
Початковий екран / перший кадр повинен виглядати приблизно так:
=========
o
=========
score: 0
Підрахунок балів Це гольф з кодом , тому найкоротший код виграє ... однак, є кілька бонусів, щоб зменшити кількість персонажів:
- -30 символів: змініть траєкторію кулі залежно від місця попадання на весло
- -10 символів: зробіть швидкість гри з часом
- -20 символів: зробіть AI помітним
- -20 символів: Уникайте будь-яких ситуацій, коли гравець залишається нерухомим, а гра триває вічно, не виграючи або програючи (спричинені певними траєкторіями та моделями AI)
- -20 символів: змусьте м'яч починати рухатися по (напів-) випадковій траєкторії
- -25 символів: Додати опцію скидання
Ось приклад без гольфу без бонусів у 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>
Нехай починаються ігри!
3
Гаразд, хтось може хоча б пояснити, чому вони спростували це? Мені по-справжньому цікаво, тому що я думав, що це буде весело, але я не маю особливого досвіду.
—
Ерік Вінсент
Друк матеріалів ASCII добре, але при взаємодії з клавіатурою нам доведеться створити цілий додаток. Цей тип проблем викликає недовольство, тому що багато мов не підтримують введення-виведення подібного. Реалізація AI, фізики. Майже як повномасштабне додаток. Якщо ви подивитесь на інші виклики, у них є одне завдання, яке приймає вхід (чи ні) і дає відповідне висновок. Додавання інтерфейсу AI, фізики та клавіатури - це лише шлях до вирішення проблеми
—
Downgoat
@vihan AI для понг надзвичайно простий, він просто повинен дотримуватися значення х кулі. Навіть зробити його зручним не так вже й важко, просто обмежте швидкість руху весла. Єдина реальна проблема з концепцією - це взаємодія клавіатури, якою можна керувати на різних мовах. Цей короткий огляд є досить невиразним та відкритим (враховуючи, що ми тут дотримуємось однозначності та справедливості), і величезна кількість бонусів не допомагає цьому.
—
Рівень річки Св.
Взаємодія з клавіатурою довелося вирішити і в (Re) впровадженні тетрісу , але це не зменшило популярності завдання. (Так, я знаю, це було насправді популярністю-конкурсом , це не так.) Єдине, що особисто мене вважає тривожним, - це сума бонусів. Але, безумовно, не повинно відповідати моєму смаку.
—
манатура