Meta tic-tac-toe 게임을 할 수 있습니다!
이것은 Meta tic-tac-toe 의 King-of-the-hill 토너먼트입니다. 메타 틱택 토의 규칙은 다음과 같습니다.
틱택 토의 모든 규칙이 적용됩니다.
하나의 마스터 보드를 만들기 위해 9 개의 보드가 있습니다. 이렇게 :
0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8
보드 0은 왼쪽 상단 보드를 나타내고, 보드 1은 상단 중간 보드를 나타냅니다.
0|1|2 ----- 3|4|5 ----- 6|7|8
보드 3, 타일 4를 말하면 왼쪽 가운데 보드의 중앙 타일을 의미합니다.
작은 보드 중 하나만 이동할 수 있습니다.
작은 보드 중 하나를 이기면 전체 보드가 타일로 계산됩니다.
봇이이기 전에 보드 중 하나가 채워지면 아무도 타일로 계산되지 않습니다.
마스터 보드에서이기는 사람이 이깁니다!
그러나 중요한 왜곡이 있습니다. 보드 7, 타일 2에 들어간다고 가정 해 봅시다. 네 차례 에는 보드 2 에만 갈 수 있습니다 . 그런 다음 보드 2, 타일 5에 들어간다고하겠습니다. 이제 내 차례 에는 보드 5 에만 갈 수 있습니다 . 보드 1이 가득 찼습니다. (더 이상 자리가 남아 있지 않거나, 우리 중 한 명이 이미 보드 1을 획득했습니다.) 이제 보드 5, 타일 1에 들어가면 원하는 보드 중 하나에 들어갈 수 있습니다.
이러한 규칙은 다음과 같이 간주 될 수 있습니다.
- 이전 플레이어가 플레이 한 위치에 해당하는 보드에서 플레이해야합니다.
- X가 보드 2에서 재생되면 타일 5; 5 번 보드에서 플레이해야합니다
- 대상 보드가 꽉 찼거나 (타이) 이미 승리 한 경우 다음 이동은 제한되지 않습니다.
- 제한이없는 이동에서도 승자가있는 보드는 플레이 할 수 없습니다 .
약간 혼란 스러우면 여기에서 온라인으로 시도해보십시오 . ( "첫 번째 타일 승"에서 "3 개의 타일 연속"으로 전환해야 함)
이제 도전의 규칙이 있습니다.
이 게임을하는 봇을 작성해야합니다.
봇 1은 X이며 먼저 가야합니다. 다음 명령 줄 인수로 괄호 안의 내용없이 호출됩니다.
X (whose turn) --------- (board 0) --------- (board 1) --------- (board 2) --------- (board 3) --------- (board 4) --------- (board 5) --------- (board 6) --------- (board 7) --------- (board 8) --------- (master board) xx (last move)
첫 번째 캐릭터는 봇이 누구인지 나타냅니다. 이 경우 봇 1은 X로 재생됩니다. 다음 9 개 라인은 9 개 보드를 나타냅니다. 11 번째 줄은 마스터 보드를 나타냅니다. "xx"가 마지막 이동입니다. 이제 bot1은 0과 8 사이의 두 숫자를 인쇄해야합니다. 1 번은 봇이 이동하는 보드이고 2 번은 해당 보드의 타일입니다. 컨트롤러는이 이동을 추적합니다. 봇 1이 38을 인쇄한다고 가정 해 봅시다. 이제 보드는 다음과 같습니다.
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | |
bot2는 다음과 같은 인수로 호출됩니다.
O --------- --------- --------- --------X --------- --------- --------- --------- --------- --------- 38
이제 bot2는 보드 8에서 움직여야합니다 (bot1이 x를 타일 3에 배치했기 때문에). bot2가 84를 인쇄한다고 가정하겠습니다. 이제 보드는 다음과 같습니다.
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || |O| ----- || ----- || ----- | | || | | || | |
이제 bot1은 다음과 같은 인수로 호출됩니다.
X --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- 84
이제 bot1은 보드 4로 이동해야합니다. 그러나 bot1은 장난 꾸러기 작은 봇이며 보드 3으로 이동하기로 결정합니다. '30'을 인쇄합니다. 보드는 전혀 바뀌지 않습니다. 마스터 봇은이를 추적합니다. 이제 다음 인수로 bot2가 호출됩니다.
O --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- xx
이제 봇 2는 원하는 곳 어디든 갈 수 있습니다 (물론 38과 84는 제외). 누군가가 3 개의 마스터 보드를 연속으로 이길 때까지 계속됩니다. 그런 다음 bot2가 X이고 두 번째 매치업이 시작됩니다.
이것은 모든 단일 봇이 다른 모든 봇을 플레이 할 때까지 반복됩니다.
채점
점수는 다음과 같이 작동합니다.
각 경기의 승자는 100 + number of open spots
포인트를 얻습니다 . 그렇게하면 봇이 빨리이기는 것이 더 중요합니다. 봇이 유효하지 않은 움직임을 할 때마다 1 점을 잃습니다. 250 라운드 후 봇이 이기지 못하면 각 봇은 10 포인트를 잃고 다음 라운드로 넘어갑니다.
모든 것이 들어있는 디렉토리에 저장됩니다
컨트롤러 봇. 이것은 내가 작성한 C ++ 프로그램입니다. 여기 에서 컨트롤러 봇 소스 코드를 볼 수 있습니다 . 컨트롤러에 맞지 않는 것이 있으면 알려주십시오.
instructions.txt
이 파일은 다음과 같은 텍스트 파일입니다 .[Total number of bots that are competing] [bot1Name] [bot1 command to run] [bot2Name] [bot2 command to run] ...
각 봇에 대한 폴더입니다. 이 폴더에는 프로그램 (스크립트 또는 이진 파일인지 여부)과
data.txt
봇이 원하는 것을 읽고 쓸 수있는 하나의 텍스트 파일 이 있습니다.
기술 사양 및 규칙 설명
폴더 안에 있지 않은 곳에서 무언가를 읽고 쓰려고하는 봇은 게임에서 쫓겨납니다.
프로그램은 Yosemite를 실행하는 macbook에서 실행될 수 있어야합니다. 현재 지원되는 언어는 Python (2.7.9 및 3.4.2), C / C ++, objective-C, perl, ruby, bash, PHP, Java, C #, javascript 및 Haskell입니다. 더 많은 것이 있지만 이것들은 내가 지금 생각할 수있는 것입니다. 시간이 지남에 따라 더 추가하겠습니다. 특정 언어로 경쟁하고 싶다면 나에게 메시지를 보내거나 의견을 말하고 가능한 경우 목록에 추가하겠습니다.
보드가 이겼지 만 여전히 공간이 있다면 여전히 열린 지점 중 하나로 이동할 수 없습니다.
제출의 작업 디렉토리는 봇이 포함 된 디렉토리가 아니라 컨트롤러와 다른 모든 봇이 포함 된 디렉토리가됩니다.
컨트롤러 봇 코드와 함께 올바른 명령을 게시 (해당되는 경우)하고 봇을 실행하십시오. 이것의 대부분은 리눅스 터미널과 상당히 유사한 OS X 터미널에서 이루어집니다.
봇은 1 초 안에 완료해야합니다. 불행히도, 나는 컨트롤러 봇에 타이머를 추가 할만 큼 유능하지 않습니다. 그러나 수동으로 봇 시간을 정합니다.
결과!
글쎄, 나는 옳았다. 컨트롤러 봇이 masterBoard가 가득 찼는 지 확인하는 것을 잊었습니다. masterBoard가 가득 찬 경우, 모든 이동은 유효하지 않지만 봇을 계속 호출하므로 무효 이동이 너무 많을 수 있습니다. 지금 고쳤습니다. 모든 봇의 최신 버전에 대한 공식 결과는 다음과 같습니다.
Bot 1, goodRandBot, has 1 wins and made 0 illegal moves, for a total of 133 points.
Bot 2, naiveBot, has 3 wins and made 48 illegal moves, for a total of 361 points.
Bot 3, depthBot, has 5 wins and made 0 illegal moves, for a total of 664 points.
Bot 4, middleBot, has 1 wins and made 20 illegal moves, for a total of 114 points.
With 4 bots, This program took 477.471 seconds to finish.
깊이 봇은 통치 챔피언입니다! 적어도 지금은
XXX000---
어떻게 전송됩니까? 또는 'O가 먼저 이겼음에도 불구하고 아무도 그것을 얻지 못한다'입니까?