首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASCII乒乓球游戏

ASCII乒乓球游戏
EN

Code Golf用户
提问于 2015-08-06 22:22:27
回答 1查看 1.4K关注 0票数 9

Ascii

挑战是在最短的代码中重新创建ASCII字符中的经典游戏"pong“。

Requirements/specifications

  • “屏幕”应该是45x25字符。
  • 空白实际上应该是空白。
  • 划桨应该是9等号:=========,应该在最上面和底部最多的行(我知道原版是挨着打的,而不是自上而下的,但我认为这对ascii pong更有效)。
  • 球可以是小写或大写o,也可以是零。
  • 任意类型的两个输入按钮(如果用户按下一个键,使一个字母出现在输入中,这也很好),就可以一次向左和向右移动玩家的桨一个或两个字符。
  • 球在撞击桨或墙壁时需要以适当的角度弹射(提示:否定x或y差值)。
  • 分数应该显示在输出的某个地方。得分是指球员成功击中球的次数。
  • 如果球没有击中球员的桨,则终止程序。
  • 应该有某种人工智能(即使AI的桨只是匹配球的x值)。
  • 球不能垂直或水平地直线运动。

开始屏幕/第一帧应该如下所示:

代码语言:javascript
复制
                  =========                  











                      o                      











                  =========                  
score: 0

打分这是密码-高尔夫所以最短的代码赢了..。但是,有一些奖励可以减少您的角色数:

  • -30个字符:根据球击中桨的位置改变球的轨迹。
  • -10个字符:随着时间的推移,游戏速度加快
  • -20个字符:让AI战胜
  • -20个字符:避免任何玩家静止不动的情况,游戏永远不会输赢(由某些轨迹和AI模式造成)。
  • -20个字符:使球以(半)随机轨迹开始运动。
  • -25个字符:添加重置选项

下面是一个在JavaScript中没有奖金的未获得奖金的例子:

代码语言: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;
};
代码语言:javascript
复制
<body style="font-family: monospace; white-space: pre">
  
</body>

让游戏开始!

EN

回答 1

Code Golf用户

发布于 2015-08-06 23:36:49

JavaScript,618字节+ HTML,99字节

好吧,这是我金色的JavaScript答案,即使它在其他语言中不可行:

代码语言:javascript
复制
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;};
代码语言:javascript
复制
<button onclick="a()">start</button><div id="b"style="font-family:monospace;white-space:pre"></div>

-20和-25美元奖金

票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/54344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档