아씨 퐁
문제는 가능한 짧은 코드로 ASCII 문자로 된 고전 게임 "퐁"을 재현하는 것입니다.
요구 사항 / 사양
- "화면"은 45x25 자 여야합니다.
- 공백은 실제로 공백이어야합니다.
- 패들은 9 등호
=========
여야합니다. 가장 맨 위와 맨 아래 행에 있어야합니다. ). - 공은 소문자 또는 대문자
o
이거나 0 일 수 있습니다. - 플레이어의 패들을 한 번에 한두 문자 씩 좌우로 움직이기 위해 어떤 종류의 두 개의 입력 버튼 (사용자가 입력에 문자를 표시하는 키를 눌러도 괜찮습니다).
- 패 들이나 벽에 부딪 칠 때 공은 적절한 각도로 튀어 나와야합니다 (힌트 : x 또는 y 차이 값 무시).
- 점수는 출력 어딘가에 표시되어야합니다. 점수는 플레이어가 공을 성공적으로 치는 횟수입니다.
- 공이 플레이어의 패들을 그리면 프로그램을 종료하십시오.
- 어떤 종류의 AI 가 있어야합니다 (AI의 패들이 공의 x 값과 일치하더라도).
- 공은 수직 또는 수평으로 직선으로 이동할 수 없습니다.
시작 화면 / 첫 번째 프레임은 다음과 같아야합니다.
=========
o
=========
score: 0
스코어링 이것은 code-golf 이므로 가장 짧은 코드가 승리합니다. 그러나 캐릭터 수를 줄이려면 몇 가지 보너스가 있습니다.
- -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, 물리 구현. 본격적인 응용 프로그램과 거의 같습니다. 다른 도전 과제를 살펴보면 하나의 작업이 입력을 받거나받지 않고 관련 출력을 생성합니다. AI, 물리 및 키보드 knteraction 추가는 도전을위한 많은 방법입니다.
—
Downgoat
@vihan pong의 AI는 매우 간단합니다. 공의 x 값을 따라야합니다. 이길 수 있도록 만드는 것조차 그렇게 어렵지는 않습니다. 패들 속도를 제한하십시오. 이 개념의 유일한 진짜 문제는 키보드 인터랙션인데, 이는 합리적인 다양한 언어로 관리 될 수 있습니다. 그러나 브리핑은 모호하고 개방적이며 (여기서는 우리가 모호하지 않고 공평 함을 유지하는 사람들에게 주어짐), 다양한 보너스가 도움이되지 않습니다.
—
Level River St
(Re) Iteementinging Tetris 에서도 키보드 상호 작용을 해결해야 했지만 작업의 인기를 떨어 뜨리지 않았습니다. (그렇습니다, 그것은 실제로 인기있는 경연 대회였습니다 , 이것은 아닙니다.) 개인적으로 혼란스러워하는 것은 보너스의 양입니다. 그러나 확실히 내 취향에 달하지 않아도됩니다.
—
manatwork