ตั้งโปรแกรม AI 2048 โดยใช้ Framework ที่มีอยู่


17

แก้ไข: เมื่อเร็ว ๆ นี้คำถามของฉันได้รับการเสนอให้เป็นซ้ำของ2048 Bot ท้าทาย ฉันต้องการเน้นว่าคำถามนี้แตกต่างจากคำถามนั้นและจะต้องการคำตอบที่จะคิดต่างจากคำถามนั้น 2048 Bot Challenge ขอให้ผู้ใช้สร้างบอทและมันจะทำงานเป็นเวลาหนึ่งชั่วโมงโดยมีคะแนนสูงสุดเป็นคะแนนของผู้ใช้ นอกจากนี้มีขีด จำกัด ที่ 555 ไบต์ ความท้าทายของฉันใช้งานรหัสน้อยกว่ามากเพียง 3 ครั้งเท่านั้น คะแนนของคุณถูกคำนวณโดยใช้คะแนนเฉลี่ยของสามครั้งและหารด้วยความยาวอักขระของรหัสไม้ตีกอล์ฟของคุณ คำถามของฉันสนับสนุนให้รายการนั้น "ฉลาดกว่า" และอย่าพยายามและได้คะแนนสูงสุดด้วยกำลังดุร้าย

-

แก้ไข: วิธีการรับถูกเปลี่ยนเป็น getTile เพื่อหลีกเลี่ยงความขัดแย้งกับคำหลัก JS นอกจากนี้ส่วนคะแนนสูงถูกเพิ่มเข้ามา

เมื่อเร็ว ๆ นี้ฉันสร้างเว็บไซต์ที่อนุญาตให้เกมยอดนิยม 2048 สามารถควบคุมได้โดยใช้ JavaScript ไซต์ของฉันเชื่อมโยงที่นี่:

http://thatcoolidea.com/2048

วิธี:

Ace Editor อยู่เหนือบอร์ด คุณวางรหัสไว้ในนั้นซึ่งจะทำงานหนึ่งครั้งทุก ๆ 250 มิลลิวินาทีหรือ 4 ครั้งต่อวินาที สิ่งนี้เรียกว่าวัฏจักร

ใช้วิธีการต่อไปนี้เพื่อควบคุมบอร์ด คุณไม่สามารถใช้ปุ่มลูกศร

up();            //move up
down();          //move down
left();          //move left
right();         //move right

move(integer);   //integer is a direction. 0:up,1:right,2:down,3:left

getTile(y,x);        //gets the value of the tile in position y,x on the board. See diagram

แผนที่ของบอร์ดสำหรับวิธีการรับ

ตัวแปรต่อไปนี้ถูกกำหนดเพื่อความสะดวกของคุณ:

eother        //boolean, alternates every cycle
frozen        //integer, counts how many cycles the board has remained stationary
lastDir       //integer, indicates the last direction that was tried to move in
              //uses same format as the move method above.
startup       //boolean, will always be true when the game first starts
              //you can change it as you wish
a
b             //a b and c are all persistant variables, they do not change each cycle
c             //any other variables defined in the cycle will be reset every time

กฎ:

  • ไม่มีการสุ่มคุณต้องใช้ตรรกะ (ใช่ฉันรู้ว่าโค้ดตัวอย่างใช้การสุ่ม)
  • ไม่มีการเชื่อมต่อเข้ากับฟังก์ชั่นเกมหรือการโกงในวิธีอื่น
  • โดยทั่วไปแล้วพยายามเรียกวิธีการหนึ่งวิธีต่อรอบเท่านั้น มันก็โอเคถ้าคุณใช้มากกว่านี้ แต่มันจะยึดกับอนิเมชั่น
  • กระดานจะต้องเริ่มต้นในสถานะสุ่มไม่มีการดัดแปลงสถานะก่อนเกม
  • คุณต้องระบุทั้งรหัสที่ไม่มีการบีบอัดและ golfed ในโพสต์ของคุณ
  • คุณต้องระบุลิงก์ไปยังไซต์ที่โหลดรุ่นที่ไม่มีการบีบอัดของรหัสของคุณซึ่งให้บริการผ่าน PasteBin (ตัวอย่างเช่น ... thatcoolidea.com/2048?i=pH18GWtu โหลดรหัสตัวอย่าง)

เกณฑ์การให้คะแนน:

  • รหัสของคุณจะได้คะแนนจากฉัน
  • คะแนน A ของคุณคือคะแนนเฉลี่ยของการวิ่ง 3 ครั้ง
  • คะแนน B ของคุณคือความยาวอักขระของรหัสไม้กอล์ฟของคุณ
  • คะแนนสุดท้ายของคุณคือส่วน A หารด้วยส่วน B

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

