アスキーポン
課題は、古典的なゲーム「ピンポン」を可能な限り短いコードでASCII文字で再現することです。
要件/仕様
- 「画面」は45x25文字にする必要があります。
- 空白は実際には空白でなければなりません。
- パドルは9つの等号
=========である必要があります。また、一番上と一番下の行にある必要があります(オリジナルは上から下ではなく左右に再生されることはわかっていますが、これはアスキーポンに適しています。 )。 - ボールは、小文字、大文字、
oまたはゼロにすることができます。 - 任意の種類の2つの入力ボタン(ユーザーが入力に文字を表示するキーを押しても問題ありません)は、プレーヤーのパドルを1つまたは2つのキャラクターを左右に一度に移動します。
- ボールは、パドルや壁に当たったときに適切な角度で跳ね返る必要があります(ヒント: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の実装、物理学。ほぼフルスケールのアプリケーションのようです。他の課題を見てみると、それらには、入力を受け取る(または受け取らない)1つのタスクがあり、関連する出力を生成します。AI、物理学、キーボードknteractionを追加することは、課題の大部分を
—
占めるに過ぎません
@vihanピンポンのAIは非常にシンプルで、ボールのx値を追跡するだけです。それを打ち負かすことはそれほど難しいことではなく、パドルの速度を制限するだけです。この概念の唯一の本当の問題はキーボード操作であり、これは合理的なさまざまな言語で管理できます。しかし、このブリーフはどちらかと言えばあいまいでオープンであり(ここでは、あいまいさや公平さを求める人がいるのであれば)、さまざまなボーナスがそれを助けてくれません。
—
Level River St
テトリスの(再)実装でもキーボード操作を解決する必要がありましたが、それでもタスクの人気が低下することはありませんでした。(はい、私は知っています、それは実際に人気コンテストでした、これはそうではありません。)私が個人的に気になる唯一のことは、ボーナスの額です。しかし、確かに私の好みに合わせる必要はありません。
—
manatwork 2015