기존 프레임 워크를 사용하여 2048 AI 프로그래밍


17

편집 : 최근에, 내 질문은 2048 봇 도전 의 복제본으로 제안되었습니다 . 나는이 질문이 그 질문과 다르다는 점을 강조하고 싶습니다. 그리고 그 질문과는 다른 답을 생각해야합니다. 2048 Bot Challenge는 사용자에게 봇을 만들도록 요청했으며 1 시간 동안 실행되며 최고 점수는 사용자의 점수입니다. 또한 555 바이트로 제한되었습니다. 내 도전은 코드를 훨씬 적게 자주 3 번 실행합니다. 점수는이 세 번의 평균 점수를 사용하여 골프 코드의 문자 길이로 나누어 계산합니다. 제 질문은 출품작이 "더 똑똑해 지도록"권장하고 무차별 대입으로 최고 점수를 얻으려고하지 않습니다.

-

편집 : get 키워드는 JS 키워드 get과의 충돌을 피하기 위해 getTile로 변경되었습니다. 또한, 높은 점수 섹션이 추가되었습니다.

최근에 인기있는 게임 2048을 JavaScript를 사용하여 제어 할 수있는 사이트를 만들었습니다. 내 사이트는 여기에 링크되어 있습니다 :

http://thatcoolidea.com/2048

어떻게:

에이스 에디터는 보드 위에 있습니다. 코드는 250ms마다 한 번씩 또는 초당 4 번 실행되는 코드를 넣습니다. 이것을주기라고합니다.

보드를 제어하려면 다음 방법을 사용하십시오. 화살표 키를 사용할 수 없습니다.

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 메소드의 보드 맵

편의를 위해 다음 변수가 정의되어 있습니다.

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

규칙 :

  • 임의성이 없으므로 논리를 사용해야합니다. (예, 예제 코드가 무작위를 사용한다는 것을 알고 있습니다.)
  • 게임 기능에 푹 빠지거나 다른 방법으로 부정 행위 없음
  • 일반적으로주기 당 하나의 이동 메소드 만 호출하십시오. 더 많이 사용하면 괜찮지 만 애니메이션으로 조이십시오.
  • 보드는 무작위 상태에서 시작해야하며, 게임 전 상태는 수정하지 않아야합니다.
  • 게시물에 압축되지 않은 버전의 코드를 제공해야합니다.
  • PasteBin을 통해 제공되는 압축되지 않은 코드 버전을 이미로드하는 사이트에 대한 링크를 제공해야합니다 (예 : ... thatcoolidea.com/2048?i=pH18GWtu는 예제 코드를로드 함).

채점 :

  • 귀하의 코드는 나에 의해 점수가 매겨 질 것입니다.
  • 점수의 A 부분은 평균 3 번의 코드 실행으로 반올림됩니다.
  • 점수의 파트 B는 골프 코드의 문자 길이입니다.
  • 최종 점수는 파트 A를 파트 B로 나눈 값입니다.

우승자는 코드를 선택하고 코드의 주석에서 확인 된 경우 코드를 사이트의 예제 코드로 불멸화합니다.

행운을 빕니다! 당신이 도전을 즐기시기 바랍니다.

현재 최고 점수 225.22-냉동고-user3217109


10
2048에 대한 프레임 워크를 작성했다는 사실은 이러한 유형의 도전에 매우 훌륭하고 매우 편리하지만 기존 2048 AI 도전에서 이미 발견 된 전략에 실제로 어떤 영향을 미치는지 알 수 없습니다.
마틴 엔더

3
글쎄, 내 것이 다르다고 말할 것입니다. 단순히 각 실행마다 동일한 하나의 코드베이스를 사용해야하기 때문입니다. 이것은 훨씬 사용자 친화적이며 복제본이 될 것이라고 생각하지 않습니다.
Sam Weaver

2
다른 질문은 꽤 죽어 보입니다. 4 개의 답변과 1 시간의 시간 제한이 있었으므로 정말 멋져 보이기 때문에 대답하겠습니다.
krs013

@samweaver는 질문 상단에 메모를 추가하여 다른 질문의 답변이 귀하의 질문에 대해 유효 / 경쟁적이지 않은 이유를 설명한 다음 조사를위한 메타 게시물을 만듭니다.
rdans

그렇게 할 수 없다면, 규칙 / 점수 / 제한과 같은 문제를 다시 열려면 도전을 바꿔야 할 것입니다
rdans

답변:


6

싱커 / 쉐이커, 65 바이트

다음은 내 꺼야 . 맹목적이고 간단합니다.

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

비 압축 (ish) ...

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

그것은 아래로, 오른쪽으로, 아래로, 왼쪽으로 반복되고 멈 추면 한 번만 공격합니다. 항상 잘하는 것은 아니지만 때때로 512를 얻습니다. 시험 중 제 최고 점수는 7520입니다.


나는 지금 득점 과정을 시작하고 있습니다! 첫 참가 감사합니다!
Sam Weaver

