Phái ca
Thách thức là tái tạo lại trò chơi "pong" cổ điển trong các ký tự ASCII theo mã ngắn nhất có thể.
Yêu cầu / thông số kỹ thuật
- "Màn hình" phải là 45x25 ký tự.
- Không gian màu trắng nên thực sự là không gian màu trắng.
- Các mái chèo phải là 9 dấu bằng:
=========
và nên ở trên các hàng trên cùng và dưới cùng (Tôi biết bản gốc được chơi song song thay vì từ trên xuống dưới, nhưng tôi nghĩ cách này hiệu quả hơn với ascii pong ). - Bóng có thể là chữ thường hoặc chữ thường
o
hoặc số không. - Hai nút đầu vào thuộc bất kỳ loại nào (cũng tốt nếu người dùng nhấn một phím làm cho một chữ cái hiển thị trong đầu vào, điều đó cũng tốt) để di chuyển mái chèo của người chơi sang trái và phải một hoặc hai ký tự cùng một lúc.
- Quả bóng cần ricochet ở góc thích hợp khi đánh vào mái chèo hoặc tường (gợi ý: phủ định giá trị chênh lệch x hoặc y).
- Điểm số sẽ được hiển thị ở đâu đó trong đầu ra. Điểm số là số lần người chơi đánh bóng thành công.
- Nếu bóng trượt mái chèo của người chơi, hãy chấm dứt chương trình.
- Cần có một số loại AI (ngay cả khi mái chèo của AI chỉ khớp với giá trị x của quả bóng).
- Quả bóng không thể đi theo một đường thẳng theo chiều dọc hoặc chiều ngang.
Màn hình bắt đầu / khung hình đầu tiên sẽ trông giống như thế này:
=========
o
=========
score: 0
Ghi điểm Đây là môn đánh gôn , vì vậy đoạn mã ngắn nhất sẽ thắng ... tuy nhiên, có một số phần thưởng để giảm số lượng nhân vật của bạn:
- -30 ký tự: Thay đổi quỹ đạo của quả bóng tùy thuộc vào vị trí nó chạm vào mái chèo
- -10 nhân vật: Làm cho trò chơi tăng tốc theo thời gian
- -20 ký tự: Làm cho AI có thể đánh bại
- -20 nhân vật: Tránh mọi tình huống mà người chơi đứng yên và trò chơi tiếp diễn mãi mà không thắng hay thua (gây ra bởi một số quỹ đạo và mô hình AI nhất định)
- -20 ký tự: Làm cho quả bóng bắt đầu chuyển động theo một quỹ đạo ngẫu nhiên (bán)
- -25 ký tự: Thêm tùy chọn đặt lại
Dưới đây là một ví dụ không chơi gôn không có tiền thưởng trong 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>
Hãy để cuộc chơi bắt đầu!