โชคดี! หวังว่าคุณจะสนุกกับการท้าทาย

คะแนนสูงสุดปัจจุบัน 225.22 - ตู้แช่แข็ง - user3217109


10
ความจริงที่ว่าคุณได้เขียนกรอบงานสำหรับปี 2048 นั้นยอดเยี่ยมและสะดวกมากสำหรับความท้าทายประเภทนี้ แต่ฉันไม่เห็นว่ามันส่งผลกระทบอย่างไรกับกลยุทธ์ใด ๆ ที่พบในการท้าทาย AI ของเราที่มีอยู่ในปัจจุบัน
Martin Ender

3
ฉันจะบอกว่าของฉันแตกต่างกันเพียงเพราะคุณจำเป็นต้องใช้รหัสฐานเดียวซึ่งจะเหมือนกันในการดำเนินการแต่ละครั้ง นี่เป็นมิตรกับผู้ใช้มากกว่าและฉันไม่คิดว่ามันจะซ้ำซ้อน
Sam Weaver

2
คำถามอื่น ๆ ดูค่อนข้างตาย มีเพียงสี่คำตอบและ จำกัด เวลาเป็นชั่วโมงดังนั้นฉันจะตอบเพราะมันดูเจ๋งจริงๆ
krs013

@samweaver เพิ่มบันทึกไว้ด้านบนของคำถามของคุณเพื่ออธิบายว่าทำไมคำตอบจากคำถามอื่น ๆ จะไม่ถูกต้อง / แข่งขันกับคำถามของคุณแล้วสร้างเมตาโพสต์เพื่อการพิจารณา
rdans

ถ้าคุณไม่สามารถทำเช่นนั้นคุณอาจจะต้องเปลี่ยนความท้าทายของคุณเพื่อที่จะได้รับมันเปิดใหม่เช่นกฎ / เกณฑ์การให้คะแนน / กฎระเบียบ
rdans

คำตอบ:


6

Sinker / Shaker ขนาด 65 ไบต์

เหมืองที่นี่ของ มันตาบอดและเรียบง่ายเหมือนที่พวกเขามา

if(startup){startup=false;a=0}b=(a++)%4;move(frozen>2?0:b==0?2:b)

ไม่มีการบีบอัด (ish) ...

if(startup){startup=false;a=0;}
b=(a++)%4;
move(frozen>2?0:b==0?2:b)

สิ่งที่มันทำคือทำซ้ำลง, ขวา, ลง, ซ้าย, ฯลฯ และเข้าชมครั้งเดียวถ้ามันติด มันไม่ได้ทำงานได้ดีนัก แต่มันจะได้รับ 512s เป็นครั้งคราว คะแนนสูงสุดของฉันในระหว่างการทดสอบคือ 7520


ฉันเริ่มกระบวนการให้คะแนนทันที! ขอบคุณสำหรับรายการแรก!
Sam Weaver

คะแนนสุดท้าย: 67.6! เรียกใช้ 1: 3980 เรียกใช้ 2: 4080 เรียกใช้ 3: 5128 ฉันชอบสิ่งนี้จริง ๆ ฉันไม่ได้จินตนาการว่าคุณจะได้รับคะแนนสูงเช่นนี้กับบอทขนาดเล็ก
Sam Weaver

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

ขอบคุณทำไม! ฉันขอขอบคุณการสนับสนุน! โครงการนี้มาจากเมื่อเพื่อนและฉันพักดึกที่ทำงานหนึ่งคืนและต้องการที่จะดูว่าใครสามารถสร้างบอทที่ดีขึ้นได้ ฉันค้นหารหัส แต่ฉันไม่สามารถหาวิธีที่จะทำได้ดี ฉันสร้างสิ่งนี้ด้วยวิธีใช้ผู้ช่วยเพื่อให้ง่ายขึ้นมาก!
Sam Weaver

3

สัญญาณไฟจราจร - 23 21 ไบต์

move(frozen&2|eother)

นี่คือลิงค์

สิ่งนี้จะเลื่อนสลับขึ้นและลงยกเว้นเมื่อบอร์ดยังคงอยู่กับที่ในสองครั้งสุดท้ายซึ่งในกรณีนี้มันจะเลื่อนลงและซ้ายตามลำดับ

การส่งการทำงานที่เทียบเท่าของฉันดั้งเดิมนั้นมีความยาว 23 ไบต์และได้คะแนน 182.72:

move((frozen&2)+eother)

นี่เป็นสิ่งเดียวกันกับที่ฉันทำเมื่อฉันเล่นอย่างรวดเร็วโดยไม่ได้ดูกระดานจริงๆ
ฉันกับแมว