최종 점수 : 67.6! 런 1 : 3980 런 2 : 4080 런 3 : 5128 나는이 점이 정말 마음에 들었다.
Sam Weaver

설정해 주셔서 감사합니다! 꽤 멋지다고 생각합니다. 사람들이 지금까지 이런 식으로 반응 한 것은 슬픈 일입니다. SO 사용자는 일반적으로 좋은 이유로 중복 질문에 대해 매우 부정적인 경향이 있습니다.
krs013

왜 감사합니다! 지원해 주셔서 감사합니다! 이 프로젝트는 친구와 내가 어느 날 밤 늦게까지 일하면서 누가 더 나은 봇을 만들 수 있는지 알고 싶었습니다. 코드를 검색했지만 제대로 수행 할 수있는 방법을 찾지 못했습니다. 나는 이것을 훨씬 더 쉽게하기 위해 도우미 메소드로 이것을 만들었습니다!
Sam Weaver

3

신호등 -23 21 바이트

move(frozen&2|eother)

이것은 링크입니다.

마지막 두 번의 움직임에 대해 보드가 정지 상태 인 경우를 제외하고는 위아래로 교대로 이동합니다.

기능적으로 동등한 원래의 제출물은 길이가 23 바이트이며 182.72를 기록했습니다.

move((frozen&2)+eother)

이것은 실제로 보드를 보지 않고 빠르게 게임을 할 때와 거의 같습니다.
나와 내 고양이

잘했습니다. 실행 1 : 2208 실행 2 : 1216 실행 3 : 2336 23 바이트 최종 점수 : 182.72
Sam Weaver

2

월풀 -37 21 17 바이트-점수 : 211.22

나는 "더 적을수록"접근하기로 결정했습니다. 내 코드는 위, 아래, 왼쪽으로 올라가는 단순한 디자인입니다. 저는 퍼즐에 접근하는 더 최적의 방법을 찾기 위해 학습 AI를 연구 할 것입니다.

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

최적화 도구가 a초기화 를 단축하는 데 도움이되었습니다 .

Sam은 a초기화 를 단축하는 데 도움을 주었다 var.

언 골프?

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

이 AI의 최고 점수는 5120입니다.

냉동고-12 바이트-점수 : 225.22

이 봇은 이동 우선 순위를 갖습니다. 올라 가려고합니다. 올라갈 수 있다면 제대로됩니다. 제대로 작동하지 않으면 작동하지 않습니다. 내려갈 수 없으면 왼쪽으로갑니다.

move(frozen)

제임스 본드 설명

암호화 된 코드는 다음과 같이 해독합니다.

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

최적화 프로그램은 해독 된 코드를 골라 내야합니다. 이것은 # 최적화되었을 수 있습니다.


실제로도 정의해야합니다 a. 따라서 코드 길이에 추가해야합니다.
Optimizer

불행히도 백엔드는 재설정을 통해 변수를 유지하므로 a한 번 정의 / 초기화 하고 잊어 버릴 수 있지만 탭 / 창을 닫고 다시 돌아 오면 더 이상 작동하지 않을 것이라고 생각합니다. 그렇기 때문에 if (startup) 비트를 추가해야했습니다.
krs013

1
당신은 사용할 수 있습니다 var a=a|0;move(a++%4)-21 바이트
Optimizer

감사합니다! 나는 한 번도 자바 스크립트를 사용한 적이 없으므로, 그런 실수를 할 것입니다 ...
Zylviij

실제로 A를 정의 할 필요는 없습니다. A는 백엔드에 정의되어 있으므로 a수행하지 않고도 그대로 사용할 수 있습니다.var a
Sam Weaver

1

행거-20 바이트

공식 점수 : 224.87-0.35 포인트 2 위

이 봇은 아래로, 왼쪽으로, 아래로, 오른쪽으로 접근하지만, 절대 움직이지 않는 특이한 기능을 사용합니다. 중단되고 완료되지 않은 사례의 점수를 매기는 방법 또는 발생한 사실이 불법인지 여부를 잘 모르겠습니다. 그러나 여기 있습니다.

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

@Optimizer 덕분에 초기화 패턴.

3 번의 테스트에서 평균 4956 점으로 4284, 6352 및 4232를 기록했습니다. 공식 테스트가 실행될 때 업데이트하겠습니다.


중단되는 대체 버전 (27 바이트) :

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

교수형을 떠날 필요가 없으며 점수는 마치 게임이 끝난 것처럼 측정됩니다.
Sam Weaver

마지막 것은 어떻게 중단됩니까?
krs013

@ krs013 마지막 것은 4 * 997 사이클마다 한 번씩 올라가므로 위로 이동하는 유일한 방법이면 위로 이동합니다.
isaacg

알았어 그것이 그런 것인지 궁금했습니다. 난 그냥 오래 기다리지 않았어요
krs013

최종 점수 : 224.87, 훌륭합니다!
Sam Weaver
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.