Mevcut bir Framework kullanarak 2048 AI programlayın


17

EDIT: Son zamanlarda, sorum 2048 Bot Challenge bir kopyası olarak önerilmiştir . Bu sorunun bu sorudan farklı olduğunu ve cevapların bu sorudan farklı düşünülmesini gerektireceğini vurgulamak isterim. 2048 Bot Mücadelesi kullanıcıdan bir bot yaratmasını istedi ve en yüksek puan kullanıcının puanı olan bir saat boyunca çalıştırılacaktı. Ayrıca, 555 baytlık bir sınırı vardı. Benim meydan okuma kodu çok daha az sıklıkta, sadece 3 kez çalışır. Puanınız, bu üç kez ortalama puan kullanılarak ve golf kodunuzun karakter uzunluğuna bölünerek hesaplanır. Benim sorum girişleri "daha akıllı" olmaya ve kaba kuvvetle en yüksek puanı almaya çalışmamaya teşvik ediyor.

-

EDIT: get yöntemi JS get anahtar kelimesi ile çakışmasını önlemek için getTile değiştirildi. Ayrıca, yüksek puan bölümü eklendi.

Son zamanlarda, popüler oyun 2048'in JavaScript kullanılarak kontrol edilmesine izin veren bir site oluşturdum. Sitem burada bağlı:

http://thatcoolidea.com/2048

Nasıl:

Tahtanın üstünde bir Ace Editor bulunur. Her 250 ms'de bir veya saniyede 4 kez çalıştırılan kodu yerleştirirsiniz. Buna döngü denir.

Kartı kontrol etmek için aşağıdaki yöntemleri kullanın. Ok tuşlarını kullanamazsınız.

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

Get yöntemi için yönetim kurulu haritası.

Size kolaylık sağlamak için aşağıdaki değişkenler tanımlanmıştır:

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

Kurallar:

  • Rasgelelik Yok, mantık kullanmalısınız. (Evet, örnek kodun rastgele kullanıldığını biliyorum.)
  • Oyun fonksiyonlarına takılmak veya başka şekillerde hile yapmak yok
  • Genellikle, döngü başına yalnızca bir hareket yöntemi çağırmayı deneyin. Daha fazla kullanırsanız sorun değil, ancak animasyonla birlikte
  • Yönetim kurulu rastgele bir durumda başlamalı, oyun öncesi durumda değişiklik yapılmamalıdır
  • Yayınınızdaki kodun hem sıkıştırılmamış hem de golf halindeki sürümünü sağlamalısınız.
  • PasteBin aracılığıyla sunulan, kodunuzun sıkıştırılmamış sürümünü zaten yükleyen siteye bir bağlantı sağlamalısınız (Örneğin, ... thatcoolidea.com/2048?i=pH18GWtu örnek kodu yükler.)

puanlama:

  • Kodunuz benim tarafımdan puanlanacaktır.
  • Puanınızın A Bölümü, kodun ortalama 3 çalışmasıdır ve yuvarlanır.
  • Skorunuzun B bölümü golf kodunuzun karakter uzunluğudur.
  • Nihai puanınız Bölüm A'ya ve Bölüm B'ye bölünür

Kazanan, seçtikleri takdirde kodlarını sitede örnek kod olarak ölümsüzleştirecek ve koddaki bir yorumda kabul edecektir.

İyi şanslar! Eğer meydan okuma zevk umuyoruz.

Güncel Yüksek Puan 225.22 - Dondurucu - user3217109


10
2048 için bir çerçeve yazmış olmanız, bu tür bir meydan okuma için oldukça harika ve çok uygun, ancak mevcut 2048 AI meydan okumamızda zaten bulunan stratejilerden herhangi birini nasıl etkilediğini görmüyorum.
Martin Ender

3
Ben sadece benim her yürütme aynı olacak bir kod tabanı kullanmak zorunda, çünkü benim farklı olduğunu söyleyebilirim. Bu çok daha kullanıcı dostudur ve bunun bir kopya olacağını düşünmüyorum.
Sam Weaver

2
Diğer soru oldukça ölü görünüyor. Sadece dört cevap ve bir saatlik bir zaman sınırı vardı, bu yüzden cevaplayacağım çünkü bu gerçekten harika görünüyor.
krs013

@ samweaver, diğer sorudan gelen yanıtların sorunuz için neden geçerli / rekabetçi olmadığını açıklamak için sorunuzun üstüne bir not ekleyin ve ardından inceleme için bir meta yayın oluşturun.
rdans

Bunu yapamazsanız, tekrar açabilmek için meydan okumanızı değiştirmeniz gerekir, örneğin kurallar / puanlama / kısıtlamalar
rdans

Yanıtlar:


6

Sinker / Shaker, 65 bayt

İşte benim . Geldikleri kadar kör ve basit.

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

Sıkıştırılmamış (imsi) ...

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

Tek yaptığı aşağı, sağa, aşağıya, sola vb. Tekrarlar ve sıkışırsa bir kez vurur. Her zaman çok iyi sonuç vermez, ancak zaman zaman 512 alır. Test sırasındaki yüksek puanım 7520 idi.


Şimdi puanlama sürecine başlıyorum! İlk giriş için teşekkürler!
Sam Weaver

