Аски Понг
Задача состоит в том, чтобы воссоздать классическую игру «понг» в символах ASCII в кратчайшем возможном коде.
Требования / характеристики
- «Экран» должен быть 45х25 символов.
- Пробел на самом деле должен быть пробелом.
- Весло должно быть 9 знаков равенства:
=========
и должно быть на самом верхнем и самом нижнем рядах (я знаю, что оригинал воспроизводится из стороны в сторону, а не сверху вниз, но я думаю, что это лучше работает для ascii pong ). - Мяч может быть в нижнем или верхнем регистре
o
или ноль. - Две кнопки ввода любого типа (это хорошо, если пользователь нажимает клавишу, которая заставляет букву появляться на входе, что тоже хорошо), чтобы перемещать весло игрока влево и вправо на один или два символа за раз.
- Мяч должен рикошетить под соответствующим углом при ударе о весло или стену (подсказка: отмените значение разницы x или y).
- Счет должен отображаться где-то в выводе. Счет - сколько раз игрок ударил по мячу.
- Если мяч не попал в ракетку, закройте программу.
- Должен быть какой- то ИИ (даже если весло ИИ просто соответствует значению х шара).
- Мяч не может двигаться по прямой линии вертикально или горизонтально.
Начальный экран / первый кадр должен выглядеть примерно так:
=========
o
=========
score: 0
Подсчет очков Это код-гольф , поэтому выигрывает самый короткий код ... однако, есть некоторые бонусы, чтобы уменьшить количество ваших персонажей:
- -30 символов: изменить траекторию мяча в зависимости от того, где он ударяет по веслу
- -10 персонажей: ускорение игры
- -20 символов: сделать ИИ побиваемым
- -20 персонажей: избегайте любых ситуаций, когда игрок остается неподвижным, а игра продолжается вечно без выигрыша или проигрыша (вызванного определенными траекториями и паттернами ИИ)
- -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-файлов - это нормально, но с клавиатурным взаимодействием нам придется создавать целое приложение. Проблемы такого типа неодобрительны, потому что многие языки не поддерживают такой ввод-вывод. Реализация ИИ, физика. Почти как полномасштабное приложение. Если вы посмотрите на другие проблемы, у них есть одна задача, которая принимает входные данные (или нет) и производит соответствующие выходные данные. Добавление искусственного интеллекта, физики и клавиатурных манипуляций - просто способ многого бросить вызов
—
Downgoat
@vihan AI для понга чрезвычайно прост, он просто должен следовать за значением x мяча. Даже сделать это не так сложно, просто ограничьте скорость вращения ракетки. Единственная реальная проблема с этой концепцией - взаимодействие с клавиатурой, которым можно управлять на разумном разнообразии языков. Краткое изложение, однако, довольно расплывчато и открыто (учитывая, что мы здесь сторонники однозначности и справедливости), и огромное количество бонусов не помогает этому.
—
Уровень Река Сент
релевантный: meta.codegolf.stackexchange.com/q/5521/15599
—
Уровень Река Сент
Взаимодействие с клавиатурой должно было быть решено и в (Ре) Реализации Тетриса , но это не уменьшило популярность задачи. (Да, я знаю, что на самом деле это был конкурс популярности , это не так.) Единственное, что меня лично беспокоит, так это количество бонусов. Но, конечно, не должно быть на мой вкус.
—
manatwork