पोंग का ASCII खेल


10

अससी पोंग

कम से कम संभव कोड में ASCII वर्णों में क्लासिक गेम "पोंग" को फिर से बनाना चुनौती है।

आवश्यकताओं / विनिर्देशों

  • "स्क्रीन" 45x25 अक्षर का होना चाहिए।
  • व्हाइट स्पेस वास्तव में व्हाइट स्पेस होना चाहिए।
  • पैडल्स में 9 बराबर चिन्ह =========होने चाहिए : और सबसे ऊपर और सबसे नीचे वाली पंक्तियों पर होना चाहिए (मुझे पता है कि मूल को टॉप-टू-बॉटम के बजाय साइड-टू-साइड खेला जाता है, लेकिन मुझे लगता है कि यह एससीआई पॉन्ग के लिए बेहतर काम करता है )।
  • गेंद कम या ऊपरी मामला oया शून्य हो सकती है।
  • किसी भी तरह के दो इनपुट बटन (यह ठीक है अगर उपयोगकर्ता एक कुंजी दबाता है जो खिलाड़ी के पैडल को एक बार में बाएं और दाएं एक या दो वर्ण को स्थानांतरित करने के लिए इनपुट में एक पत्र दिखाता है, जो ठीक है, भी है)।
  • गेंद को पैडल या दीवार से टकराने पर उचित कोण पर रिकोचैट करने की आवश्यकता होती है (संकेत: एक्स या वाई अंतर को नकारना)।
  • स्कोर को आउटपुट में कहीं प्रदर्शित किया जाना चाहिए। खिलाड़ी कितनी बार गेंद को सफलतापूर्वक हिट करता है।
  • यदि गेंद खिलाड़ी के पैडल को याद करती है, तो कार्यक्रम समाप्त करें।
  • एआई के कुछ प्रकार होने चाहिए (भले ही एआई का पैडल गेंद के एक्स मूल्य से मेल खाता हो)।
  • गेंद सीधी या क्षैतिज रूप से सीधी रेखा में नहीं जा सकती।

स्टार्ट स्क्रीन / पहला फ्रेम कुछ इस तरह दिखना चाहिए:

                  =========                  











                      o                      











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

स्कोरिंग यह , इसलिए सबसे छोटा कोड जीतता है ... हालांकि, आपके चरित्र की संख्या को कम करने के लिए कुछ बोनस हैं:

  • -30 अक्षर: पैडल पर हिट करने के आधार पर गेंद का प्रक्षेपवक्र बदलें
  • -10 अक्षर: समय के साथ खेल की गति बनाएं
  • -20 अक्षर: ऐ को हरा दें
  • -20 अक्षर: किसी भी स्थिति से बचें जहां खिलाड़ी स्थिर रहता है और खेल हमेशा के लिए बिना जीते या हार जाता है (कुछ विशेषणों और AI पैटर्न के कारण)
  • -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 का समर्थन नहीं करती हैं। एक AI, भौतिकी को लागू करना। लगभग पूर्ण पैमाने के आवेदन की तरह। यदि आप अन्य चुनौतियों पर एक नज़र डालते हैं, तो उनके पास एक कार्य है जो एक इनपुट लेता है (या नहीं) और एक प्रासंगिक आउटपुट का उत्पादन करता है। एक AI, भौतिकी और कीबोर्ड को जोड़ना एक चुनौती के लिए बहुत कुछ है
डाउनगोट

1
@ पांग के लिए एआई बेहद सरल है, इसे सिर्फ गेंद के एक्स मान का पालन करना है। यहां तक ​​कि इसे हरा-भरा बनाना भी उतना मुश्किल नहीं है, बस स्पीड ओड पैडल को सीमित करें। अवधारणा के साथ एकमात्र वास्तविक मुद्दा कीबोर्ड इंटरैक्शन है, जिसे उचित भाषाओं में प्रबंधित किया जा सकता है। संक्षिप्त हालांकि, अस्पष्ट और खुला है (यह देखते हुए कि हम निष्पक्षता और यहां निष्पक्षता के लिए स्टिकर हैं), और बोनस की विशाल सरणी इसकी मदद नहीं करती है।
लेवल रिवर सेंट


2
कीबोर्ड इंटरैक्शन को टेट्रिस को लागू करने (री) में हल करना था , लेकिन इससे कार्य की लोकप्रियता कम नहीं हुई। (हां, मुझे पता है, यह वास्तव में लोकप्रियता-प्रतियोगिता थी , यह नहीं है।) केवल एक चीज जो मुझे व्यक्तिगत रूप से परेशान करती है, वह है बोनस की राशि। लेकिन निश्चित रूप से मेरे स्वाद तक नहीं है।
manatwork

