Program AI 2048 menggunakan Framework yang ada

17

EDIT: Baru-baru ini, pertanyaan saya telah diajukan sebagai duplikat 2048 Bot Challenge . Saya ingin menekankan bahwa pertanyaan ini berbeda dari pertanyaan itu, dan akan memerlukan jawaban untuk dianggap berbeda dari pertanyaan itu. 2048 Bot Challenge meminta pengguna untuk membuat bot, dan itu akan berjalan selama satu jam, dengan skor tertinggi adalah skor pengguna. Selain itu, ia memiliki batas 555 byte. Tantangan saya menjalankan kode jauh lebih jarang, hanya 3 kali. Skor Anda dihitung dengan menggunakan skor rata-rata dari tiga kali dan membaginya dengan panjang karakter kode golf Anda. Pertanyaan saya mendorong entri menjadi "lebih pintar," dan tidak mencoba dan mendapatkan skor tertinggi dengan kekerasan.

-

EDIT: Metode get diubah menjadi getTile, untuk menghindari pertentangan dengan get kata kunci JS. Selain itu, bagian skor tinggi ditambahkan.

Baru-baru ini, saya membuat situs yang memungkinkan game populer 2048 dikendalikan menggunakan JavaScript. Situs saya tertaut di sini:

http://thatcoolidea.com/2048

Bagaimana:

Editor Ace terletak di atas papan. Anda menempatkan kode di dalamnya, yang dijalankan sekali setiap 250 ms, atau 4 kali per detik. Ini disebut siklus.

Gunakan metode berikut untuk mengontrol papan. Anda tidak dapat menggunakan tombol panah.

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

Peta papan untuk metode get.

Variabel berikut ditentukan untuk kenyamanan Anda:

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

Aturan:

  • Tanpa Keacakan, Anda harus menggunakan logika. (Ya, saya tahu kode contoh menggunakan acak.)
  • Tidak mengaitkan ke fungsi permainan atau menipu dengan cara lain
  • Secara umum, cobalah hanya memanggil metode satu langkah per siklus. Tidak apa-apa jika Anda menggunakan lebih banyak, tetapi itu kacau dengan animasi
  • Papan harus mulai dalam keadaan acak, tidak ada modifikasi dari kondisi sebelum pertandingan
  • Anda harus memberikan versi kode yang tidak dikompresi dan golf di pos Anda.
  • Anda harus memberikan tautan ke situs yang sudah memuat versi kode Anda yang tidak terkompresi, disajikan melalui PasteBin (Misalnya, ... thatcoolidea.com/2048?i=pH18GWtu memuat kode contoh.)

Mencetak:

  • Kode Anda akan dicetak oleh saya.
  • Bagian A dari skor Anda adalah rata-rata 3 run dari kode, dibulatkan ke bawah.
  • Bagian B dari skor Anda adalah panjang karakter kode golf Anda.
  • Skor akhir Anda adalah Bagian A dibagi dengan Bagian B

Pemenang akan memiliki kode mereka diabadikan sebagai kode contoh di situs, jika mereka memilih, dan diakui dalam komentar dalam kode.

Semoga berhasil! Semoga Anda menikmati tantangan.

Skor Tinggi Saat Ini 225,22 - Freezer - user3217109

Sam Weaver
sumber
10
Fakta bahwa Anda telah menulis kerangka kerja untuk 2048 cukup mengagumkan dan sangat nyaman untuk jenis tantangan ini, tapi saya tidak melihat bagaimana itu sebenarnya mempengaruhi salah satu strategi yang sudah ditemukan dalam tantangan 2048 AI kami saat ini.
Martin Ender
3
Yah saya akan mengatakan bahwa milik saya berbeda, hanya karena Anda diminta untuk menggunakan satu basis kode yang akan sama setiap eksekusi. Ini jauh lebih ramah pengguna dan saya pikir itu bukan duplikat.
Sam Weaver
2
Pertanyaan lain terlihat sangat mati. Hanya ada empat jawaban dan batas waktu satu jam, jadi saya akan menjawab karena ini terlihat sangat keren.
krs013
@samweaver menambahkan catatan di bagian atas pertanyaan Anda untuk menjelaskan mengapa jawaban dari pertanyaan lain tidak valid / bersaing untuk pertanyaan Anda, dan kemudian membuat meta pos untuk pengawasan.
rdans
Jika Anda tidak bisa melakukan itu, Anda mungkin perlu mengubah tantangan Anda untuk membuatnya dibuka kembali misalnya aturan / penilaian / pembatasan
rdans

Jawaban:

6

Sinker / Shaker, 65 byte

Ini milik saya . Begitu buta dan sesederhana mereka datang.

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

Tidak terkompresi (ish) ...

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

Yang ia lakukan hanyalah mengulangi, kanan, bawah, kiri, dll. Dan memukul sekali jika macet. Ini tidak selalu bekerja dengan sangat baik, tetapi kadang-kadang akan mendapatkan 512-an. Skor tinggi saya selama pengujian adalah 7520.