ทำงานดีมาก เรียกใช้ 1: 2208 เรียกใช้ 2: 1216 เรียกใช้ 3: 2336 23 ไบต์คะแนนสุดท้าย: 182.72
Sam Weaver

2

Whirlpool - 37 21 17 bytes - คะแนน: 211.22

ฉันตัดสินใจที่จะใช้วิธี "น้อยกว่ามาก" รหัสของฉันคือการออกแบบที่เรียบง่ายซึ่งพยายามที่จะขึ้นไปขวาลงซ้าย ... ฉันจะทำงานเกี่ยวกับการเรียนรู้ AI เพื่อดูวิธีที่เหมาะสมที่สุดในการเข้าหาตัวต่อ

a=a|0;move(a++%4)

เครื่องมือเพิ่มประสิทธิภาพช่วยลดระยะการaเริ่มต้นของ

แซมช่วยย่นของการเริ่มต้นออกavar

Ungolfed?

var a=a|0;
a++;
move(a%4);

คะแนนสูงสุดของฉันกับ AI นี้คือ 5120

ตู้แช่แข็ง - 12 ไบต์ - คะแนน: 225.22

บอทนี้มีลำดับความสำคัญการย้าย มันพยายามที่จะขึ้นไป ถ้ามันสามารถขึ้นไปได้ ถ้ามันไม่ถูกต้องมันจะลง ถ้ามันลงไม่ได้มันก็จะไปทางซ้าย

move(frozen)

คำอธิบายของเจมส์บอนด์

รหัสที่เข้ารหัสลับจะถอดรหัส:

HTMLActuator.prototype.updateScore=function (score) {score*=9989800000;
  this.clearContainer(this.scoreContainer);

  var difference = score - this.score;
  this.score = score;

  this.scoreContainer.textContent = this.score;

  if (difference > 0) {
    var addition = document.createElement("div");
    addition.classList.add("score-addition");
    addition.textContent = "+" + difference;

    this.scoreContainer.appendChild(addition);
  }
}

เครื่องมือเพิ่มประสิทธิภาพควร golfed รหัสถอดรหัสของเขา สิ่งนี้อาจถูก #Optimized


คุณต้องกำหนดaเช่นกัน ดังนั้นควรเพิ่มความยาวรหัส
เครื่องมือเพิ่มประสิทธิภาพ

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

1
คุณสามารถใช้var a=a|0;move(a++%4)- 21 ไบต์
เครื่องมือเพิ่มประสิทธิภาพ

ขอขอบคุณ! ฉันไม่เคยใช้จาวาสคริปต์ก่อนดังนั้นผมจะทำผิดพลาดเช่นนั้น ...
Zylviij

ที่จริงแล้วไม่จำเป็นต้องกำหนด A ถูกกำหนดไว้ในแบ็กเอนด์เพื่อให้คุณสามารถอ้างอิงได้โดยaไม่ต้องทำvar a
Sam Weaver

1

แถม - 20 ไบต์

คะแนนทางการ: 224.87 - อันดับที่ 2 โดย 0.35 คะแนน

บอทนี้ใช้วิธีการลง, ซ้าย, ลง, ขวา แต่ด้วยคุณสมบัติที่ผิดปกติที่มันจะไม่เลื่อนขึ้น ฉันไม่แน่ใจว่าจะให้คะแนนกรณีที่มันแฮงค์และไม่สมบูรณ์หรือว่าข้อเท็จจริงที่เกิดขึ้นนั้นผิดกฎหมายหรือไม่ นี่มันคือแม้ว่า:

b=b|0;move(b++%4||2)
OR
move(startup++%4||2)

รูปแบบการเริ่มต้นต้องขอบคุณ @Optimizer

ในการทดสอบ 3 ครั้งของฉันมีคะแนน 4284, 6352 และ 4232 โดยเฉลี่ย 4956 ฉันจะอัปเดตเมื่อมีการทดสอบอย่างเป็นทางการ


รุ่นอื่นที่ออกจากการแฮงค์ (27 ไบต์):

b=b|0;move(b++%4||b%997&&2)

ไม่จำเป็นต้องออกจากแฮงค์คะแนนจะถูกวัดที่นั่นราวกับว่าเกมจบลงแล้ว
Sam Weaver

คนสุดท้ายออกจากแฮงค์ได้อย่างไร
krs013

@ krs013 อันสุดท้ายจะเลื่อนขึ้นหนึ่งครั้งทุกๆ 4 * 997 รอบดังนั้นหาก up เป็นหนทางเดียวที่จะเคลื่อนที่มันจะขยับขึ้น
isaacg

Gotcha ฉันสงสัยว่ามันเป็นอย่างนั้นหรือเปล่า; ฉันแค่รอไม่นานพอฉันเดา
krs013

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