Programe uma IA 2048 usando uma estrutura existente


17

EDIT: Recentemente, minha pergunta foi proposta como uma duplicata do 2048 Bot Challenge . Eu gostaria de enfatizar que esta pergunta é diferente da pergunta e exigirá que as respostas sejam pensadas de maneira diferente da pergunta. O 2048 Bot Challenge pediu ao usuário que criasse um bot, que seria executado por uma hora, com a maior pontuação sendo a pontuação do usuário. Além disso, tinha um limite de 555 bytes. Meu desafio executa o código com muito menos frequência, apenas 3 vezes. Sua pontuação é calculada usando a pontuação média dessas três vezes e dividindo pelo comprimento do caractere do seu código de golfe. Minha pergunta incentiva as entradas a serem "mais inteligentes" e não tentar obter a pontuação mais alta por força bruta.

-

EDIT: O método get foi alterado para getTile, para evitar conflitos com a palavra-chave JS get. Além disso, uma seção de pontuação alta foi adicionada.

Recentemente, criei um site que permite que o popular jogo 2048 seja controlado usando JavaScript. Meu site está vinculado aqui:

http://thatcoolidea.com/2048

Quão:

Um Ace Editor está localizado acima do quadro. Você coloca um código nele, que é executado uma vez a cada 250 ms ou 4 vezes por segundo. Isso é chamado de ciclo.

Use os seguintes métodos para controlar o quadro. Você não pode usar as teclas de seta.

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

Mapa da placa para o método get.

As seguintes variáveis ​​são definidas para sua conveniência:

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

Regras:

  • Sem aleatoriedade, você deve usar a lógica. (Sim, eu sei que o código de exemplo usa aleatoriamente.)
  • Não há conexão com as funções do jogo ou trapaça de outras maneiras
  • Geralmente, tente chamar apenas um método de movimentação por ciclo. Tudo bem se você usar mais, mas estraga a animação
  • O tabuleiro deve começar em um estado aleatório, sem modificação do estado pré-jogo
  • Você deve fornecer a versão descompactada e golfada do código em sua postagem.
  • Você deve fornecer um link para o site que já carrega a versão não compactada do seu código, veiculada via PasteBin (por exemplo, ... thatcoolidea.com/2048?i=pH18GWtu carrega o código de exemplo.)

Pontuação:

  • Seu código será pontuado por mim.
  • A parte A da sua pontuação é uma média de 3 execuções do código, arredondadas para baixo.
  • A parte B da sua pontuação é o comprimento do caractere do seu código de golfe.
  • Sua pontuação final é a parte A dividida pela parte B

O vencedor terá seu código imortalizado como o código de exemplo no site, se desejar, e reconhecido em um comentário no código.

Boa sorte! Espero que você goste do desafio.

Pontuação máxima atual 225.22 - Freezer - user3217109


10
O fato de você ter escrito uma estrutura para 2048 é bastante impressionante e muito conveniente para esse tipo de desafio, mas não vejo como isso realmente afeta qualquer uma das estratégias já encontradas em nosso desafio existente de 2048 AI.
Martin Ender

3
Bem, eu diria que o meu é diferente, simplesmente porque você é obrigado a usar uma base de código que será a mesma a cada execução. Isso é muito mais amigável e não acho que constitua uma duplicata.
Sam Weaver

2
A outra pergunta parece bastante morta. Havia apenas quatro respostas e um prazo de uma hora, então vou responder porque isso parece muito legal.
krs013

@samweaver adicione uma observação na parte superior da sua pergunta para explicar por que as respostas da outra pergunta não seriam válidas / competitivas para a sua pergunta e, em seguida, crie uma meta post para análise.
Rdans

Se você não puder fazer isso, você provavelmente vai precisar para mudar o seu desafio, a fim de obtê-lo re-inaugurado por exemplo, regras / pontuação / restrições
rdans

Respostas:


6

Sinker / Shaker, 65 bytes

Aqui está o meu . É tão cego e simples quanto eles vêm.

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

Descompactado (ish) ...

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

Tudo o que faz é repetir para baixo, direita, baixo, esquerda, etc. e bate uma vez se ficar preso. Nem sempre funciona muito bem, mas ocasionalmente recebe 512s. Minha pontuação mais alta durante os testes foi de 7520.


Estou começando o processo de pontuação agora! Obrigado pela primeira entrada!
Sam Weaver

