Programmare un'intelligenza artificiale 2048 utilizzando un framework esistente


17

EDIT: Di recente, la mia domanda è stata proposta come duplicato del 2048 Bot Challenge . Vorrei sottolineare che questa domanda è diversa da quella e richiederà che le risposte siano pensate diversamente da quella domanda. 2048 Bot Challenge ha chiesto all'utente di creare un bot, che sarebbe stato eseguito per un'ora, con il punteggio più alto è il punteggio dell'utente. Inoltre, aveva un limite di 555 byte. La mia sfida esegue il codice molto meno frequentemente, solo 3 volte. Il tuo punteggio viene calcolato usando il punteggio medio di quelle tre volte e dividendolo per la lunghezza dei caratteri del tuo codice golf. La mia domanda incoraggia le voci a essere "più intelligenti" e non cercare di ottenere il punteggio più alto con la forza bruta.

-

EDIT: il metodo get è stato modificato in getTile, per evitare conflitti con la parola chiave JS get. Inoltre, è stata aggiunta una sezione con punteggio elevato.

Di recente, ho creato un sito che consente di controllare il popolare gioco 2048 tramite JavaScript. Il mio sito è collegato qui:

http://thatcoolidea.com/2048

Come:

Un Ace Editor si trova sopra il tabellone. Si inserisce il codice al suo interno, che viene eseguito una volta ogni 250 ms o 4 volte al secondo. Questo si chiama ciclo.

Utilizzare i seguenti metodi per controllare la scheda. Non puoi usare i tasti freccia.

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

Mappa della scheda per il metodo get.

Le seguenti variabili sono definite per comodità:

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

Regole:

  • Nessuna casualità, è necessario utilizzare la logica. (Sì, so che il codice di esempio usa random.)
  • Non agganciarsi alle funzioni di gioco o imbrogliare in altri modi
  • In genere, prova a chiamare un solo metodo di spostamento per ciclo. Va bene se ne usi di più, ma si avvita con l'animazione
  • Il tabellone deve iniziare in uno stato casuale, nessuna modifica dello stato pre-partita
  • Nel tuo post devi fornire sia la versione non compressa che la versione golfizzata del codice.
  • È necessario fornire un collegamento al sito che carica già la versione non compressa del codice, fornita tramite PasteBin (ad esempio, ... thatcoolidea.com/2048?i=pH18GWtu carica il codice di esempio.)

punteggio:

  • Il tuo codice verrà segnato da me.
  • La parte A del tuo punteggio è una media di 3 esecuzioni del codice, arrotondate per difetto.
  • La parte B del tuo punteggio è la lunghezza dei caratteri del tuo codice golf.
  • Il tuo punteggio finale è la parte A divisa per la parte B.

Il vincitore avrà il proprio codice immortalato come codice di esempio sul sito, se lo desidera, e riconosciuto in un commento nel codice.

In bocca al lupo! Spero ti piaccia la sfida.

Punteggio massimo attuale 225.22 - Congelatore - user3217109


10
Il fatto che tu abbia scritto un framework per il 2048 è piuttosto fantastico e molto conveniente per questo tipo di sfida, ma non vedo come influisca effettivamente su nessuna delle strategie già trovate nella nostra attuale sfida AI del 2048.
Martin Ender,

3
Bene, direi che il mio è diverso, semplicemente perché ti viene richiesto di utilizzare una base di codice che sarà la stessa ad ogni esecuzione. Questo è molto più facile da usare e non credo che costituirebbe un duplicato.
Sam Weaver,

2
L'altra domanda sembra piuttosto morta. C'erano solo quattro risposte e un limite di tempo di un'ora, quindi ho intenzione di rispondere perché sembra davvero bello.
krs013,

@samweaver aggiungi una nota all'inizio della domanda per spiegare perché le risposte dell'altra domanda non sarebbero valide / competitive per la tua domanda, quindi crea un meta post per il controllo.
rans

Se non riesci a farlo, probabilmente dovrai cambiare la tua sfida per
riaprirla,

Risposte:


6

Sinker / Shaker, 65 byte

Ecco il mio . È cieco e semplice come viene.

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

Non compresso (ish) ...

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

Tutto ciò che fa è ripetere giù, a destra, in basso, a sinistra, ecc. E colpisce una volta se rimane bloccato. Non sempre funziona molto bene, ma a volte ottiene 512s. Il mio punteggio più alto durante i test è stato di 7520.


Sto iniziando il processo di punteggio ora! Grazie per la prima iscrizione!
Sam Weaver,

