2048 बॉट चैलेंज


19

हम क्लोनिंग कर रहे हैं 2048 का , 2048 का विश्लेषण , लेकिन हमने इसे अभी तक क्यों नहीं खेला है? 2048 को स्वचालित रूप से खेलने के लिए 555 बाइट जावास्क्रिप्ट स्निपेट लिखें, एक घंटे के बाद का सर्वश्रेष्ठ स्कोर गिना जाएगा (नीचे स्क्रैच देखें)।

सेट अप:

गोटो 2048 और रन:

 a = new GameManager(4, KeyboardInputManager, HTMLActuator, LocalStorageManager);

a खेल को नियंत्रित करने के लिए वस्तु है।

नियम:

सेटअप के बाद आप गेम को नियंत्रित करने के लिए 555 बाइट्स की जावास्क्रिप्ट कंसोल से चला सकते हैं। खेल का स्रोत कोड यहां पाया जा सकता है (टिप्पणियों सहित)।

  • यह केवल उन चीजों को कर सकता है जो उपयोगकर्ता के लिए संभव हैं:
    • a.move(n) 4 दिशाओं में से किसी में एक महत्वपूर्ण कार्रवाई को ट्रिगर करने के लिए।
      • 0: ऊपर, 1: दाएं, 2: नीचे, 3: बायां
    • a.restart() खेल को पुनः आरंभ करने के लिए। खेल के बीच में विश्राम करने की अनुमति है।
  • खेल की स्थिति के बारे में जानकारी पाई जा सकती है a.grid.cells। यह जानकारी केवल पढ़ने के लिए है
  • किसी भी फ़ंक्शन में हुकिंग की अनुमति है, किसी भी तरह से उनके व्यवहार को बदलना (या किसी अन्य डेटा को बदलना) नहीं है
  • हर 250 मी में केवल एक बार मूविंग की अनुमति है

उदाहरण

बस शुरू करने के लिए एक बहुत ही सरल उदाहरण है। टिप्पणियों के बिना और 181 बाइट्स में प्रवेश करता है ।

//bind into new tile function and change m(ove) variable when a tile was moved
b = a.addRandomTile.bind(a);
m = !1;
a.addRandomTile = function() { m = !0; b(); };
//number of move fails
mfs = 0;
setInterval(function() {
  //set global moved tracking variable to false
  m = !1;
  a.move(Math.floor(4 * Math.random()));
  m || mfs++;
  //restart after 10 moves failed
  10 < mfs && (mfs = 0, a.restart());
}, 250);

स्कोरिंग और परिणाम

मैं एक घंटे के लिए स्निपेट सीधे चलाऊंगा और सबसे अच्छा अंक गिनूंगा। वास्तव में एक मौका है कि randombotऊपर उस तरह से जीत जाएगा, लेकिन इसे हरा करने के लिए 1 घंटा पर्याप्त होना चाहिए:

  • राजा Bottomstacker VII : 9912
  • रानी Bottomstacker V : 9216
  • राजकुमार Bottomstacker II : 7520
  • भगवान Bottom and Right : 6308
  • किसान Randombot : 1413
  • Bottomstacker IV: 12320 एक अंतराल में दो चाल चलने के लिए अयोग्य घोषित (250 मी के भीतर)

सामान्य प्रश्न

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

3
यह लगता है कि यह सिर्फ से सबसे अच्छा एल्गोरिथ्म के जावास्क्रिप्ट कार्यान्वयन के एक झुंड जा रहा है खत्म हो जाएगा यहाँ , नहीं?
जेसन सी

2
-1 ...best score after an hour will count... क्यों सिर्फ एक घंटे के लिए?
user80551

3
किसी भी मामले में, मैं सुझाव देता हूं, निष्पक्षता के नाम पर, हर उत्तर की परीक्षा चलाने के लिए यादृच्छिक संख्या जनरेटर को सीडिंग करना, और उस गिनती के रूपांतरों को खत्म करने के लिए एक कठिन (1 घंटा / 250 एमएस =) प्रति रन 14,400 चालें। अशुद्धि के लिए समय। कम से कम परिणाम कुछ अधिक दृढ़ और एक कोट के योग्य हो सकते हैं।
जेसन सी

