এএসসিআইআই গেম অফ পং


10

আসকি পং

চ্যালেঞ্জটি হ'ল সম্ভব সংক্ষিপ্ততম কোডটিতে ASCII অক্ষরগুলিতে ক্লাসিক গেম "পং" পুনরায় তৈরি করা।

আবশ্যকতা / নির্দিষ্টকরণের

  • "স্ক্রীন" 45x25 টি অক্ষর হওয়া উচিত।
  • সাদা স্থানটি আসলে সাদা স্থান হওয়া উচিত।
  • প্যাডেলগুলি 9 টি সমান চিহ্ন হতে হবে: =========এবং শীর্ষে এবং নীচের দিকে সর্বাধিক সারিগুলিতে হওয়া উচিত (আমি জানি যে মূলটি টু টু-ডাউনের পরিবর্তে পাশের পাশ থেকে খেলেছে, তবে আমি মনে করি এটি এসকি পংয়ের জন্য আরও ভাল কাজ করে )।
  • বলটি লোয়ার বা আপার কেস oবা শূন্য হতে পারে।
  • যেকোন ধরণের দুটি ইনপুট বোতাম (যদি ব্যবহারকারী কোনও অক্ষরে ইনপুটটিতে একটি চিঠি প্রদর্শিত হয় তবে এটি ঠিক আছে) প্লেয়ারের প্যাডেল বাম এবং ডান এক বা দুটি অক্ষর একবারে সরিয়ে নিতে।
  • প্যাডেল বা দেওয়াল মারার পরে বলটিকে উপযুক্ত কোণে রিোকোশেট করতে হবে (ইঙ্গিত: x বা y পার্থক্যের মানটি উপেক্ষা করুন)।
  • স্কোর আউটপুট কোথাও প্রদর্শিত হবে। স্কোরটি কতবার সফলভাবে বলটি হিট করে।
  • যদি বলটি প্লেয়ারের প্যাডেলটি মিস করে তবে প্রোগ্রামটি শেষ করুন।
  • কিছু ধরণের এআই থাকতে হবে (এমনকি এআই এর প্যাডেলটি কেবল বলের এক্স মানের সাথে মেলে)।
  • বলটি সরলরেখায় উল্লম্ব বা অনুভূমিকভাবে ভ্রমণ করতে পারে না।

প্রারম্ভের স্ক্রিন / প্রথম ফ্রেমের কিছু দেখতে হবে:

                  =========                  











                      o                      











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

স্কোরিং এটি , তাই সংক্ষিপ্ততম কোডটি জয়ী হয় ... তবে আপনার চরিত্রের গণনা হ্রাস করার জন্য কিছু বোনাস রয়েছে:

  • -30 অক্ষর: প্যাডেল যেখানে আঘাত করে তার উপর নির্ভর করে বলের ট্রাজেক্টোরি পরিবর্তন করুন
  • -10 অক্ষর: সময়ের সাথে সাথে গতির গতি বাড়ান
  • -20 টি অক্ষর: এআইকে বীটযোগ্য করে তুলুন
  • -২০ অক্ষর: খেলোয়াড় স্থির থাকে এমন কোনও পরিস্থিতি এড়িয়ে চলুন এবং জয়টি না হারাতে বা খেলাটি চিরতরে চলতে থাকবে (নির্দিষ্ট ট্রাজেক্টোরিজ এবং এআই নিদর্শনগুলির কারণে)
  • -20 টি অক্ষর: বলটিকে একটি (আধা-) এলোমেলো ট্র্যাজেক্টরিতে চলতে শুরু করুন
  • -25 অক্ষর: একটি রিসেট বিকল্প যুক্ত করুন

এখানে জাভাস্ক্রিপ্টে কোনও বোনাসবিহীন একটি অ-গল্ফযুক্ত উদাহরণ রয়েছে:

//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
ঠিক আছে কেউ কেউ কমপক্ষে ব্যাখ্যা করতে পারেন কেন তারা এটিকে নিম্নচালিত করেছেন? আমি প্রকৃতপক্ষে কৌতূহলী কারণ আমি ভেবেছিলাম এটি মজাদার হবে তবে আমার খুব বেশি অভিজ্ঞতা নেই।
এরিক ভিনসেন্ট

