Аски Понг
Задача состоит в том, чтобы воссоздать классическую игру «понг» в символах 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>
Пусть игра начнется!
Ответы:
Perl,
760 611 592 535515 (640-30-10-20-20-20-25)Консольное решение со всеми бонусами.
Он должен работать на любом терминале, который понимает управляющие коды ANSI (\ e [...). Проверено на Cygwin.
Управление с клавиатуры:
слева: 4,
справа: 6,
сброс: 8
источник
print
более 4 раз, будет дешевле установить новый саб и вызвать егоsub p{print@_}
. Если вы не возражаете против использования других ключей, а также тех, которые вы указали, вы можете заменить ихif(defined($k=ReadKey(-1))){L(-1)if's'eq$k;L(1)if'd'eq$k;I,if'r'eq$k}
наL 114<=>ord$k if$k=ReadKey -1;
. Это просто преобразует <r: -1, r: 0,> r: 1, что может быть не тем, что вы ищете. Если вы счастливы с этим, вы можете использовать [4] [5] [6] в качестве ключей с:L$k<=>5 if$k=ReadKey -1;
.if
проверки или заменить на троичную для большей экономии, но это может оказаться сложнее с вложенностью ... У вас есть другой блок,$d--if$d>6
который вы можете изменить$d-=$d>6
для 2-байтового сохранения, которое может работать и в нескольких других местах, и;$p=H.'='x9 .$"
вместо этого есть еще одна небольшая экономия$p="H========= "
. Надеюсь, что некоторые из них полезны!$}
или что-то в этом роде) или используя barewords ($a.H
), не уверен, поможет ли это вам в этом случае или нет. Что-то, что я заметил, вsub P
том, что если у вас есть только один аргумент, вы могли бы иметьprint"\e[@_"
вместо этого,.pop
поскольку не будет беспокойства по поводу разделителя полей. Кроме того, если вы используете цифровую клавиатуру вместо букв, вам не нужно использоватьord
, как$k
было бы4
или6
так вы могли бы сделать5<=>$k
вместо этого.JavaScript, 618 байт + HTML, 99 байт
Хорошо, вот мой ответ JavaScript для гольфа, даже если это невозможно на других языках:
-20 и -25 для бонусов
источник
&&
токенов&
, исключить множество;
токенов, избавиться от лишних пробелов после{
и даже избавиться от некоторых символов кавычек в HTML. И, вероятно, намного больше, даже. Это всего лишь предположение, но вы можете попытаться избежать UglifyJS и минимизировать вручную. :)