1
750 बाइट्स या 550 बाइट्स?
पीटर टेलर

2
बहुत प्रतिबंधक। 750 बाइट्स, 1 घंटा, जावास्क्रिप्ट।
TheDoctor

जवाबों:


4

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

//bind into new tile function and change m(ove) variable when a tile was moved
b = a.addRandomTile.bind(a);
m = !1;
a.addRandomTile = function() { m = !0; b(); };
//number of move fails
mfs = 0;
c=1;
setInterval(function() {
  //set global moved tracking variable to false
  m = !1;
  a.move(c)
  c++
  if (c>3) {c=1}
  m || mfs++;
  //restart after 10 moves failed
  10 < mfs && (mfs = 0, a.restart());
}, 250);

यह मेरे द्वारा उपयोग की जाने वाली रणनीति का उपयोग करता है।

संपादित करें: अच्छा, यह सिर्फ मेरे मशीन पर लगभग 5 मिनट के बाद आपके स्कोर को हरा देता है: डी

संपादित करें: केवल एक बार के बजाय दो बार नीचे जाना भूल गया, यह वह कोड है जिसका आपको उपयोग करना चाहिए:

a = new GameManager(4, KeyboardInputManager, HTMLActuator, LocalStorageManager);
//bind into new tile function and change m(ove) variable when a tile was moved
b = a.addRandomTile.bind(a);
m = !1;
a.addRandomTile = function() { m = !0; b(); };
//number of move fails
mfs = 0;
c=1;
setInterval(function() {
  //set global moved tracking variable to false
  m = !1;
  if (c<=3) {n=c}
  else {n=2}
  a.move(n)
  c++

  if (c>4) {c=1} 
  m || mfs++;
  //restart after 10 moves failed
  10 < mfs && (mfs = 0, a.restart());
}, 250);

इसके अलावा, इसमें एक बग है जिसे यह तब शुरू होता है जब इसकी आवश्यकता नहीं होती है, लेकिन मुझे यकीन नहीं है कि इसे कैसे ठीक किया जाए। EDIT: इसका वर्तमान में 3116 (3 मिनट के बाद) का हाईस्कोर है। मुझे लगता है कि यह कहना सुरक्षित है कि यह अल्गोरिथम सिर्फ यादृच्छिक चालें करने से बेहतर है।

संपादित करें नया संस्करण:

a = new GameManager(4, KeyboardInputManager, HTMLActuator, LocalStorageManager);
//bind into new tile function and change m(ove) variable when a tile was moved
b = a.addRandomTile.bind(a);
m = !1;
a.addRandomTile = function() { m = !0; mfs=0; b(); };
//number of move fails
mfs = 0;
c=1;
setInterval(function() {
  //set global moved tracking variable to false
  m = !1;
  if (c<=3) {n=c}
  else {n=2}
  a.move(n)
  c++
  if (c>4) {c=1} 
  m || mfs++;
  //up after 5 moves
  5 < mfs && (a.move(0));
  //restart after 10 moves failed
  10 < mfs && (mfs = 0, a.restart());
}, 250);

संपादित करें: एक और नया संस्करण, यह एक ऊपर जाने के बाद सीधे नीचे जाता है।

a = new GameManager(4, KeyboardInputManager, HTMLActuator, LocalStorageManager);
//bind into new tile function and change m(ove) variable when a tile was moved
b = a.addRandomTile.bind(a);
m = !1;
a.addRandomTile = function() { m = !0; mfs=0; b(); };
//number of move fails
mfs = 0;
c=1;
setInterval(function() {
  //set global moved tracking variable to false
  m = !1;
  if (c<=3) {n=c}
  else {n=2}
  a.move(n)
  c++
  if (c>4) {c=1} 
  m || mfs++;
  //up after 5 moves
  5 < mfs && (a.move(0), c=4);
  //restart after 10 moves failed
  10 < mfs && (mfs = 0, a.restart());
}, 250);

संपादित करें: अद्यतन: यह सिर्फ 12596 के एक सुंदर पागल स्कोर के साथ मेरे व्यक्तिगत रिकॉर्ड को तोड़ दिया।

संपादित करें: अरे, मैं नीचे वाला हूं: डी भी:

b=a.addRandomTile.bind(a);m=!1;a.addRandomTile=function(){m=!0;mfs=0;b()};mfs=0;c=1;setInterval(function(){m=!1;n=3>=c?c:2;a.move(n);c++;4<c&&(c=1);m||mfs++;5<mfs&&(a.move(0),c=4);10<mfs&&(mfs=0,a.restart())},250);

(वास्तव में बदलाव नहीं, सिर्फ संकुचित।)

5 वीं बार एक आकर्षण? निश्चित नहीं। वैसे भी:

//bind into new tile function and change m(ove) variable when a tile was moved
b = a.addRandomTile.bind(a);
m = !1;
a.addRandomTile = function() { m = !0; mfs=0; b(); };
//number of move fails
mfs = 0;
c=1;
setInterval(function() {
  //set global moved tracking variable to false
  m = !1;
  if (c<=3) {n=c}
  else {n=2}
  a.move(n)
  c++
  if (c>4) {c=1} 
  if (c==0) {c=4}
  m || mfs++;
  //up after 5 moves
  5 < mfs && (c=0);
  //restart after 10 moves failed
  10 < mfs && (mfs = 0, a.restart());
}, 250);

तथा:

b=a.addRandomTile.bind(a);m=!1;a.addRandomTile=function(){m=!0;mfs=0;b()};mfs=0;c=1;setInterval(function(){m=!1;n=3>=c?c:2;a.move(n);c++;4<c&&(c=1);0==c&&(c=4);m||mfs++;5<mfs&&(c=0);10<mfs&&(mfs=0,a.restart())},250);

एक और नया संस्करण:

a = new GameManager(4, KeyboardInputManager, HTMLActuator, LocalStorageManager);
//bind into new tile function and change m(ove) variable when a tile was moved
b = a.addRandomTile.bind(a);
m = !1;
a.addRandomTile = function() { m = !0; mfs=0; b(); };
//number of move fails
mfs = 0;
c=1;
setInterval(function() {
  //set global moved tracking variable to false
  m = !1;
  if (c<=3) {n=c}
  else {n=2}
  a.move(n)
  c++
  if (c>4) {c=1} 
  if (c==0) {c=4}
  m || mfs++;
  //up after 5 moves
  5 < mfs && (c=0);
  //Found this in the source, as the criteria for a gameover. Might as well reset then ;)
  if (!a.movesAvailable()) {
      a.restart()
  }

}, 250);

तथा:

a=new GameManager(4,KeyboardInputManager,HTMLActuator,LocalStorageManager);b=a.addRandomTile.bind(a);m=!1;a.addRandomTile=function(){m=!0;mfs=0;b()};mfs=0;c=1;setInterval(function(){m=!1;n=3>=c?c:2;a.move(n);c++;4<c&&(c=1);0==c&&(c=4);m||mfs++;5<mfs&&(c=0);a.movesAvailable()||a.restart()},250);

(मुझे आशा है कि यह बहुत अधिक समस्या नहीं है कि गेमओवर स्क्रीन के पीछे यह जारी है? मुझे लगता है कि आप a.over=0कहीं न कहीं ऐसा जोड़ सकते हैं जिसे अक्सर निष्पादित किया जाता है। मैं किसी दिन इसका पता लगाऊंगा।)

EDIT (फिर से): मैंने मानक गेमओवर का रास्ता छोड़ दिया और चीजों को करने के पुराने तरीके पर वापस लौट आया। मैं अब एक अतिरिक्त परीक्षण कर रहा हूं जो कि हमेशा 16 या उससे अधिक की 2 टाइलें होने पर विलय होगा:

a = new GameManager(4, KeyboardInputManager, HTMLActuator, LocalStorageManager);
b = a.addRandomTile.bind(a);
m = !1;
a.addRandomTile = function() {
  m = !0;
  mfs = 0;
  b();
};
mfs = 0;
c = 1;
setInterval(function() {
  m = !1;
  l = 8;
  for (x = 0;x < 4;x++) {
    for (y = 0;y < 4;y++) {
      t1 = a.grid.cellContent({x:x, y:y});
      t2 = a.grid.cellContent({x:x, y:y + 1});
      t3 = a.grid.cellContent({x:x + 1, y:y + 1});
      if (t1 & t2) {
        if (t1.value == t2.value) {
          if (t1.value > l) {
            l = t1.value;
            c = 2;
          }
        }
        if (t1 & t3) {
          if (t1.value == t2.value) {
            if (t1.value > l) {
              l = t1.value;
            }
          }
        }
      }
    }
  }
  if (c <= 3) {
    n = c;
  } else {
    n = 2;
  }
  a.move(n);
  c++;
  if (c > 4) {
    c = 1;
  }
  if (c == 0) {
    c = 4;
  }
  m || mfs++;
  5 < mfs && (c = 0);
  10 < mfs && (mfs = 0, a.restart());
}, 250);