krs013
sumber
Saya memulai proses penilaian sekarang! Terima kasih untuk entri pertama!
Sam Weaver
Skor Akhir: 67,6! Run 1: 3980 Run 2: 4080 Run 3: 5128 Saya sangat menyukai ini, saya tidak membayangkan Anda bisa mendapatkan skor setinggi itu dengan bot sekecil itu.
Sam Weaver
Terima kasih telah menyiapkannya! Saya pikir itu sangat keren. Sangat menyedihkan bahwa orang telah bereaksi sejauh ini. Pengguna SO cenderung sangat negatif terhadap pertanyaan duplikat, biasanya karena alasan yang baik.
krs013
Wah terima kasih! Saya menghargai dukungannya! Proyek ini berawal dari ketika seorang teman dan saya bekerja lembur suatu malam dan ingin melihat siapa yang bisa membuat bot yang lebih baik. Saya mencari-cari kode, tetapi saya tidak dapat menemukan cara untuk melakukannya dengan baik. Saya membangun ini dengan metode pembantu untuk membuatnya lebih mudah!
Sam Weaver
3

Lampu lalu lintas - 23 21 byte

move(frozen&2|eother)

Ini tautannya.

Ini akan bergerak secara bergantian ke atas dan ke kanan, kecuali ketika papan tetap diam untuk dua gerakan terakhir, dalam hal ini akan bergerak ke bawah dan kiri masing-masing.

Pengajuan asli saya, yang secara fungsional setara adalah sepanjang 23 byte dan mencetak 182,72:

move((frozen&2)+eother)
saya dan kucing saya
sumber
Ini hampir sama dengan yang saya lakukan ketika saya bermain dengan cepat tanpa benar-benar melihat papan.
saya dan kucing saya
Kerja bagus. Run 1: 2208 Run 2: 1216 Run 3: 2336 23 bytes Nilai Akhir: 182,72
Sam Weaver
2

Pusaran Air - 37 21 17 byte - Nilai: 211,22

Saya memutuskan untuk pergi dengan pendekatan "kurang lebih". Kode saya adalah desain sederhana yang mencoba naik, kanan, turun, kiri ... Saya akan mengerjakan AI pembelajaran untuk melihat cara yang lebih optimal untuk mendekati puzzle.

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

Pengoptimal membantu memperpendek a inisialisasi.

Sam membantu mempersingkat ainisialisasi, dihapusvar .

Tidak disatukan?

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

Skor tertinggi saya dengan AI ini adalah 5120.

Freezer - 12 byte - Nilai: 225,22

Bot ini memiliki prioritas bergerak. Mencoba untuk naik. Jika itu bisa 'naik, itu berjalan dengan benar. Jika itu tidak bisa berjalan dengan benar, itu turun. Jika tidak bisa turun itu ke kiri.

move(frozen)

Penjelasan James Bond

Kode terenkripsi mendekripsi untuk mengatakan:

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

Pengoptimal seharusnya mem-golf-kan kodenya. Ini bisa jadi #Optimized.

Zylviij
sumber
Anda harus benar-benar mendefinisikan ajuga. Sehingga harus ditambahkan panjang kode.
Pengoptimal
Sayangnya, backend mempertahankan variabel melalui reset, sehingga Anda dapat mendefinisikan / menginisialisasi asekali dan melupakannya, tetapi jika Anda menutup tab / jendela dan kembali ke sana, saya tidak berpikir itu akan berfungsi lagi. Inilah sebabnya saya harus menambahkan bit if (startup) pada milik saya.
krs013
1
Anda dapat menggunakan var a=a|0;move(a++%4)- 21 byte
Pengoptimal
Terima kasih! Saya belum pernah menggunakan javascript sebelumnya, jadi saya akan membuat kesalahan seperti itu ...
Zylviij
Sebenarnya, A tidak perlu didefinisikan. A didefinisikan di backend, sehingga Anda dapat referensi menggunakan hanya atanpa melakukanvar a
Sam Weaver
1

Hanger - 20 byte

Skor resmi: 224,87 - 2 tempat dengan 0,35 poin

Bot ini menggunakan pendekatan turun, kiri, bawah, kanan, tetapi dengan fitur tidak biasa yang tidak akan pernah naik. Saya tidak yakin bagaimana cara menilai kasus di mana hang dan tidak lengkap, atau apakah fakta yang terjadi menjadikannya ilegal. Ini dia:

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

Pola inisialisasi berkat @Optimizer.

Dalam 3 pengujian saya, skor saya adalah 4284, 6352, dan 4232, dengan rata-rata 4.956. Saya akan memperbarui ketika tes resmi dijalankan.


Versi alternatif yang keluar dari hang (27 byte):

b=b|0;move(b++%4||b%997&&2)
isaacg
sumber
Tidak perlu meninggalkan hang, skor hanya akan diukur di sana seolah-olah permainan telah berakhir.
Sam Weaver
Bagaimana yang terakhir keluar dari hang?
krs013
@ krs013 Yang terakhir akan naik sekali setiap 4 * 997 siklus, jadi jika naik adalah satu-satunya cara untuk bergerak, itu akan naik.
isaacg
Kena kau. Saya bertanya-tanya apakah itu sesuatu seperti itu; Aku hanya tidak menunggu cukup lama, kurasa.
krs013
Skor Akhir: 224,87, kerja bagus!
Sam Weaver