3
ASCII স্টাফগুলি প্রিন্ট করা ঠিক আছে তবে কীবোর্ড ইন্টারঅ্যাকশন সহ আমাদের একটি সম্পূর্ণ অ্যাপ্লিকেশন তৈরি করতে হবে। এই ধরণের চ্যালেঞ্জগুলি অস্বীকার করা হয় কারণ অনেক ভাষা i / o এর মতো সমর্থন করে না। একটি এআই বাস্তবায়ন, পদার্থবিজ্ঞান। প্রায় সম্পূর্ণ স্কেল অ্যাপ্লিকেশন মত। আপনি যদি অন্যান্য চ্যালেঞ্জগুলি একবার দেখুন তবে তাদের একটি কাজ রয়েছে যা একটি ইনপুট নেয় (বা না) এবং প্রাসঙ্গিক আউটপুট উত্পন্ন করে। একটি এআই, পদার্থবিজ্ঞান এবং কীবোর্ড সূচনা যোগ করা একটি চ্যালেঞ্জের পক্ষে অনেকটা সহজ উপায়
ডাউনগোট

1
প্যাং এর জন্য এভিআই এভিয়ান অত্যন্ত সহজ, এটি কেবল বলের এক্স মানটি অনুসরণ করতে পারে। এমনকি এটিকে বীটযোগ্য করে তোলাও শক্ত নয়, কেবল প্যাডেলের গতি সীমিত করুন। ধারণার একমাত্র আসল সমস্যাটি হ'ল কীবোর্ড ইন্টারঅ্যাকশন, যা যুক্তিসঙ্গত বিভিন্ন ভাষায় পরিচালনা করা যায়। সংক্ষিপ্তটি বরং অস্পষ্ট এবং উন্মুক্ত (প্রদত্ত যে আমরা এখানে চারপাশে অস্পষ্টতা এবং ন্যায্যতার জন্য স্টিকারার হয়েছি), এবং বোনাসের বিস্তৃত অ্যারে এটি সহায়তা করে না।
স্তর নদী সেন্ট


2
কীবোর্ড কথোপকথনটি (পুনরায়) টেট্রিস বাস্তবায়নেও সমাধান করতে হয়েছিল, তবে এটি কার্যটির জনপ্রিয়তা হ্রাস করতে পারেনি। (হ্যাঁ, আমি জানি, এটি আসলে জনপ্রিয়তা-প্রতিযোগিতা ছিল , এটি নয়)) ব্যক্তিগতভাবে আমি যে বিষয়টিকে বিরক্তিকর মনে করি তা হ'ল বোনাসের পরিমাণ। তবে অবশ্যই আমার স্বাদ অনুযায়ী চলতে হবে না।
manatwork

উত্তর:


4

পার্ল, 760 611 592 535 515 (640-30-10-20-20-20-25)

