Programmieren Sie eine 2048 AI mit einem vorhandenen Framework


17

EDIT: Vor kurzem wurde meine Frage als Duplikat von 2048 Bot Challenge vorgeschlagen . Ich möchte betonen, dass sich diese Frage von dieser Frage unterscheidet und dass die Antworten anders gedacht werden müssen als diese Frage. 2048 Bot Challenge hat den Benutzer gebeten, einen Bot zu erstellen. Dieser wird eine Stunde lang ausgeführt, wobei die höchste Punktzahl die Punktzahl des Benutzers ist. Darüber hinaus hatte es ein Limit von 555 Bytes. Meine Challenge führt den Code viel seltener aus, nur dreimal. Ihre Punktzahl wird berechnet, indem Sie die durchschnittliche Punktzahl dieser drei Male verwenden und durch die Zeichenlänge Ihres Golf-Codes dividieren. Meine Frage ermutigt die Teilnehmer, "schlauer" zu sein und nicht zu versuchen, die höchste Punktzahl mit roher Gewalt zu erzielen.

-

BEARBEITEN: Die get-Methode wurde in getTile geändert, um Konflikte mit dem JS-Schlüsselwort get zu vermeiden. Zusätzlich wurde ein Highscore-Bereich hinzugefügt.

Kürzlich habe ich eine Site erstellt, mit der das beliebte Spiel 2048 mit JavaScript gesteuert werden kann. Meine Seite ist hier verlinkt:

http://thatcoolidea.com/2048

Wie:

Ein Ass-Editor befindet sich über der Tafel. Sie platzieren Code darin, der einmal alle 250 ms oder viermal pro Sekunde ausgeführt wird. Dies nennt man einen Zyklus.

Verwenden Sie die folgenden Methoden, um die Karte zu steuern. Sie können die Pfeiltasten nicht verwenden.

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

Karte der Karte für die get-Methode.

Die folgenden Variablen werden zur Vereinfachung definiert:

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

Regeln:

  • Keine Zufälligkeit, Sie müssen Logik verwenden. (Ja, ich weiß, dass der Beispielcode zufällig verwendet wird.)
  • Kein Hängenbleiben an den Spielfunktionen oder Betrügen auf andere Weise
  • Versuchen Sie im Allgemeinen, nur eine Verschiebungsmethode pro Zyklus aufzurufen. Es ist in Ordnung, wenn Sie mehr verwenden, aber es passt zur Animation
  • Das Brett muss in einem zufälligen Zustand beginnen, keine Änderung des Zustands vor dem Spiel
  • Sie müssen sowohl die unkomprimierte als auch die Golf-Version des Codes in Ihrem Beitrag angeben.
  • Sie müssen einen Link zu der Site bereitstellen, die bereits die unkomprimierte Version Ihres Codes lädt, die über PasteBin bereitgestellt wird. (Beispiel: ... thatcoolidea.com/2048?i=pH18GWtu lädt den Beispielcode.)

Wertung:

  • Ihr Code wird von mir bewertet.
  • Teil A Ihrer Punktzahl ist ein Durchschnitt von 3 Läufen des Codes, abgerundet.
  • Teil B Ihrer Punktzahl ist die Zeichenlänge Ihres Golf-Codes.
  • Ihre endgültige Punktzahl ist Teil A geteilt durch Teil B

Der Code des Gewinners wird auf Wunsch als Beispielcode auf der Site verewigt und in einem Kommentar im Code bestätigt.

Viel Glück! Ich hoffe, Sie genießen die Herausforderung.

Aktueller Höchststand 225.22 - Gefrierschrank - user3217109


10
Die Tatsache, dass Sie ein Framework für 2048 geschrieben haben, ist ziemlich beeindruckend und sehr praktisch für diese Art von Herausforderung, aber ich verstehe nicht, wie sich dies tatsächlich auf eine der Strategien auswirkt, die bereits in unserer bestehenden 2048 AI-Herausforderung gefunden wurden.
Martin Ender

3
Nun, ich würde sagen, dass meins anders ist, einfach weil Sie eine Codebasis verwenden müssen, die bei jeder Ausführung dieselbe sein wird. Dies ist viel benutzerfreundlicher und ich denke nicht, dass es ein Duplikat darstellen würde.
Sam Weaver

2
Die andere Frage sieht ziemlich tot aus. Es gab nur vier Antworten und ein Zeitlimit von einer Stunde, deshalb werde ich antworten, weil das wirklich cool aussieht.
krs013

@samweaver Fügen Sie eine Notiz oben in Ihre Frage ein, um zu erklären, warum Antworten aus der anderen Frage für Ihre Frage nicht gültig / wettbewerbsfähig sind, und erstellen Sie dann einen Metapost zur Überprüfung.
25.

Wenn Sie das tun können nicht, werden Sie wahrscheinlich benötigen , um Ihre Herausforderung zu ändern , um es zu bekommen zB Regeln wieder eröffnet / Kerb / Einschränkungen
rdans

Antworten:


6

Sinker / Shaker, 65 Bytes

Hier ist meins . Es ist so blind und einfach wie sie kommen.

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

Unkomprimiert (ish) ...

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

Alles, was es tut, ist, nach unten, rechts, unten, links usw. zu wiederholen und einmal zu schlagen, wenn es stecken bleibt. Es funktioniert nicht immer sehr gut, aber es wird gelegentlich 512s bekommen. Mein Highscore beim Testen war 7520.


