乒乓球
挑战在于以尽可能短的代码重新创建ASCII字符的经典游戏“ pong”。
要求/规格
- “屏幕”应为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
好吧,至少有人可以解释为什么他们对此表示反对吗?我真的很好奇,因为我认为这会很有趣,但是我没有太多经验。
—
Eric Vincent
可以打印出ASCII内容,但是通过键盘交互,我们必须构建一个完整的应用程序。由于许多语言不支持I / O,因此这类挑战不那么受欢迎。实现人工智能,物理。几乎像一个完整的应用程序。如果您看一下其他挑战,那么他们的一项任务就是接受(或不接受)输入并产生相关的输出。添加AI,物理和键盘互动只是挑战的
—
绝大部分
@vihan乒乓球的AI非常简单,它只需要遵循球的x值即可。即使使其可打也并不难,只需限制桨的速度即可。这个概念唯一真正的问题是键盘交互,可以用多种语言进行管理。然而,这份简报是相当模糊和开放的(考虑到我们对这里的明确性和公平性持坚决态度),而大量的奖金并没有帮助。
—
级圣河
键盘交互也必须在(重新)实现俄罗斯方块中解决,但这并没有减少任务的普及程度。(是的,我知道,那实际上是流行竞赛,不是。)我个人唯一感到不安的是奖金数额。但是当然不必取决于我的口味。
—
manatwork