সমস্ত বোনাস স্টাফ সহ একটি কনসোল সমাধান।
এটি এমন কোনও টার্মিনালটিতে কাজ করা উচিত যা এএনএসআই এস্কেপ কোডগুলি বোঝে ([ই [...)। সাইগউইন পরীক্ষিত।

কীবোর্ড নিয়ন্ত্রণ:
বাম: 4
ডান: 6
রিসেট: 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
এই লুক, এই ভালবাসা! ভেবেছি আমি আরও কয়েকটি চরিত্র সঞ্চয় করতে সক্ষম হতে পারে এমন কয়েকটি উপায়ে ভাগ করে নিচ্ছি ... আপনি যেহেতু print4 বারের বেশি ব্যবহার করছেন তাই একটি নতুন সাব সেট আপ করা এবং এটি কল করা সস্তা হওয়া উচিত sub p{print@_}। আপনি কিছু মনে না করেন অন্যান্য কী আপনি যাদের নির্দিষ্ট সেইসাথে ব্যবহৃত হচ্ছে, আপনি প্রতিস্থাপন করতে পারেন if(defined($k=ReadKey(-1))){L(-1)if's'eq$k;L(1)if'd'eq$k;I,if'r'eq$k}সঙ্গে L 114<=>ord$k if$k=ReadKey -1;। এটি কেবল <r: -1, r: 0,> r: 1 রূপান্তর করে যা আপনার পরে যা হতে পারে তা নাও হতে পারে। আপনি এই সঙ্গে খুশি হন, তাহলে আপনি ব্যবহার করতে পারে [4] [5] এর সাথে কী হিসেবে [6]: L$k<=>5 if$k=ReadKey -1;
ডম হেস্টিংস

1
এছাড়াও দেখে মনে হচ্ছে আপনি যদি কিছু পোস্ট ফিক্স ifচেক দিয়ে ব্লকগুলি প্রতিস্থাপন করতে পারেন বা আরও কিছু সঞ্চয়ের জন্য টের্নারি প্রতিস্থাপন করতে পারেন তবে এটি নীড়ের সাথে জটিল প্রমাণিত হতে পারে ... আপনার আরও একটি ব্লক রয়েছে $d--if$d>6যা আপনি $d-=$d>62-বাইট সংরক্ষণের জন্য পরিবর্তন করতে পারেন আরও কয়েকটি জায়গায় কাজ করতে পারে এবং এর ;$p=H.'='x9 .$"পরিবর্তে অন্য একটি ছোট সঞ্চয় হয় $p="H========= "। আশা করি এর কয়েকটি কার্যকর হবে!
ডম হেস্টিংস

1
ধন্যবাদ, আপনি এটি পছন্দ করেছেন যে খুশি। আপনার টিপস 50 বাইট দিয়ে আরও গল্ফ করতে সাহায্য করেছে! আদেশের সাথে সেই কৌশলটি দুষ্ট is $ D - = $ d> 6 টি কৌশলটি এত অদ্ভুত লাগছিল। আমি এটিও আবিষ্কার করেছি যে "$এএইচ" এর মতো কোনও কিছু মুদ্রণ করা যখন সমস্যা হয় তখন "$ {a} H" বাশের মতো কাজ করে। :)
লুকস্টর্মস

1
ওহ হ্যাঁ! বর্ণমালাবিহীন পরিবর্তনশীল নামগুলি ( $}বা কিছু) ব্যবহার করে বা বেনওয়ার্ডস ( $a.H) ব্যবহার করে বেশ কয়েকটি উপায় , নিশ্চিত হন না যে এটি আপনাকে এই ক্ষেত্রে সহায়তা করবে কিনা। আমি কিছু লক্ষ্য করেছি, এটির মধ্যে sub P যদি কেবলমাত্র আপনার কাছে একটি যুক্তি থাকে, তবে এটির print"\e[@_"পরিবর্তে আপনি .popকোনও ফিল্ড বিভাজনকারী থাকবেন না এমন জায়গায় আপনি থাকতে পারেন । এছাড়াও, আপনি যদি অক্ষরের পরিবর্তে নামপ্যাড ব্যবহার করেন তবে আপনার ব্যবহারের দরকার নেই ord, যেমনটি $kহবে 4বা এর পরিবর্তে আপনিও 6করতে পারেন 5<=>$k
ডম হেস্টিংস

1
আবার ধন্যবাদ. ভাবেনি পার্ল ও ওও এর মতো ভেরিয়েবল গ্রহণ করবে। তবে এটি কাজ করে এবং কয়েকটি বাইট তার দ্বারা পুনরুদ্ধার করা হয়েছিল। তবে একটি using ব্যবহার করার চেষ্টা করবেন না! পরিবর্তনশীল। অদ্ভুত জিনিস তখন ঘটে।
LukStorms

1

জাভাস্ক্রিপ্ট, 618 বাইট + এইচটিএমএল, 99 বাইট

ঠিক আছে এখানে আমার গল্ফড জাভাস্ক্রিপ্টের উত্তরটি অন্য ভাষায় সম্ভব না হলেও:

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 এবং -25 বোনাসের জন্য


হুঁ, এটা আমার কাছে খুব গল্ফ লাগছে না। আপনি এখনও দ্বি-অক্ষরের ভেরিয়েবল নামগুলি থেকে মুক্তি পেতে পারেন, কয়েকটি &&টোকেনের বিকল্প রাখতে পারেন, &প্রচুর ;টোকেন নির্মূল করতে পারেন, অপ্রয়োজনীয় স্পেসগুলি {পরিত্রাণ পেতে পারেন এমনকি এইচটিএমএলের কিছু উদ্ধৃতি অক্ষর থেকেও মুক্তি পেতে পারেন। এমনকি সম্ভবত আরও অনেক কিছু। এটি কেবল অনুমান, তবে আপনি ইউগ্লিফজেজেএস এড়ানোর চেষ্টা করতে পারেন এবং হাতে হাতে ছোট করতে পারেন। :)
চিরু

6
বেশ ক্রিপ্টিক এইভাবে পোস্ট করেছে। কীটি পরিচালনা করার জন্য পাঠককে 6363৩ টি অক্ষরের কোডটি অনুসন্ধান করতে হবে, তবে সম্ভবত কী কীগুলির কোড ৩ 37 এবং ৩৯ রয়েছে তা নির্ধারণের জন্য এসটিএফডাব্লু use এটি পরীক্ষা করতে সক্ষম না হওয়ায় আমি কখনই খুঁজে পাব না যে আপনি যে -২০ টি উপলভ্য বোনাস -20 অর্জন করেছেন তার মধ্যে।
manatwork
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.