Ich beginne jetzt mit der Wertung! Danke für den ersten Eintrag!
Sam Weaver

Endergebnis: 67,6! Lauf 1: 3980 Lauf 2: 4080 Lauf 3: 5128 Mir hat das sehr gut gefallen, ich hatte nicht die Vorstellung, dass man mit einem so kleinen Bot eine so hohe Punktzahl erzielen kann.
Sam Weaver

Vielen Dank für die Einrichtung! Ich finde es ziemlich cool. Es ist traurig, dass die Leute bisher so reagiert haben. SO-Benutzer neigen dazu, doppelten Fragen gegenüber sehr negativ zu sein, in der Regel aus guten Gründen.
krs013

Warum Danke! Ich bedanke mich für die Unterstützung! Dieses Projekt entstand, als ein Freund und ich eine Nacht lang auf der Arbeit blieben und sehen wollten, wer den besseren Bot machen könnte. Ich habe den Code durchsucht, aber ich konnte keinen Weg finden, es gut zu machen. Ich habe dies mit den Hilfsmethoden erstellt, um es so viel einfacher zu machen!
Sam Weaver

3

Ampel - 23 21 Bytes

move(frozen&2|eother)

Das ist die Verbindung.

Dieser bewegt sich abwechselnd nach oben und rechts, es sei denn, das Brett ist in den letzten beiden Zügen stationär geblieben. In diesem Fall bewegt es sich nach unten bzw. links.

Meine ursprüngliche, funktional äquivalente Übermittlung war 23 Bytes lang und erzielte 182,72:

move((frozen&2)+eother)

Das ist so ziemlich dasselbe, was ich mache, wenn ich schnell spiele, ohne wirklich auf das Brett zu schauen.
Ich und meine Katze

Ausgezeichnete Arbeit. Lauf 1: 2208 Lauf 2: 1216 Lauf 3: 2336 23 Bytes Endergebnis: 182,72
Sam Weaver

2

Whirlpool - 37 21 17 Bytes - Ergebnis: 211,22

Ich entschied mich für einen Ansatz mit dem Motto "Weniger ist mehr". Mein Code ist ein einfaches Design, das versucht, nach oben, rechts, unten, links zu gehen. Ich werde an einer lernenden KI arbeiten, um einen optimaleren Weg zu finden, sich dem Puzzle zu nähern.

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

Das Optimierungsprogramm hat dazu beigetragen, die aInitialisierung zu verkürzen .

Sam half bei der Verkürzung ader Initialisierung, entfernt var.

Ungolfed?

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

Meine Höchstpunktzahl mit dieser KI ist 5120.

Gefrierschrank - 12 Bytes - Score: 225,22

Dieser Bot hat Bewegungspriorität. Es versucht zu steigen. Wenn es hoch gehen kann, geht es richtig. Wenn es nicht richtig geht, geht es runter. Wenn es nicht runter geht, geht es nach links.

move(frozen)

James Bond Erklärung

Der verschlüsselte Code entschlüsselt zu sagen:

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

Der Optimierer hätte seinen entschlüsselten Code spielen sollen. Dies könnte #Optimiert worden sein.


Man muss eigentlich auch definieren a. Das sollte also in der Codelänge hinzugefügt werden.
Optimierer

Leider behält das Backend Variablen durch Zurücksetzen bei, so dass Sie sie einmal definieren / initialisieren aund vergessen können, aber wenn Sie die Registerkarte / das Fenster schließen und darauf zurückkommen, wird es meiner Meinung nach nicht mehr funktionieren. Aus diesem Grund musste ich mein if-Bit (Startup-Bit) hinzufügen.
krs013

1
Sie können verwenden var a=a|0;move(a++%4)- 21 Bytes
Optimierer

Vielen Dank! Ich habe noch nie Javascript verwendet, also mache ich
solche

Eigentlich muss A nicht definiert werden. A ist im Backend definiert, so dass Sie es aohne weiteres referenzieren könnenvar a
Sam Weaver

1

Aufhänger - 20 Bytes

Offizielle Wertung: 224,87 - 2. Platz mit 0,35 Punkten

Dieser Bot benutzt den Abwärts-, Links-, Abwärts-, Rechts-Ansatz, aber mit der ungewöhnlichen Eigenschaft, dass er sich niemals nach oben bewegt. Ich bin nicht sicher, wie ich Fälle bewerten soll, in denen es hängt und nicht abgeschlossen ist, oder ob die Tatsache, dass dies auftritt, es illegal macht. Hier ist es jedoch:

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

Initialisierungsmuster dank @Optimizer.

In meinen drei Testläufen wurden im Durchschnitt 4284, 6352 und 4232 Punkte erzielt, was 4956 Punkten entspricht.


Alternative Version, die nicht mehr reagiert (27 Byte):

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

Sie müssen sich nicht aufhalten, die Punktzahl wird nur dort gemessen, als wäre das Spiel vorbei.
Sam Weaver

Wie kommt der Letzte aus den Hängen?
krs013

@ krs013 Der letzte wird alle 4 * 997 Zyklen nach oben verschoben. Wenn also nur nach oben verschoben werden kann, wird nach oben verschoben.
Isaacg

Erwischt. Ich fragte mich, ob es so etwas war. Ich habe einfach nicht lange genug gewartet.
krs013

Endergebnis: 224,87, großartige Arbeit!
Sam Weaver
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.