Threes 게임용 AI! Sirvo LLC에 의해. 여기에서 게임을 다운로드할 수 있습니다: http://asherv.com/ threes/
이 AI를 구축하는 것은 나의 후기 2048 AI에 영감을 주었으며, 2048 AI의 일부 아이디어도 이 AI에 백포트되었습니다.
아직 이 AI의 성능을 공식적으로 벤치마킹하지는 않았지만 게임에서 사용할 수 있는 가장 높은 타일인 6144 타일을 여러 번 성공적으로 획득한 것으로 알고 있습니다. (더 높은 타일도 가능하지만 무작위 효과가 크기 때문에 가능성은 낮습니다.) (작성 당시) 최고 점수는 775,524점입니다.
이 AI는 Threes의 복잡성이 증가했기 때문에 새로운 형제인 2048 AI보다 훨씬 더 실험적입니다! 개발 시간을 많이 받지 못했기 때문입니다. 게다가 쓰리즈! 무작위 타일 생성 알고리즘이 때때로 조정되어 AI의 변경이 필요하기 때문에 일반적으로 약간 움직이는 대상입니다.
이 AI의 알고리즘은 내 2048 AI를 설명하는 이 StackOverflow 답변에 이미 본질적으로 자세히 설명되어 있습니다. 본질적으로 이는 게임 트리(가능한 모든 이동, 타일 생성 값 및 타일 값)에 대해 고도로 최적화된 무차별 대입 검색을 구현하며, 예상 최대 최적화를 사용하여 결과를 결합하고 가능한 "최상의" 이동을 찾습니다.
이 Threes AI는 실제로 여러 가지 면에서 2048 AI보다 더 정교합니다. 가장 주목할만한 점은 다가오는 타일의 "데크"(임의로 들어오는 타일을 선택하는 잘 문서화된 프로세스)를 설명하고 적절하게 처리한다는 것입니다. 수행된 이동을 기반으로 가능한 모든 타일 생성 위치. 간단히 말해서, 이 Threes AI는 (내가 아는 한) Expectimax 최적화 프로세스의 일부로 Threes 게임의 모든 세부 사항을 올바르게 에뮬레이트합니다.
AI를 실행하는 가장 쉬운 방법은 OS 및 프로세서에 해당하는 prebuilt/
브랜치 중 하나를 복제하는 것입니다. 이러한 분기에는 bin/
디렉터리에 미리 빌드된 바이너리가 있습니다.
Windows의 "기본" Python은 32비트인 반면, OS X 및 Linux의 "기본" Python은 64비트입니다. 32비트 빌드에는 i386
태그가 지정되고 64비트 빌드에는 x86_64
태그가 지정됩니다.
소스에서 직접 빌드하려면(예: 변경하는 경우) 아래 지침을 따르세요.
실행하다
./configure
make
터미널에서. 비교적 최신 C++ 컴파일러에서는 출력을 빌드할 수 있어야 합니다.
make install
수행하지 않는다는 점에 유의하세요. 이 프로그램은 이 디렉토리에서 실행되도록 되어 있습니다.
설치한 항목에 따라 몇 가지 옵션이 있습니다.
순수 Cygwin: 위의 Unix/Linux/OS X 지침을 따르세요. 결과 DLL은 Cygwin 프로그램 에서만 사용할 수 있으므로 브라우저 제어 버전을 실행하려면 Cygwin Python(python.org Python 아님)을 사용해야 합니다. 단계별 지침은 Tamas Szell(@matukaa)이 제공한 이 문서를 참조하세요.
MinGW를 사용한 Cygwin: 실행
CXX=x86_64-w64-mingw32-g++ CXXFLAGS='-static-libstdc++ -static-libgcc -D_WINDLL -D_GNU_SOURCE=1' ./configure ; make
MinGW 또는 Cygwin 쉘에서 빌드합니다. 결과 DLL은 Cygwin이 아닌 프로그램에서 사용할 수 있습니다.
Visual Studio: Visual Studio 명령 프롬프트를 열고 threes-ai 디렉터리로 cd
후 make-msvc.bat
실행합니다.
Python 프로그램을 실행하려면 Python 2.7, NumPy 및 PIL이 필요합니다.
AI 자체가 작동하는 모습을 보려면 bin/threes
실행하세요.
Threes의 웹 기반 버전도 있지만 AI가 실제 앱과 비교되도록 만들고 싶었습니다. 그래서 나는 ADB를 통해 휴대폰과 통신하고 완전히 자동으로 움직이는 android_assistant.py
라는 Android 장치용 "보조" 프로그램을 만들었습니다. USB ADB 권한(표준 개발자 액세스)만 필요하며 루팅이나 장치 또는 앱의 기타 수정이 필요하지 않습니다. 표준 Android screencap
유틸리티를 사용하여 (표시되는) 게임 상태를 획득하고 최적의 이동을 계산한 다음 Linux 입력 이벤트 하위 시스템을 사용하여 스와이프 이벤트를 생성합니다.
android_assistant.py
사용하려면 장치에 대한 OCR 하위 시스템을 구성해야 합니다. 또한 재생을 위해 살짝 밀기 이벤트를 기록해야 합니다. 현재 LG Nexus 5와 OnePlus One(제가 테스트한 휴대폰에 해당)이라는 두 개의 장치가 구성되어 있습니다. 패치를 통해 더 많은 전화기를 추가할 수 있습니다.
OCR 시스템을 구성하려면 장치에 해당하는 ocr/devices.py
에 항목을 추가해야 합니다. 모델 이름은 기기에 연결되어 있는 동안 android_assistant.py
실행하면 얻을 수 있습니다(예상 모델 이름으로 오류가 발생해야 함). 기본적으로 게임의 스크린샷을 찍어 "다가오는 타일" 창의 위치와 타일 그리드의 위치 및 간격을 파악해야 합니다. (이 부분에는 더 많은 자동화 및/또는 단순화가 필요할 수 있습니다!)
이벤트를 기록하려면 python -m android.inputemu --record up down left right
실행하고 메시지가 표시되면 휴대폰에서 적절한 동작을 실행하면 됩니다.
수동 어시스턴트는 범용 Threes입니다! Threes!의 모든 구현과 함께 작동하는 어시스턴트!. 보드와 앞으로 나올 타일 세트를 알려주면 보조원이 최선의 수를 계산합니다.
manual_assistant.py
실행하여 수동 도우미를 시작하세요.
수동 보조자는 순차적인 움직임을 기대합니다. 앞으로 건너뛰는 경우(어시스턴트 없이 이동) Ctrl+C를 눌러 어시스턴트를 종료했다가 다시 시작하세요. 그렇지 않으면 이전 보드와 순차적이지 않은 보드를 입력할 경우 "불가능한 상황"과 같은 오류 메시지가 나타날 수 있습니다.
다음 보드에 들어갈 때 공백, 줄 바꿈 및/또는 쉼표를 사용하여 타일을 구분할 수 있습니다. 왼쪽에서 오른쪽으로 읽은 다음 위에서 아래로 읽습니다. 빈 공간에는 0을 입력하세요. 입력 예:
쉼표와 줄 바꿈 사용:
96,2,3,0
2,1,1,0
2,1,0,0
0,0,2,0
쉼표만 사용:
96,2,3,0,2,1,1,0,2,1,0,0,0,0,2,0
공백 사용:
96 2 3 0
2 1 1 0
2 1 0 0
0 0 2 0
이전 보드에서 "델타"를 입력할 수도 있습니다. 새 타일이 생성된 행 또는 열과 생성된 타일의 값을 지정합니다(마지막으로 이동할 수 있는 새 타일이 하나만 있는 경우(예: 빨간색 또는 파란색인 경우) 이를 생략할 수 있습니다). 또한 AI가 제안한 이동이 아닌 경우 수행한 이동을 지정하십시오.
열과 행은 왼쪽에서 오른쪽, 위에서 아래로 번호가 지정됩니다. 열 1은 왼쪽 열이고 행 1은 맨 위 행입니다.
예를 들어, 보드를 위로 스와이프하고
96 2 3 0
2 1 1 0
2 1 0 0
0 0 2 0
에게
96 3 3 0
2 1 1 0
2 0 2 0
0 3 0 0
그런 다음 2,3,up
보드로 보냅니다(두 번째 열에서는 3이 생성됨). AI가 up
이동을 권장했다면 이를 생략하고 2,3
보낼 수 있습니다. 다가오는 타일이 3으로 예측된 경우 3을 생략하고 2
만 보낼 수 있습니다.
델타를 입력하면 많은 시간을 절약할 수 있습니다. 대부분의 경우 하나의 숫자(변경된 열/행)만 입력하면 됩니다.
다음 타일을 입력할 때 다음 형식 중 하나를 사용하십시오.
blue
(1), red
(2) 또는 white
(3+)1
, 2
, 3
, 3+
, 6+
또는 예: 24,48,96
, 24 48 96
3+
3 이상이 될 수 있음을 의미합니다. 이전 Threes와 함께 사용하세요! 보너스 타일에 "더하기" 기호가 표시되지 않는 것6+
보너스 타일임을 의미합니다. 다가오는 타일이 "+"인 경우 이것을 사용하십시오.24,48,96
이 세 가지 중 하나를 의미합니다. 최신 Threes와 함께 사용하세요! 보너스 타일 값에 대한 명시적인 옵션을 보여줍니다.