Final Skoru: 67.6! Run 1: 3980 Run 2: 4080 Run 3: 5128 Bunu gerçekten beğendim, böyle küçük bir botla bu kadar yüksek bir puan alabileceğinizi düşünmemiştim.
Sam Weaver

Ayarladığınız için teşekkürler! Bence oldukça havalı. İnsanların şu ana kadar bu şekilde tepki vermesi üzücü. SO kullanıcıları, genellikle iyi nedenlerle, yinelenen sorulara karşı çok olumsuz olma eğilimindedir.
krs013

Neden sana teşekkür edeyim! Desteğe minnettarım! Bu proje, bir arkadaşım ve ben bir gece işte geç kaldığımız zaman ortaya çıktı ve kimin daha iyi bot yapabileceğini görmek istedik. Kodda aradım, ama iyi yapmanın bir yolunu bulamadım. Bunu çok daha kolay hale getirmek için yardımcı yöntemlerle yaptım!
Sam Weaver

3

Trafik ışığı - 23 21 bayt

move(frozen&2|eother)

Bu bağlantı.

Bu, kartın son iki hareket için hareketsiz kalması dışında, sırayla yukarı ve sağa hareket edecektir, bu durumda sırasıyla aşağı ve sola hareket edecektir.

Orijinal, işlevsel olarak eşdeğer gönderim 23 bayt uzunluğunda ve 182.72 puan aldı:

move((frozen&2)+eother)

Bu, tahtaya gerçekten bakmadan hızlıca oynadığımda yaptığımla aynı şey.
ben ve kedim

Harika iş. Yarış 1: 2208 Yarış 2: 1216 Yarış 3: 2336 23 bayt Final Skor: 182.72
Sam Weaver

2

Whirlpool - 37 21 17 bayt - Puan: 211.22

"Daha az daha fazladır" yaklaşımıyla gitmeye karar verdim. Kodum, yukarı, sağa, aşağı, sola gitmeye çalışan basit bir tasarımdır ... Bulmacana yaklaşmanın daha uygun bir yolunu görmek için bir öğrenme AI üzerinde çalışacağım.

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

Optimizer, abaşlatılmasının kısaltılmasına yardımcı oldu .

Sam abaşlangıcını kısaltmaya yardım etti , kaldırıldıvar .

Ungolfed?

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

Bu yapay zeka ile en yüksek puanım 5120.

Dondurucu - 12 bayt - Puan: 225.22

Bu botun hareket önceliği vardır. Yukarı çıkmaya çalışır. Eğer yükselebilirse, doğru gider. Eğer doğru gidemezse aşağı iner. Eğer aşağı gidemezse sola gider.

move(frozen)

James Bond Açıklaması

Şifrelenmiş kodun şifresi:

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

Optimize Edici şifresi çözülmüş kodunu yazmış olmalıydı. Bu #Optimize edilmiş olabilir.


Aslında siz de tanımlamanız gerekir a. Bu yüzden kod uzunluğuna eklenmelidir.
Doktor

Ne yazık ki, arka uç, sıfırlamalar yoluyla değişkenleri korur, böylece bir akez tanımlayabilir / başlatabilir ve unutabilirsiniz, ancak sekmeyi / pencereyi kapatıp geri dönerseniz, artık çalışacağını düşünmüyorum. Bu yüzden if (startup) bitini benimkine eklemek zorunda kaldım.
krs013

1
kullanabilirsiniz var a=a|0;move(a++%4)- 21 bayt
Optimizer

Teşekkür ederim! Daha önce hiç javascript kullanmadım, bu yüzden böyle hatalar yapacağım ...
Zylviij

Aslında A'nın tanımlanması gerekmez. A arka uçta tanımlanmıştır, bu yüzden sadece ayapmadan kullanabilirsinizvar a
Sam Weaver

1

Askı - 20 bayt

Resmi puan: 224.87 - 0.35 puanla 2. sırada

Bu bot aşağı, sol, aşağı, sağ yaklaşımı kullanır, ancak alışılmadık özelliği ile asla yukarı çıkmaz. Askıda kaldığı ve tamamlanmadığı durumları nasıl puanlayacağınızdan veya bunun gerçekleşmesinin yasadışı hale getirip getirmediğinden emin değilim. İşte burada:

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

@Optimizer sayesinde başlatma deseni.

3 test çalışmamda 4284, 6352 ve 4232 puanları ortalama 4956 puan aldı. Resmi test çalıştırıldığında güncelleneceğim.


Askıda kalan alternatif sürüm (27 bayt):

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

Bir asmak bırakmaya gerek yok, puan orada oyun bitmiş gibi ölçülecektir.
Sam Weaver

Sonuncusu hangilerden nasıl çıkıyor?
krs013

@ krs013 Sonuncusu her 4 * 997 döngüde bir yukarı hareket edecektir, bu yüzden yukarı hareket etmenin tek yolu ise yukarı hareket edecektir.
isaacg

Anladım. Bunun böyle bir şey olup olmadığını merak ettim; Sanırım yeterince beklemedim.
krs013

Final Skoru: 224.87, iyi iş çıkardın!
Sam Weaver
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.