Pontuação final: 67,6! Execução 1: 3980 Execução 2: 4080 Execução 3: 5128 Eu realmente gostei disso, não imaginava que você pudesse obter uma pontuação tão alta com um bot tão pequeno.
Sam Weaver

Obrigado por configurá-lo! Eu acho bem legal. É triste que as pessoas tenham reagido dessa maneira até agora. Os usuários de SO tendem a ser muito negativos em relação a perguntas duplicadas, geralmente por boas razões.
krs013

Por que obrigado! Agradeço o apoio! Este projeto teve origem em quando um amigo e eu ficamos até tarde no trabalho uma noite e queríamos ver quem poderia fazer o melhor bot. Pesquisei o código, mas não consegui encontrar uma maneira de fazê-lo bem. Eu criei isso com os métodos auxiliares para tornar muito mais fácil!
Sam Weaver

3

Semáforo - 23 21 bytes

move(frozen&2|eother)

Este é o link.

Isso se moverá alternadamente para cima e para a direita, exceto quando o quadro permanecer parado nos últimos dois movimentos, caso em que se moverá para baixo e para a esquerda, respectivamente.

Meu envio original, funcionalmente equivalente, tinha 23 bytes e marcou 182,72:

move((frozen&2)+eother)

É praticamente a mesma coisa que faço quando jogo rapidamente, sem realmente olhar para o tabuleiro.
eu e meu gato

Excelente trabalho. Execute 1: 2208 Execute 2: 1216 Execute 3: 2336 23 bytes Pontuação final: 182.72
Sam Weaver

2

Hidromassagem - 37 21 17 bytes - Pontuação: 211.22

Eu decidi ir com uma abordagem "menos é mais". Meu código é um design simples que tenta subir, direita, baixo, esquerda ... Vou trabalhar em uma IA de aprendizado para ver uma maneira mais ideal de abordar o quebra-cabeça.

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

O otimizador ajudou a diminuir a a inicialização.

Sam ajudou a encurtar aa inicialização, removeuvar .

Ungolfed?

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

Minha pontuação máxima com este AI é 5120.

Congelador - 12 bytes - Pontuação: 225.22

Este bot tem prioridade de movimentação. Ele tenta subir. Se pode subir, dá certo. Se não pode dar certo, cai. Se não puder descer, vai para a esquerda.

move(frozen)

Explicação de James Bond

O código criptografado descriptografa para dizer:

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

O otimizador deveria ter jogado seu código descriptografado. Isso poderia ter sido # otimizado.


Você também precisa definir de verdade a. Portanto, isso deve ser adicionado no comprimento do código.
Optimizer

Infelizmente, o back-end preserva variáveis ​​por meio de redefinições, para que você possa definir / inicializar auma vez e esquecê-lo, mas se você fechar a guia / janela e voltar a ele, acho que não funcionará mais. É por isso que eu tive que adicionar o bit if (inicialização) no meu.
precisa saber é o seguinte

11
você pode usar var a=a|0;move(a++%4)- 21 bytes
Optimizer

Obrigado! Eu nunca usei javascript antes, então vou cometer erros assim ...
Zylviij

Na verdade, A não precisa ser definido. A é definido no back-end, para que você possa referenciá-lo usando apenasa sem fazervar a
Sam Weaver

1

Cabide - 20 bytes

Pontuação oficial: 224,87 - 2º lugar por 0,35 pontos

Este bot usa a abordagem para baixo, esquerda, baixo, direita, mas com o recurso incomum de que nunca subirá. Não tenho certeza de como classificar os casos em que ele trava e não é concluído, ou se o fato de que isso ocorre a torna ilegal. Aqui está, no entanto:

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

Padrão de inicialização graças ao @Optimizer.

Nas minhas 3 execuções de teste, obteve 4284, 6352 e 4232, para uma média de 4956. Eu atualizarei quando o teste oficial for executado.


Versão alternativa que fica paralisada (27 bytes):

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

Não há necessidade de deixar um jeito, a pontuação será medida apenas como se o jogo tivesse terminado.
Sam Weaver

Como o último sai de trava?
krs013

@ krs013 O último subirá uma vez a cada 4 * 997 ciclos; portanto, se for a única maneira de se mover, ele subirá.
Isaacg #

Peguei vocês. Eu me perguntava se era algo assim; Só não esperei o suficiente, eu acho.
krs013

Pontuação final: 224,87, ótimo trabalho!
Sam Weaver
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.