2048 ท้าทายบอท


19

เราทำการโคลนนิ่ง 2048 วิเคราะห์ 2048 แล้ว แต่ทำไมเรายังไม่เล่นเลย เขียนโค้ดจาวาสคริปต์ 555 ไบต์เพื่อเล่น 2048 โดยอัตโนมัติคะแนนที่ดีที่สุดหลังจากหนึ่งชั่วโมงจะถูกนับ (ดูคะแนนด้านล่าง)

ติดตั้ง:

ไปที่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 ถูกตัดสิทธิ์สำหรับการเคลื่อนไหวสองครั้งในช่วงเวลาเดียว (ภายใน 250ms)

คำถามที่พบบ่อย

  • เหตุใดความท้าทายนี้จึงไม่ใช่ภาษาที่ไม่เชื่อเรื่องพระเจ้าผ่านทางเทอร์มินัล
    • ด้วยเหตุผลง่ายๆว่ามันสนุกกว่านี้ การดูการเล่นเกมนั้นเป็นภาพกราฟิกนั้นเป็นอะไรที่น่าดึงดูดใจมากกว่าการเห็นคอนโซลทะลุตัวเลข แม้จะรู้ว่าไม่มีจาวาสคริปต์คุณควรจะสามารถเข้าร่วมการแข่งขันนี้ได้เนื่องจากมันไม่ได้เกี่ยวกับคุณสมบัติทางภาษาเป็นหลัก (ใช้เครื่องมือนี้เพื่อลดรหัส)

3
ดูเหมือนว่ามันจะจบลงด้วยการเป็นกลุ่มของการใช้งาน JavaScript ของอัลกอริทึมที่ดีที่สุดจากที่นี่ใช่ไหม?
Jason C

2
-1 ...best score after an hour will count... ทำไมแค่ชั่วโมงเดียว
user80551

3
ในกรณีใด ๆ ฉันขอแนะนำในชื่อของความเป็นธรรมการสร้างตัวสร้างตัวเลขสุ่มแบบเดียวกันสำหรับการทดสอบคำตอบทุกครั้งและยังทำงานอย่างหนัก (1 ชั่วโมง / 250 ms =) การเคลื่อนไหว 14,400 ครั้งต่อการเคลื่อนไหวเพื่อกำจัดความแปรปรวนของจำนวนที่กำหนด เพื่อกำหนดเวลาความไม่ถูกต้อง อย่างน้อยผลลัพธ์ก็สามารถกำหนดขึ้นและคุ้มค่ากับ KotH มากขึ้น
Jason C

1
750 ไบต์หรือ 550 ไบต์?
Peter Taylor

2
เข้มงวดเกินไป 750 ไบต์, 1 ชั่วโมง, JavaScript
TheDoctor

คำตอบ:


4

ฉันไม่สามารถรหัส javascript ได้ดังนั้นฉันจึงขโมยคำตอบของคุณ

//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 นาทีบนเครื่องของฉัน: D

แก้ไข: ลืมที่จะเลื่อนลงสองครั้งแทนที่จะเป็นเพียงครั้งเดียวนี่คือรหัสที่คุณควรใช้:

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);

นอกจากนี้ยังมีข้อผิดพลาดที่มันจะรีสตาร์ทเมื่อไม่จำเป็น แต่ฉันไม่แน่ใจว่าจะแก้ไขได้อย่างไร แก้ไข: ปัจจุบันมีคะแนนสูงสุด 3116 (หลังจาก 3 นาที) ฉันคิดว่ามันปลอดภัยที่จะบอกว่า algoritm นี้ดีกว่าการทำแบบสุ่ม

แก้ไขรุ่นที่ใหม่กว่า:

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

แก้ไข: เฮ้ฉันเป็นคนทำกำไร: D ด้วย:

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);

(ฉันหวังว่าจะไม่เป็นปัญหามากเกินไปที่จะเกิดขึ้นหลังหน้าจอ gameover หรือไม่ฉันคิดว่าคุณสามารถเพิ่ม a.over=0บางที่ได้รับการดำเนินการบ่อยฉันจะคิดออกสักวันหนึ่ง)

แก้ไข (อีกครั้ง): ฉันเลิกเล่นเกมแบบมาตรฐานแล้วเปลี่ยนกลับไปใช้วิธีแบบเดิม ๆ ตอนนี้ฉันกำลังทดสอบการเพิ่มที่จะรวมอยู่เสมอหากมีไพ่สองใบที่มี 16 แผ่นขึ้นไป:

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วิธีนั้นจะเริ่มนับใหม่หลังจากการย้ายที่ประสบความสำเร็จ
David Mulder

