Trò chơi ASCII của Pông


10

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 ohoặ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à , 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!


3
Được rồi ít nhất ai đó có thể giải thích tại sao họ đánh giá thấp điều này? Tôi thực sự tò mò vì tôi nghĩ điều này sẽ rất vui nhưng tôi không có nhiều kinh nghiệm.
Eric Vincent

3
In ra công cụ ASCII là được nhưng với tương tác bàn phím, chúng tôi sẽ phải xây dựng toàn bộ ứng dụng. Những loại thách thức này được tán thành vì nhiều ngôn ngữ không hỗ trợ i / o như thế. Thực hiện một AI, vật lý. Gần giống như một ứng dụng quy mô đầy đủ. Nếu bạn xem xét các thách thức khác, họ có một nhiệm vụ lấy đầu vào (hoặc không) và tạo ra đầu ra có liên quan. Thêm một AI, vật lý và sự phá hủy bàn phím chỉ là cách để thử thách
Downgoat

1
@vihan AI cho pong cực kỳ đơn giản, nó chỉ phải theo giá trị x của quả bóng. Ngay cả làm cho nó có thể đánh bại cũng không khó lắm, chỉ cần giới hạn tốc độ của mái chèo. Vấn đề thực sự duy nhất với khái niệm này là sự tương tác bàn phím, có thể được quản lý bằng nhiều ngôn ngữ hợp lý. Tuy nhiên, bản tóm tắt khá mơ hồ và cởi mở (cho rằng chúng tôi là những người gắn bó vì sự không rõ ràng và công bằng ở đây), và rất nhiều phần thưởng không giúp được điều đó.
Cấp sông St


2
Tương tác bàn phím cũng phải được giải quyết trong (Re) Thực hiện Tetris , nhưng điều đó không làm giảm sự phổ biến của nhiệm vụ. (Vâng, tôi biết, đó thực sự là cuộc thi về sự nổi tiếng , đây không phải là.) Điều duy nhất cá nhân tôi thấy đáng lo ngại, là số tiền thưởng. Nhưng chắc chắn không phải theo sở thích của tôi.
manatwork

Câu trả lời:


4

Perl, 760 611 592 535 515 (640-30-10-20-20-20-25)

Một giải pháp giao diện điều khiển với tất cả các công cụ thưởng.
Nó nên hoạt động trên bất kỳ thiết bị đầu cuối nào hiểu được mã thoát ANSI (\ e [...). Đã thử nghiệm trên cygwin.

Điều khiển bàn phím:
Trái: 4
Phải: 6
Đặt lại: 8

use Term::ReadKey;ReadMode 4;END{ReadMode 0}$|++;$a=$d=45;$b=25;$h=1;$j=$l=17;$p='='x9;sub P{print"\e[@_"}sub L{$%=$l+pop;if($%>0&$%+7<$a){P"25H\e[K\e[25;$%H$p ";$l=$%}}sub U{$%=$j+pop;if($%>0&$%+7<$a){P"1H\e[K\e[1;$%H$p ";$j=$%}}sub I{$}=int rand 42;$g=8;$i=1;P"2J\ec";L}I;while(1){if($c>0){$c--}else{$c=98;$d-=$d>6}if($c%9==0){U -1if$}<$j+4;U 1if$}>$j+6};if($c%$d==0){$m=$}+$h;$n=$g+$i;$h*=-1if$m<1||$m>$a;if($n>24&$}>=$l&$}<$l+9){$i*=-1;$h=-1if$m<$l+5;$h=1if$m>$l+5;$s++}if($n<2&$}>=$j&$}<$j+9){$i*=-1}P"$g;1H\e[K";$}+=$h;$g+=$i;P"$g;$}HO"}if($k=ReadKey -1){I,if$k>6;L$k<=>5}P"26;0Hscore:$s";exit,if$g>=$b;select($\,$\,$\,0.01);I,if$g<2}

1
Này Luk, yêu cái này! Tôi nghĩ rằng tôi sẽ chia sẻ một vài cách để bạn có thể lưu thêm một số ký tự ... Vì bạn đang sử dụng printhơn 4 lần, nên sẽ rẻ hơn khi thiết lập một phụ mới và gọi đó sub p{print@_}. Nếu bạn không nhớ các phím khác đang được sử dụng cũng như các phím bạn cụ thể, bạn có thể thay thế if(defined($k=ReadKey(-1))){L(-1)if's'eq$k;L(1)if'd'eq$k;I,if'r'eq$k}bằng L 114<=>ord$k if$k=ReadKey -1;. Điều này chỉ chuyển đổi <r: -1, r: 0,> r: 1 có thể không phải là những gì bạn đang theo đuổi. Nếu bạn hài lòng với điều này, bạn có thể sử dụng [4] [5] [6] làm các phím với : L$k<=>5 if$k=ReadKey -1;.
Dom Hastings

