CodigGame의 게임 AI 대전 환경을 로컬로 움직인다 ~Kotlin편~
주요 대상은 Kotlin이지만 Java에서도 거의 같은 방식으로 움직일 수 있습니다.
CodinGame이란?
게임을 통해 프로그래밍을 배우고 놀 수 있는 웹 기반 플랫폼입니다.
자작의 게임 AI를 싸우는 오리지널 게임이 매우 잘 짜여져 있고 또한 사이트의 완성도도 높고, 수많은 프로그래밍 사이트 중에서도 톱 클래스의 재미라고 생각합니다.
보다 자세한 것은 이하가 참고가 될까 생각합니다.
- htps : // 코 m / 쟈 ゔ 코몬 s / ms / b178c924199d1 아 6d524d
왜 로컬 실행 환경을 만드는가?
CodinGame에서는 에디터에서 코드를 쓰고 빌드하고 대전시킬 때까지 사이트에서 완결하게 되어 있어 브라우저 하나 있으면 놀 수 있게 되어 있습니다.
하지만 새로운 전략을 시도하거나 파라미터 조정을 할 때는 브라우저상에서 포치포치 조작하는 것보다 수중에서 자동 실행하는 편이 편하고 효율도 좋기 때문에, 로컬의 실행 환경을 만들어 두는 것이 추천입니다.
로컬 실행 환경 구축
실행 코드 얻기 및 빌드 준비
게임의 실행 환경은 GitHub에 공개되어 있으며, 그것을 Clone하면 코드 취득이 완료됩니다.
게임의 규칙 페이지 등에 링크가 있는지 생각합니다. (이번 SpringChallenge2021은 htps : // 기주 b. 코 m / 코 겐가 메 / Sp 링 g 짱 게 2021에있었습니다.)
실행 환경의 빌드 시스템에는 Maven이 사용되고 있어 환경을 준비해 CLI로부터 빌드해도 좋지만 이번에는 Intellij IDEA를 사용했습니다.
"Project from existing source..."에서 Clone 해 온 소스의 루트를 지정하고 "Import Project"에서 Maven을 선택하면 나머지는 IDE가 잘 해줄 것이라고 생각합니다.
게임 실행
드디어 수중에서 게임을 움직입니다.
게임 실행 환경은 이전 소스의 src/test/java/Spring2021.java에 있습니다. (다른 게임에서도 게임 이름이나 Main.java와 같은 이름으로되어있는 것 같습니다.)
게임 실행의 본체는 MultiplayerGameRunner 클래스로 이것에 리그 레벨(레벨에 의해 룰이 바뀝니다), 난수의 시드, 그리고 스스로 작성한 게임 AI 클래스를 ”Agent”로서 등록합니다.
이번에는 Kotlin에서 "Agent1.kt"와 "Agent2.kt"에 작성한 것을 등록합니다.
Spring2021.java
public static void main(String[] args) throws IOException, InterruptedException {
launchGame();
}
public static void launchGame() throws IOException, InterruptedException {
MultiplayerGameRunner gameRunner = new MultiplayerGameRunner();
gameRunner.setLeagueLevel(3);
Properties gameParameters = new Properties();
gameRunner.setGameParameters(gameParameters);
gameRunner.addAgent(
Agent1Kt.class,
"Tororo",
"https://static.codingame.com/servlet/fileservlet?id=61910307869345"
);
gameRunner.addAgent(
Agent2Kt.class,
"Ghilbib",
"https://static.codingame.com/servlet/fileservlet?id=61910289640958"
);
gameRunner.setSeed(7308340236785320085L);
gameRunner.start(8888);
}
Agent1.kt의 내용은 기본적으로 CodinGame의 웹상에서 움직이는 것과 같습니다.
다만 Agent1.kt 와 Agent2.kt 에 동명의 루트 레벨 함수등이 있으면 좋지 않기 때문에, 각각의 클래스 나름에 넣어 둘 필요가 있습니다.
또 CodinGame의 사양(?)인가 입출력의 스트림은 파일 직하의 main 로 취한 것을 사용할 필요가 있는 것 같습니다.
정리하면 다음과 같습니다.
Agent1.kt
fun main(){
Agent1.solve(Scanner(System.`in`), System.`out`)
}
object Agent1{
fun solve(input: Scanner, output: PrintStream) {
// Game AI
}
}
이것으로 준비가 완료됩니다. 실행(IntelliJ라면 Spring2021.java의 메인 옆의 실행 버튼을 누르기만 하면)하면 대전이 행해져 결과의 애니메이션을 로컬 호스트(http://localhost:8888/test.html)로부터 볼 수 있습니다 .
애니메이션 생략 및 결과 얻기
한꺼번에 로컬에서 대전을 실행하는 경우, 애니메이션은 불필요한 경우가 많을까 생각합니다.
그 경우 MultiplayerGameRunner.start() 로 바뀌어 MultiplayerGameRunner.simulate() 를 이용하는 것으로 애니메이션 생성을 생략해 실행할 수 있어 대전 결과 데이터를 GameResult 클래스로 취득할 수가 있습니다.
예를 들어 양자의 스코어를 취득하고 싶은 경우는 다음과 같이 됩니다.
Spring2021.java
public static void launchGame() throws IOException, InterruptedException {
// (略)
gameRunner.setSeed(7308340236785320085L);
GameResult result = gameRunner.simulate();
System.out.println("Agent1: " + result.scores.get(0) + ", Agent2: " + result.scores.get(1));
// Agent1: 70, Agent2: 69
}
참고
Reference
이 문제에 관하여(CodigGame의 게임 AI 대전 환경을 로컬로 움직인다 ~Kotlin편~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yukidaruma_app/items/ef2091e64c05584e730a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)