และดูมันเล่นตอนนี้จะบอกว่ามันทำดีกว่าที่ฉันคาดไว้ O :): D
David Mulder

เพิ่งสังเกตเห็นว่าคุณกำลังเคลื่อนไหวสองครั้งในหนึ่งช่วงใน 2 เวอร์ชันล่าสุดดังนั้นต้องตัดสิทธิ์ 12320 คะแนนที่ฉันบันทึกไว้ และใช่ฉันต้องการชื่อบางอย่าง: P
David Mulder

@DavidMulder Nooooooo! (คุณมีความคิดที่ว่าสิ่งนี้เกิดขึ้นเพื่อที่ฉันสามารถแก้ไขได้?)
Aprıʇǝɥʇuʎs

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 ฉันรัก AI และ JS เป็นหนึ่งในไม่กี่ภาษาที่ฉันรู้ดีในปัจจุบันฉันคิดว่าฉันจะให้มันยิง

GreedyBot ( 607 536 bytes)

เวอร์ชั่นสั้น:

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 บิต

โดยพื้นฐานแล้วมันจะค้นหาผ่านกริดเพื่อหาการเคลื่อนไหวที่เป็นไปได้และเมื่อใดก็ตามที่พบสิ่งหนึ่งจะเพิ่มมูลค่าให้กับผลรวมแนวนอนหรือแนวตั้ง หลังจากค้นหาทุกการเคลื่อนไหวที่เป็นไปได้มันจะกำหนดทิศทางที่มันควรเคลื่อนที่โดยขึ้นอยู่กับว่าผลรวม H หรือ V นั้นสูงกว่าและทิศทางที่ได้ลองไปแล้ว ขวาและลงเป็นตัวเลือกแรก

เมื่อย้อนกลับไปดูสิ่งนี้ฉันรู้แล้วว่าหากผลรวมทั้งหมดไม่เป็นศูนย์ความพยายามครั้งแรกที่เลื่อนแผ่นกระเบื้องไปในทิศทางนั้นรับประกันได้ว่าจะสำเร็จ บางทีฉันอาจลดความซับซ้อนของส่วนการตัดสินใจย้ายไปยังจุดสิ้นสุดตามนี้

6080ผมออกจากโปรแกรมนี้ทำงานเป็นเวลาหนึ่งชั่วโมงและจบลงด้วยคะแนนสูงของ อย่างไรก็ตามในการทดลองใช้งานหนึ่งครั้ง (pre-minification) มันจัดการได้คะแนนสูง6492เพียง 128 หลังส่วนบุคคลที่ดีที่สุดของ6620ฉัน ตรรกะของมันอาจได้รับการปรับปรุงอย่างมากโดยให้เลื่อนไปทางซ้าย - ลงเป็นครั้งคราวเนื่องจากตัวเลขมีแนวโน้มที่จะกองพะเนินเช่นนี้:

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

( แก้ไข:ฉันปล่อยให้มันรันอีกต่อไปและจัดการบาง7532จุดยี้โปรแกรมของฉันฉลาดกว่าฉัน .... )

อาหารอันโอชะหนึ่งน่าสนใจมากขึ้น: ในหนึ่งของความพยายามที่ glitched ของฉันที่สร้างสิ่งที่สามารถใช้ได้อย่างใดมันก็จบลงเพื่อว่าเวลาใด ๆสองแผ่นอยู่ในแถวหรือคอลัมน์เดียวกันพวกเขารวมกัน สิ่งนี้นำไปสู่การพัฒนาที่น่าสนใจเนื่องจากการสุ่ม 2s หรือ 4s จะรวมกับกระเบื้องสูงสุดซ้ำ ๆ ซ้ำ ๆ ทุกครั้ง ครั้งหนึ่งมันได้คะแนนมากกว่า 11,000 ใน 15 วินาทีก่อนที่ฉันจะปิดมัน .... XD

ข้อเสนอแนะสำหรับการปรับปรุงยินดีมาก!


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

ตามชื่อเรื่องเลื่อนขึ้นและไปทางซ้ายโดยขโมยผลงานของ David Mulder & สลับตัวเลขบางตัว (ฉันไม่รู้แจ็คเกี่ยวกับ Javascript ดังนั้นฉันทำได้ดีที่สุด)

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();

เช่นเดียวกับสคริปต์ของ David Mulder สิ่งนี้ยังทำการเดินหลายครั้งต่อเทิร์นทุกครั้ง
jdstankosky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.