1
Cũng có vẻ như bạn có thể thay thế một vài khối nếu ifkiểm tra hậu tố hoặc thay thế bằng ternary để tiết kiệm hơn, nhưng điều đó có thể gây khó khăn cho việc lồng nhau ... Bạn có một khối khác $d--if$d>6mà bạn có thể thay đổi thành $d-=$d>6tiết kiệm 2 byte có thể hoạt động ở một vài nơi nữa và ;$p=H.'='x9 .$"thay vào đó là một khoản tiết kiệm nhỏ khác $p="H========= ". Hy vọng một số trong số này là hữu ích!
Dom Hastings

1
Cảm ơn, vui vì bạn thích nó. Lời khuyên của bạn đã giúp đánh gôn xuống hơn nữa với 50 byte! Thủ đoạn đó với mệnh lệnh là xấu xa. Thủ thuật $ d - = $ d> 6 trông rất kỳ lạ. Tôi cũng phát hiện ra rằng khi in một cái gì đó như "$ aH" là một vấn đề, thì "$ {a} H" hoạt động giống như trong bash. :)
LukStorms

1
Ồ thật tuyệt vời! Một vài cách xung quanh việc sử dụng tên biến không phải là chữ cái ( $}hoặc một cái gì đó) hoặc sử dụng barewords ( $a.H), không chắc điều đó có giúp bạn trong trường hợp này hay không. Một cái gì đó tôi đã nhận thấy, là sub P nếu bạn chỉ có một đối số với nó, bạn có thể có print"\e[@_"thay vì vì .popsẽ không có một dấu tách trường để lo lắng. Ngoài ra, nếu bạn đang sử dụng numpad thay vì chữ cái, bạn không cần phải sử dụng ord, như $ksẽ là 4hoặc 6vì vậy bạn có thể làm 5<=>$kđể thay thế.
Dom Hastings

1
Cảm ơn một lần nữa. Không nghĩ rằng perl sẽ chấp nhận các biến như O_o đó. Nhưng nó không hoạt động và một vài byte đã được giải quyết bởi điều đó. Nhưng đừng thử sử dụng $! Biến đổi. Chuyện lạ xảy ra rồi.
LukStorms

1

JavaScript, 618 byte + HTML, 99 byte

Vâng, đây là câu trả lời JavaScript được đánh gôn của tôi ngay cả khi nó không khả thi trong các ngôn ngữ khác:

var x,y,xd,yd,p,o,s,n,i,j,c,k;function a(){x=22;y=12;xd=Math.random()<.5?-1:1;yd=1;p=o=18;s=0;n=setInterval(function(){x+=xd;y+=yd;o=x-4;if(x<=0||x>=44)xd=-xd;if(y==1){if(x>=o&&x<o+9)yd=-yd;else{clearInterval(n);b.innerHTML="You Win!<br>Score: "+s;return}}else if(y==23){if(x>=p&&x<p+9){yd=-yd;s++;}else{clearInterval(n);b.innerHTML="You Lose!<br>Score: "+s;return}}d();},100);}function d(){b.innerHTML="";for(i=0;i<25;i++){for(j=0;j<45;j++){c=" ";if(j==x&&i==y)c="o"; if(i==0&&j>=o&&j<o+9)c="=";if(i==24&&j>=p&&j<p+9)c="=";b.innerHTML+=c;} b.innerHTML+="<br>";}b.innerHTML+="score: "+s;}onkeydown=function(){ k=window.event.keyCode;if(k==37)p-=2;if(k==39)p+=2;};
<button onclick="a()">start</button><div id="b"style="font-family:monospace;white-space:pre"></div>

-20 và -25 cho tiền thưởng


Hừm, cái này không giống tôi lắm. Bạn vẫn có thể loại bỏ các tên biến có hai chữ cái, thay thế một vài &&mã thông báo &, loại bỏ nhiều ;mã thông báo, loại bỏ các khoảng trống không cần thiết sau đó {và thậm chí loại bỏ một số ký tự trích dẫn trong HTML. Và có lẽ nhiều hơn nữa, thậm chí. Đây chỉ là một phỏng đoán, nhưng bạn có thể muốn tránh UglifyJS và thu nhỏ bằng tay. :)
Chiru

6
Khá khó hiểu được đăng theo cách này. Người đọc phải tìm kiếm mã 663 ký tự để xử lý khóa, sau đó có thể là STFW để tìm ra khóa nào có mã 37 và 39. (Dù sao, không có phản ứng nào đối với phím mũi tên trái và phải trong Firefox mới nhất tôi sử dụng.) không thể kiểm tra nó, tôi sẽ không bao giờ tìm ra trong số 3 phần thưởng có sẵn mà bạn kiếm được -20.
manatwork 8/8/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.