जवाबों:


4

पर्ल, 760 611 592 535 515 (640-30-10-20-20-20-25)

सभी बोनस सामान के साथ एक कंसोल समाधान।
यह एएनएसआई से बचने वाले कोड (\ e [...) को समझने वाले किसी भी टर्मिनल पर काम करना चाहिए। साइबरविन पर परीक्षण किया गया।

कीबोर्ड नियंत्रण:
वाम: 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] [६] का उपयोग कर सकते हैं L$k<=>5 if$k=ReadKey -1;
डोम हेस्टिंग्स

1
यह भी लगता है कि आप कुछ को बदल सकते हैं अगर पोस्टफिक्स ifचेक के साथ ब्लॉक करें या कुछ और बचत के लिए टर्नरी के साथ बदलें, लेकिन यह नेस्टिंग के साथ मुश्किल साबित हो सकता है ... आपके पास एक और ब्लॉक है $d--if$d>6जिसे आप $d-=$d>62-बाइट की बचत के लिए बदल सकते हैं जो हो सकता है कि कुछ और जगहों पर भी काम किया जाए और ;$p=H.'='x9 .$"इसके बजाय एक और छोटी बचत की जाए $p="H========= "। आशा है कि इनमें से कुछ उपयोगी हैं!
डोम हेस्टिंग्स 12

1
धन्यवाद, खुशी है कि आप इसे पसंद करते हैं। आपके सुझावों ने 50 बाइट्स के साथ इसे और नीचे लाने में मदद की! उस चाल के साथ दुष्ट है। $ D - = $ d> 6 चाल इतनी अजीब लग रही थी। मुझे यह भी पता चला कि जब "$ aH" जैसी किसी चीज़ को प्रिंट करना एक समस्या है, तो यह "$ {a} H" की तरह काम करता है। :)
LukStorms

1
आह बिल्कुल! गैर- $}वर्णनात्मक चर नाम ( या कुछ) का उपयोग करते हुए या नंगे पासवर्ड ( $a.H) का उपयोग करते हुए आस -पास के कुछ तरीके , सुनिश्चित नहीं हैं कि यह इस मामले में आपकी मदद करेगा या नहीं। मैंने जो कुछ नोटिस किया, वह यह है sub P कि यदि आपके पास केवल एक तर्क है, तो आप print"\e[@_"इसके बजाय हो सकते हैं.pop क्योंकि चिंता करने के लिए एक क्षेत्र विभाजक नहीं होगा। इसके अलावा, यदि आप अक्षरों के स्थान पर numpad का उपयोग कर रहे हैं, तो आपको उपयोग करने की आवश्यकता नहीं है ord, जैसा $kकि आप 4या इसके बजाय 6कर सकते हैं 5<=>$k
डोम हेस्टिंग्स

1
एक बार फिर धन्यवाद। सोचा नहीं था कि पर्ल उस O_o जैसे वेरिएबल को स्वीकार करेगा। लेकिन यह काम करता है और कुछ बाइट्स को इसके द्वारा बचाया गया था। लेकिन एक $ का उपयोग करने की कोशिश मत करो! चर। अजीब सामान तब होता है।
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 बोनस के लिए


हम्म, यह मुझे बहुत गोल्फ नहीं दिखता है। आप अभी भी दो अक्षर वाले चर नामों से छुटकारा पा सकते हैं, कुछ &&टोकन के लिए विकल्प चुन सकते हैं &, बहुत सारे ;टोकन को समाप्त कर सकते हैं , अनावश्यक रिक्त स्थान के बाद {छुटकारा पा सकते हैं और यहां तक ​​कि HTML में कुछ उद्धरण वर्णों से छुटकारा पा सकते हैं। और शायद बहुत अधिक, यहां तक ​​कि। यह सिर्फ एक अनुमान है, लेकिन आप UglifyJS से बचने और हाथ से छोटा करने की कोशिश करना चाह सकते हैं। :)
चिरू

6
काफी सरल इस तरह से पोस्ट किया। पाठक को कुंजी हैंडलिंग के लिए 663 वर्ण कोड की खोज करनी है, फिर संभवतः एसटीएफडब्ल्यू यह पता लगाने के लिए कि किन कुंजी में कोड 37 और 39 हैं। (वैसे भी, नवीनतम फ़ायरफ़ॉक्स मैं उपयोग में बाएँ और दाएँ तीर कुंजी पर कोई प्रतिक्रिया नहीं है।) यह परीक्षण करने में सक्षम नहीं होने के कारण मैं कभी भी यह नहीं पता लगा पाऊंगा कि आपके द्वारा उपलब्ध 3 में से किस बोनस ने -20 कमाया है।
manatwork
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.