Punteggio finale: 67.6! Run 1: 3980 Run 2: 4080 Run 3: 5128 Mi è davvero piaciuto, non immaginavo che avresti potuto ottenere un punteggio così alto con un bot così piccolo.
Sam Weaver,

Grazie per averlo configurato! Penso che sia abbastanza bello. È triste che le persone abbiano reagito in questo modo finora. Gli utenti SO tendono ad essere molto negativi verso domande duplicate, di solito per buoni motivi.
krs013,

Perché grazie! Apprezzo il supporto! Questo progetto è nato da quando un mio amico e io siamo stati in ritardo al lavoro una notte e volevamo vedere chi poteva fare il robot migliore. Ho cercato il codice, ma non sono riuscito a trovare un modo per farlo bene. L'ho costruito con i metodi di supporto per renderlo molto più semplice!
Sam Weaver,

3

Semaforo - 23 21 byte

move(frozen&2|eother)

Questo è il link

Questo si sposta alternativamente verso l'alto e verso destra, tranne quando la tavola è rimasta ferma per le ultime due mosse, nel qual caso si sposterà rispettivamente verso il basso e verso sinistra.

La mia presentazione originale, funzionalmente equivalente, era lunga 23 byte e segnò 182,72:

move((frozen&2)+eother)

Questa è praticamente la stessa cosa che faccio quando gioco velocemente senza davvero guardare il tabellone.
io e il mio gatto il

Lavoro eccellente. Corsa 1: 2208 Corsa 2: 1216 Corsa 3: 2336 23 byte Punteggio finale: 182.72
Sam Weaver

2

Whirlpool - 37 21 17 byte - Punteggio: 211,22

Ho deciso di seguire un approccio "less is more". Il mio codice è un design semplice che cerca di salire, a destra, in basso, a sinistra ... Lavorerò su un'intelligenza artificiale di apprendimento per vedere un modo più ottimale di affrontare il puzzle.

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

L'ottimizzatore ha contribuito a ridurre al'inizializzazione.

Sam ha contribuito a ridurre al'inizializzazione, rimosso var.

Ungolfed?

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

Il mio punteggio più alto con questa IA è 5120.

Congelatore - 12 byte - Punteggio: 225,22

Questo bot ha priorità di spostamento. Tenta di salire. Se puo 'salire, va bene. Se non può andare bene, lo fa. Se non riesce a scendere, va a sinistra.

move(frozen)

Spiegazione di James Bond

Il codice crittografato si decodifica per dire:

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

L'ottimizzatore avrebbe dovuto golfare il suo codice decrittografato. Questo avrebbe potuto essere #Ottimizzato.


Devi aanche definire davvero. Quindi dovrebbe essere aggiunto nella lunghezza del codice.
Ottimizzatore

Sfortunatamente, il backend conserva le variabili attraverso i ripristini, quindi puoi definirlo / inizializzarlo auna volta e dimenticartene, ma se chiudi la scheda / finestra e torni ad essa, non penso che funzionerà più. Questo è il motivo per cui ho dovuto aggiungere il bit if (startup) sul mio.
krs013,

1
puoi utilizzare var a=a|0;move(a++%4)- 21 byte
Ottimizzatore

Grazie! Non ho mai usato JavaScript prima, quindi commetterò errori del genere ...
Zylviij,

In realtà, A non ha bisogno di essere definito. A è definito nel backend, quindi puoi fare riferimento usando semplicemente asenza farlovar a
Sam Weaver

1

Appendiabiti - 20 byte

Punteggio ufficiale: 224,87 - 2 ° posto per 0,35 punti

Questo bot usa l'approccio down, left, down, right, ma con l'insolita caratteristica che non si sposta mai verso l'alto. Non sono sicuro di come segnare i casi in cui si blocca e non si completa o se il fatto che ciò accada lo rende illegale. Eccolo, però:

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

Schema di inizializzazione grazie a @Optimizer.

Nelle mie 3 prove, ha ottenuto 4284, 6352 e 4232, per una media di 4956. Aggiornerò quando verrà eseguito il test ufficiale.


Versione alternativa che esce dagli hang (27 byte):

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

Non c'è bisogno di lasciare il blocco, il punteggio verrà misurato lì come se il gioco fosse finito.
Sam Weaver,

Come fa l'ultimo a uscire?
krs013,

@ krs013 L'ultimo salirà una volta ogni 4 * 997 cicli, quindi se su è l'unico modo per spostarsi, si sposterà su.
isaacg,

Gotcha. Mi chiedevo se fosse qualcosa del genere; Non ho aspettato abbastanza, credo.
krs013,

Punteggio finale: 224,87, ottimo lavoro!
Sam Weaver,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.