배경
Morra 의 게임은 간단한 게임입니다. "원본"버전에서는 여러 플레이어가 동시에 모든 손의 총합을 추측하면서 손으로 숫자 0-5를 버립니다. 여기서 사용할 버전은 사소한 전략의 가능성을 높이기 위해 수정되었으며 아래에 설명되어 있습니다.
- 두 선수가 있습니다.
- 가위 바위 보처럼 플레이어도 동시에 움직입니다.
- 매 턴마다 각 플레이어는 0-5의 숫자를 선택하고 상대방의 0-5 선택을 추측 합니다. 이것은 매 턴마다 두 개의 숫자가 출력됨을 의미합니다. 명확히하기 위해 두 숫자 출력은 0-5 범위에 있어야합니다.
- 상대방의 선택을 정확하게 추측했지만 상대방이 정확하게 추측하지 못하면 두 숫자의 합과 같은 특정 수의 점수를 얻습니다. 예를 들어, 연주 한 숫자가 3과 5 인 경우 정확한 추측은 8 포인트입니다.
- 둘 다 또는 두 선수 모두 정확하게 추측하지 않으면 점수가 부여되지 않습니다.
- 1000 라운드 후 가장 많은 점수를 얻은 사람이 그 게임에서 승리합니다.
토너먼트
토너먼트는 라운드 로빈 스타일로 진행되며 가능한 각 참가자 쌍을 만들어 진행됩니다. 각 승리마다 참가자는 2 점을 얻습니다. 각 타이는 1 승점을 얻습니다. 손실로 인한 승점은 없습니다.
직관적으로 토너먼트의 승자는 다른 사람에 대해 가장 많은 승점을 가진 참가자가됩니다.
들어가는 방법
봇을 제출하여 경쟁하는 두 가지 방법이 있습니다. 가장 선호되는 첫 번째 방법은 컨트롤러가 제공하는 Java 인터페이스를 구현하는 것입니다. 두 번째 방법은 독립 프로그램을 작성하는 것입니다.
Java 메소드를 먼저 다루겠습니다. 당신이 구현해야하는 인터페이스입니다 Player
: 그것은 두 가지 방법을 정의 public String getName()
하여 로봇을 식별하고, public int[] getMove(String[] args)
소요 args
, 6 문자열의 배열로 mychoices myguesses myscore opponentchoices opponentguesses opponentscore
. 예를 들면 다음과 같습니다.
042 045 0 324 432 6
이것은 내가 1 라운드에서 0을 선택했고 상대방이 0을 던질 것이라고 추측했다. 상대방은 3을 던지고 4를 던질 것이라고 추측했다. 2, 그는 2 + 4 = 6 포인트를 얻는 것을 의미합니다.
당신의 방법은 각각 당신이 선택하고 추측하는 두 정수의 배열을 반환합니다. 예를 들면{4,2}
4를 선택하고 2를 추측하는 것입니다.
다음은 메소드로 작성된 완전한 Java 봇의 예입니다. 원하는 경우 제출물에는 getMove
방법에 진행중인 내용 만 포함하면 됩니다.
import java.util.Random;
/**
* A simple example Morra bot to get you started.
*/
public class ExampleBot implements Player
{
public String getName()
{
return "ExampleBot";
}
public int[] getMove(String [] args)
{
//easiest way I know to break down to create a move history
//(just contains their throw history)
char[] theirThrowsC = args[3].toCharArray();
int[] theirThrows = new int[theirThrowsC.length];
for(int i = 0; i < theirThrowsC.length; i++)
{
theirThrows[i] = Integer.parseInt(Character.toString(theirThrowsC[i]));
}
//get my score
int myScore = Integer.parseInt(args[2]);
Random r = new Random();
int guess = r.nextInt(6);
if(theirThrows.length > 0)
{
guess = theirThrows[theirThrows.length-1];
}
//throws a random number, guesses what they threw last
return new int[] {r.nextInt(6),guess};
}
public static int otherMethod(int example) //you can write additional static methods
{
return 0;
}
}
독립 프로그램으로
현재 추가 언어 지원이 제한되어 있습니다. Java 외에도 Python 3.4, Perl 5 또는 Ruby 2.1.5로 작성된 프로그램을 사용할 수 있습니다. 여러 사람들이 원하는 언어가 있다면 추가하기 위해 최선을 다하겠습니다.
프로그램에 대한 입력은 명령 행에서 인수가됩니다. 다음과 같이 보일 수 있습니다 :
perl awesomebot.plx 042 045 0 324 432 6
프로그램의 결과는 당신의 선택과 추측, 각각의 공백으로 이루어져야합니다.
답을 실행하는 데 필요한 정확한 명령을 답에 포함하십시오. Windows 8.1을 실행하고 있습니다.
추가 규칙
상태 및 시간 초과 저장
프로그램은 정보를 저장할 수있는 로컬 디렉토리에 하나의 텍스트 파일을 작성할 수 있습니다. 이 정보는 토너먼트 내내 유지되지만 나중에 삭제됩니다. 파일에 식별 가능한 이름을 지정하십시오.
코드 응답 시간이 500 밀리 초입니다. 제한 시간 내에 응답하지 않으면 (또는 유효하지 않은 이동을 제공) 특정 경기를 상실하게됩니다. Java 제출에는 현재 수동 시간 초과 (활성으로 업그레이드 할 수 있음)가 있지만 Java 이외의 제출에는 500 밀리 초 후에 프로세스가 종료되는 활성 시간 초과가 있습니다.
추가 제출 규칙
- 규칙을 준수하고 팀을 태그하지 않는 한 여러 제출이 허용됩니다.
- 각 항목은 고유해야합니다. 다른 언어로 다른 봇의 논리를 정확하게 복사 할 수 없습니다.
- 봇은 서로 상호 작용할 수 없습니다 (모든 종류의 팀을 구성하기 위해).
- 봇 내부의 다른 봇의 논리를 사용하여 경쟁 업체를 식별하고 해당 행동을 예측할 수는 없습니다. 물론 상대방의 전략을 결정할 수 있습니다.
- 컨트롤러, 다른 참가자 또는 컴퓨터를 엉망으로 만들려고하지 마십시오. 외부 정보 소스에 연결하지 마십시오.
컨트롤러
현재 컨트롤러 버전은 여기에 있습니다 . 이 파일은 Java 8로 작성되었습니다. "토너먼트"파일은 주 컨트롤러이며 경쟁 업체 목록도 포함합니다 (자신의 경쟁을 주최하려는 경우).
리더 보드
리더 보드를 자주 업데이트 할 수 없었습니다. 나는 이번 주말에 오히려 바쁘다. "바쁘다"는 것은 6:30 AM부터 9:30 PM까지 컴퓨터에 액세스 할 수 없음을 의미합니다. 다음은 5 회 실행 후 점수입니다. "에코"봇은 어떤 이유로 든 상실했습니다.
170 - Quinn and Valor
158 - Historian
142 - DeltaMax
140 - MorraCowbell
132 - Extrapolator
115 - Rainbolt
102 - Popularity
100 - Interpolator
83 - CounterBot
80 - Basilisk
76 - Erratica
65 - Trendy
63 - Scholar
62 - RandomGuesser
60 - KingFisher
59 - NullifierBot
55 - EvolvedBot
48 - Confused
신용
Rainbolt와 Peter Taylor에게 감사의 말을 전합니다.