mfs=0अंदर जोड़ें addRandomTile, इस तरह यह एक सफल कदम के बाद गिनती को फिर से शुरू करेगा।
डेविड मुल्डर

और अब इसे खेलते हुए, कहने के लिए, यह मुझे उम्मीद से बेहतर कर रहा है ओ :): डी
डेविड मूल्डर

बस ध्यान दिया जाता है कि आप पिछले 2 संस्करणों में एक अंतराल में दो चालें बना रहे हैं, इसलिए मेरे द्वारा रिकॉर्ड किए गए 12320 स्कोर को अयोग्य घोषित करना पड़ा। और हाँ, मुझे किसी प्रकार के नाम की आवश्यकता थी: पी
डेविड मूल्डर

@DavidMulder Nooooooo! (क्या आपके पास कोई विचार है कि ऐसा कहां होता है, ताकि मैं इसे ठीक कर
सकूं

13
आपका उत्तर नए संस्करण से भरा है , कृपया पुराना कोड हटा दें। या संस्करणों के बीच अंतर की व्याख्या करें। पुराना कोड अभी भी "एडिट" लॉग्स में एक्सेस किया जा सकता है अगर किसी को इसमें रुचि हो।
AL

3

राइट और डाउन बॉट: 345 बाइट्स

लघु संस्करण

b=a.addRandomTile.bind(a);m=!1;t=250;d=!0;a.addRandomTile=function(){m=!0;b();d&&setTimeout(c,t)};c=function(){d=!1;a.move(2);setTimeout(function(){m=!1;d=!0;a.move(1);m||setTimeout(function(){a.move(0);m?a.grid.cells[3][0]&&a.grid.cells[3][3]&&setTimeout(function(){a.move(1)},t):setTimeout(function(){a.move(3);m||a.restart()},t)},t)},t)};c();

दीर्घ संस्करण

a = new GameManager(4, KeyboardInputManager, HTMLActuator, LocalStorageManager);
b = a.addRandomTile.bind(a);
m = !1;
t = 250;
d = !0;
a.addRandomTile = function() {
  m = !0;
  b();
  d && setTimeout(c, t);
};
c = function() {
  d = !1;
  a.move(2);
  setTimeout(function() {
    m = !1;
    d = !0;
    a.move(1);
    m || setTimeout(function() {
      a.move(0);
      m ? a.grid.cells[3][0] && a.grid.cells[3][3] && setTimeout(function() {
        a.move(1);
      }, t) : setTimeout(function() {
        a.move(3);
        m || a.restart();
      }, t);
    }, t);
  }, t);
};
c();

शब्दों में

नीचे ले जाएं, फिर दाईं ओर, यदि आप नहीं ले जा सकते हैं, तो ऊपर जाएं (या यदि आप नहीं जा सकते हैं, तो बाएं चलें), यदि शीर्ष दाएं और नीचे दाएं कोने भरा हुआ है, तो दाईं ओर चलें अन्यथा प्रारंभ करें।

वर्तमान हाईस्कोर

मेरा अपना सर्वश्रेष्ठ स्कोर 7668 था, लेकिन यह t=250(और इस तरह परोक्ष रूप से एक घंटे से अधिक) की तुलना में कहीं अधिक गति से चलाया गया था ।


इस स्क्रिप्ट में प्रति बार कई चालें करने की प्रवृत्ति है।
jdstankosky

3

किसी तरह मैं आज सुबह इस पुरानी प्रतियोगिता में भाग गया, और जब से मैं 2048 से प्यार करता हूं, मुझे एआई से प्यार है, और जेएस उन कुछ भाषाओं में से एक है जिन्हें मैं वर्तमान में अच्छी तरह से जानता हूं, मुझे लगा कि मैं इसे एक शॉट दूंगा।

GreedyBot ( 607 536 बाइट्स)

लघु संस्करण:

C=function(x,y){return a.grid.cellContent({x:x,y:y})},h=[[1,3,2,0],[2,1,3,0]],V='value',A='addRandomTile';a=new GameManager(4,KeyboardInputManager,HTMLActuator,LocalStorageManager);b=a[A].bind(a);m=!1;f=d=X=Y=0;a[A]=function(){m=!0;f=0;b()};setInterval(function(){m=!1;for(var c=X=Y=0;4>c;c++)for(var e=0;4>e;e++)if(u=C(c,e),!!u){for(q=e+1;4>q;){v=C(c,q);if(!!v){u[V]==v[V]&&(Y+=u[V]);break}q++}for(q=c+1;4>q;){v=C(q,e);if(!!v){u[V]==v[V]&&(X+=u[V]);break}q++}}f<4&&a.move(h[X>Y+4?0:1][f]);m&&(f=0);m||f++;15<f&&(f=0,a.restart())},250);

लंबा संस्करण (पुराना):

a = new GameManager(4, KeyboardInputManager, HTMLActuator,    LocalStorageManager);
b = a.addRandomTile.bind(a);
m = !1;
f = d = X = Y = 0;
a.addRandomTile = function() { m = !0; f = 0; b(); };
setInterval(function() {
    m = !1;
    X = Y = 0;

    for(var x=0;x<4;x++) {
        for(var y=0;y<4;y++) {
            u = a.grid.cellContent({x:x, y:y});
            if(u==null){continue;}
            q = y+1;
            while(q < 4) {
                v = a.grid.cellContent({x:x,y:q});
                if(v!=null){
                    if(u.value==v.value){
                        Y+=u.value;
                    }
                    break;
                }
                q++;
            }
            q = x+1;
            while(q < 4) {
                v = a.grid.cellContent({x:q,y:y});
                if(v!=null){
                    if(u.value==v.value){
                        X+=u.value;
                    }
                    break;
                }
                q++;
            }
        }
    }

    if(X>=Y){
        if(f==0)
            a.move(1);
        else if(f==1)
            a.move(3);
        else if(f==2)
            a.move(2);
        else if(f==3)
            a.move(0);
    } else {
        if(f==0)
            a.move(2);
        else if(f==1)
            a.move(0);
        else if(f==2)
            a.move(1);
        else if(f==3)
            a.move(3);
    }
    if(m)f=0;
    m || f++;
    if(15 < f) f=0,a.restart();
}, 250);

लंबे समय तक संस्करण को बिल्कुल भी अलग नहीं किया गया था (सिकुड़ते चर नाम के अलावा), इसलिए इसे अभी भी पठनीय होने के दौरान काफी छोटा किया जा सकता है। छोटा संस्करण क्लोजर कम्पाइलर (लिंक के लिए धन्यवाद!) का उपयोग करके बनाया गया था, जो 650 पर समाप्त हुआ। मेरे हिस्से पर कुछ कस्टम संशोधनों के साथ, मैं एक और दाढ़ी बनाने में सक्षम था 43 114 बिट्स ।

मूल रूप से, यह संभावित चाल के लिए ग्रिड के माध्यम से खोज करता है, और जब भी यह एक पाता है, तो इसके मूल्य को क्षैतिज या ऊर्ध्वाधर कुल में जोड़ता है। हर संभव कदम के माध्यम से खोज करने के बाद, यह निर्धारित करता है कि एच या वी कुल अधिक है, और यह पहले से ही कोशिश की गई दिशाओं के आधार पर, किस दिशा में बढ़ना चाहिए। राइट और डाउन पहली पसंद हैं।

इसे पीछे देखते हुए, मुझे अब एहसास हुआ कि अगर या तो कुल गैर-शून्य है, तो उस दिशा में टाइलों को फिसलने का पहला प्रयास सफल होने की गारंटी है। शायद मैं इसके आधार पर अंत-निर्णय अनुभाग को सरल बना सकता था।

मैंने एक घंटे तक चलने वाले इस कार्यक्रम को छोड़ दिया और उच्च स्कोर के साथ समाप्त हुआ 6080। हालाँकि, ट्रायल रन (प्री-मिनिमाइज़ेशन) में से एक में, यह 6492मेरे व्यक्तिगत सर्वश्रेष्ठ से केवल 128 के पीछे एक उच्च स्कोर बनाने में कामयाब रहा 6620। इसके तर्क को कभी-कभार बाएं-नीचे ले जाने से बहुत सुधार किया जा सकता है, क्योंकि संख्याएँ इस तरह ढेर हो जाती हैं:

 2  4  8 16
 4  8 16 32
 8 16 32 64
16 32 64 128

( संपादित करें: मैंने इसे थोड़ी देर तक चलाना छोड़ दिया, और इसने कुछ 7532बिंदुओं को प्रबंधित किया । दारान, मेरा कार्यक्रम मुझसे अधिक स्मार्ट है ...।)

एक और दिलचस्प tidbit: एक प्रयोग करने योग्य कुछ बनाने में मेरे गड़बड़ प्रयासों में से, किसी भी तरह यह समाप्त हो गया ताकि कभी भी दो टाइलें एक ही पंक्ति या स्तंभ में हों, वे संयुक्त थे। इसने दिलचस्प घटनाक्रम का नेतृत्व किया क्योंकि यादृच्छिक 2s या 4s बार-बार उच्चतम टाइल के साथ बार-बार जुड़ता था, हर बार दोगुना हो जाता था। एक बार, यह किसी भी तरह से बंद करने से पहले 15 सेकंड में 11,000 से अधिक स्कोर करने में कामयाब रहा

सुधार के लिए किसी भी सुझाव बहुत स्वागत है!


1

विंडशील्ड वाइपर: 454 बाइट्स

बस राइट, अप, लेफ्ट, अप ... दोहराता रहता है (बस एक कार पर वाइपर की तरह) जब तक कि यह जाम न हो जाए। यदि यह जाम हो जाता है, तो यह वाइपर को बंद करने और उन्हें वापस चालू करने का प्रयास करेगा। उच्चतम स्कोर जो मुझे एक घंटे में मिला, वह था 12,156 - हालाँकि, अधिकांश स्कोर 3k - 7k के बीच कहीं हैं।

यह हर प्रयास के बाद स्कोर को कंसोल में आउटपुट करेगा।

var move = !1;
var bad = 0;
var c = 0;
var b = a.addRandomTile.bind(a);
a.addRandomTile = function() {
    b();
    move=!0;
    bad=0;
}
setInterval(function() {
    if (!move) bad++;
    if (c>3) c=0;
    move = !1;
    if (c==3) {a.move(0);c++;}
    if (c==2) {a.move(3);c++;}
    if (c==1) {a.move(0);c++;}
    if (c==0) {a.move(1);c++;}
    if (bad>10) {a.move(2);}
    if (!a.movesAvailable()) {console.log("Score: "+a.score);a.restart();}
}, 250);

0

UpAndLeftBot

जैसा कि शीर्षक से पता चलता है, डेविड मूल्डर के काम को चोरी करके और कुछ नंबरों की अदला-बदली करके (मैं जावास्क्रिप्ट के बारे में जैक नहीं जानता, इसलिए सबसे अच्छा मैं यह कर सकता हूं) को छोड़ देता हूं।

a = new GameManager(4, KeyboardInputManager, HTMLActuator, LocalStorageManager);
b = a.addRandomTile.bind(a);
m = !1;
t = 250;
d = !0;
a.addRandomTile = function() {
  m = !0;
  b();
  d && setTimeout(c, t);
};
c = function() {
  d = !1;
  a.move(0); // a.move(2)
  setTimeout(function() {
    m = !1;
    d = !0;
    a.move(3); // a.move(1)
    m || setTimeout(function() {
      a.move(2);  //a.move(0)
      m ? a.grid.cells[3][0] && a.grid.cells[3][3] && setTimeout(function() {
        a.move(3); // a.move(1)
      }, t) : setTimeout(function() {
        a.move(1);  // a.move(3)
        m || a.restart();
      }, t);
    }, t);
  }, t);
};
c();

डेविड मुल्डर की पटकथा की तरह, यह भी एक बार में हर बार एक से अधिक मूव्स करता है।
20st में jdstankosky
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.