Camel Up Cup : AI 보드 게임 토너먼트


11

낙타 업컵 2k18

이 도전에서 우리는 반 인기 보드 게임 인 Camel Up을 플레이 할 것입니다.

낙타 업! 플레이어가 낙타에 베팅하여 라운드에서이기거나, 게임에서이기거나, 게임을 잃거나, 함정을 설정하여 움직임에 영향을 주거나 낙타를 이동시키는 보드 게임입니다. 이러한 결정은 각각 돈을 벌 수있는 기회를 주는데, 이것이 승자를 결정합니다. 플레이어는 확률, 게임 상태 고려 사항 및 상대 임차를 사용하여 결정을 내려야합니다. 다음은 플레이어에게 게임 방법을 보여주는 짧은 비디오 입니다.

게임 방법

다음은 게임 방법에 대한 대략적인 아이디어입니다. 비디오 중 하나를 보는 것이 시각 자료가 있기 때문에 더 도움이 될 수 있습니다 :)

당신의 차례에는 4 가지 옵션이 있습니다.

  1. 낙타를 움직입니다. 이것은 움직이지 않은 사람들로부터 낙타를 골라 1-3 칸 사이로 옮깁니다. 동전 1 개를 얻습니다. 5 개의 낙타가 모두 움직이면 라운드가 끝납니다.
  2. 함정을 설치하십시오. 이것은 라운드가 끝날 때까지 보드에서 진행됩니다. + 1 / -1 트랩을 선택하십시오. 낙타 나 낙타 더미가 떨어지면 + 1 / -1로 움직여 동전을 얻습니다. 정사각형 0에는 트랩을 배치 할 수 없습니다. 낙타가있는 곳에 트랩을 배치 할 수 있습니다. 낙타는 그 뒤에 착륙하는 낙타에만 영향을 미칩니다.
  3. 라운드 승자 내기. 라운드 승자에게 베팅을합니다. 그들은 낙타에 베팅 한 1/2/2/3인지에 따라 5/3/2/1을 얻습니다.
  4. 게임 승자 / 손실 자. 게임이 끝날 때 처음 또는 마지막에 누가있을 것인지에 베팅하십시오. 당신은 당신이 그 낙타에 베팅하는 등 1 / 2 / 3 / 등 여부에 따라 8/5/3/1/1 (내 생각에)을 얻을

메모:

  • 5 개의 낙타가 있습니다. 그들은 0-2에서 무작위로 시작합니다.
  • 낙타가 움직일 때 (이것을 유발하는 것은 위 참조) 1-3 칸 움직입니다. 그들이 다른 낙타와 함께 정사각형 위에 놓이면 다른 낙타의 "위에"놓아 낙타 스택을 만듭니다. 낙타가 움직이면 낙타 더미에서 모든 낙타를 그 위로 이동시킵니다. 스택 상단의 낙타가 리드에서 고려됩니다
  • 당신이 +1 함정에 착륙하면 (이것을 일으키는 것은 위 참조) 한 칸 더 앞으로 이동합니다. 표준 스태킹 규칙이 적용됩니다.
  • 그러나 -1 트랩을 누르면 한 정사각형 뒤로 이동합니다. 해당 광장에있는 낙타 더미 아래 로갑니다 .
  • 낙타가 광장 16에 도달하면 게임이 종료됩니다. 이것은 즉시 라운드 엔드와 게임 종료 트리거를 호출합니다
  • 낙타 당 한 번만 게임 승자 / 로저 베팅을 할 수 있습니다. 즉 당신은 이길 낙타에 내기 할 수 게임을 잃게

도전

이 도전에서, 당신은 4 명의 플레이어를 플레이하는 Python 3 프로그램을 작성하고, 우승자는 Camel Up의 모든 영광스러운 게임을합니다

귀하의 프로그램은 다음과 같은 게임 상태를받습니다 :

  • camel_track : 낙타의 위치
  • trap_track : 트랩의 위치 ([trap_type (-1,1), player] 형식으로 입력)
  • player_has_placed_trap : 플레이어가 이번 라운드에 트랩을 놓았는지 알려주는 배열
  • round_bets :이 라운드에 배팅 한 배팅의 배열입니다. [낙타, 플레이어]
  • game_winner_bets / game_loser_bets : 낙타가 게임에서이기거나 잃는 베팅의 배열. 베팅 한 플레이어가 아닌 베팅 한 플레이어의 가치 만 볼 수 있습니다 . 당신은 당신이 내기 사람을 알 수 있습니다. # 도형 [낙타, 플레이어]
  • player_game_bets : game_winner_bets / game_loser_bets의 다른 표현입니다. 다시 한번, 당신의 봇이 내기 한 베팅 만보십시오.
  • player_money_values : 각 플레이어의 돈을 보여주는 배열.
  • camel_yet_to_move : 낙타가이 라운드를 움직 였는지 보여주는 배열.

게임 스테이트 위에 다음과 같은 것들도 있습니다 :

  • player : 어떤 플레이어 번호인지 알려주는 정수입니다 (0-3).

플레이어가 반환해야 할 구문은 다음과 같습니다.

  • [0] : 낙타 이동
  • [1, trap_type, trap_location] : 트랩 배치
  • [2, projected_round_winner] : 라운드 우승자를 내기
  • [3, projected_game_winner] : 게임 승자를 내기
  • [4, projected_game_loser] : 게임 패자를 내기

이것은 move (player, gamestate) 메소드로 감싸 져야합니다

예를 들어, 여기 라운드 플레이어가 마지막 장소에있을 경우 베팅하는 플레이어가 있습니다. 그렇지 않으면 임의의 사각형에 트랩을 배치합니다.

class Player1(PlayerInterface):
     def move(player,g):
         if min(g.player_money_values) == g.player_money_values[player]:
            return [2,random.randint(0,len(g.camels)-1)]
        return [1,math.floor(2*random.random())*2-1,random.randint(1,10)]

이 게임은 여러 가지 이유로 선택되었습니다. 선택할 수있는 옵션이 비교적 작습니다 (대략 20 개 선택, 보통 3-4 개로 쉽게 좁혀 짐). 게임은 짧고 행운의 요소가 있습니다. "나쁜"봇도 이길 수 있습니다).

게임 플레이

토너먼트 러너는 camel-up-cup 에서 찾을 수 있습니다 . 실행 camelup.py대회 또는 게임을 실행하는 기능 PlayGame을 실행합니다. 해당 저장소를 새 제출로 업데이트합니다. 예제 프로그램은에서 찾을 수 있습니다 players.py.

토너먼트는 10 명당 100 개의 게임으로 구성됩니다 (반올림하여 14 명은 200 게임을 의미 함). 각 게임은 4 명의 포지션을 채우기 위해 플레이어 풀에서 선택된 4 명의 랜덤 플레이어입니다. 플레이어는 게임에 두 번 참여할 수 없습니다.

채점

각 게임의 승자는 게임이 끝날 때 가장 많은 돈을 가진 플레이어입니다. 게임 종료시 동점 인 경우 최대 금액의 모든 플레이어에게 포인트가 부여됩니다. 토너먼트 종료 후 가장 많은 점수를 얻은 플레이어가 승리합니다. 게임을 실행하면서 점수를 게시합니다.

제출 된 플레이어가 풀에 추가됩니다. 나는 정말로 멍청한 봇 3 개와 내가 시작한 봇 하나를 추가했습니다.

경고

입력을 수정하지 마십시오. 협력 또는 결함을 통한 경우를 제외하고 다른 프로그램의 실행에 영향을 미치지 마십시오. 다른 제출물을 인정하고 상대방이 자비로 이익을 얻는 희생적인 제출물을 만들지 마십시오. 표준 허점 은 금지되어 있습니다.

봇이 걸리는 시간을 턴당 ~ 10 초로 제한하십시오.

제출물은 이전 제출물을 복제 할 수 없습니다.

다른 플레이어의 game_winner 또는 game_loser 베팅을 보지 마십시오. 꽤 쉬운 일이지만 여전히 속임수입니다.

궁금한 점이 있으면 언제든지 문의하십시오.

승리

새로운 제출물이 게시되면 경쟁은 무기한 개방됩니다. 그러나이 질문이 게시 된 후 1 개월 (7 월 20 일)의 결과에 따라 승자를 선언합니다 (답변 수락).

결과

Player0: 12
Player1: 0
Player2: 1
Sir_Humpfree_Bogart: 87

어쩌면 나는 그것을 읽었 지 만, 얼마나 많은 낙타가 있습니까? 또한 반대편으로 가기 위해 몇 정사각형을 여행해야합니까? GitHub 코드를 기반으로 5 낙타와 25 정사각형이라고 확신하지만 도전 설명에 언급되지 않았습니다. 베팅을 할 때 어떤 금액을 베팅 할 수 있습니까, 아니면 기본적으로 1을 베팅합니까? 지출 한도가 있습니까, 아니면 모든 라운드에 무기한으로 베팅 할 수 있습니까? 낙타를 움직이는 플레이어는 어떤 낙타가 움직입니까? 일치하는 플레이어 번호와 낙타? 그렇다면 왜 4 명의 플레이어와 5 개의 낙타가 있습니까?
Kevin Cruijssen

1
Perl 답변을 완벽하게했을 것입니다
임의의 사람

PPCG에 오신 것을 환영합니다!
AdmBorkBork

10 명당 100 개의 게임, 특히 무작위성이 많은 게임의 경우 IMO가 매우 낮습니다.
Nathan Merrill

1
@AdmBorkBork 감사합니다! 나는 이것에 익숙하지 않으므로 모든 포인터를 환영합니다. 실생활에서 잘 작동했습니다. 여기에서 어떻게 작동하는지 알기 위해
Tyler Barron

답변:


1

Sir_Humpfree_Bogart.py

이것은 낙타 업 컵 토너먼트를 위해 만든 봇 입니다.

먼저, 그들은 낙타가 라운드가 끝날 때 가능한 모든 구성을 살펴 봅니다. 그런 다음 낙타에서 베팅의 예상 가치를 결정합니다.

EV_roundwin = (chance_1st)*(payout) + (chance_2nd)*(payout) - (chance_3rd_or_worse)*(cost)

그리고 낙타가 이길 때까지 낙타를 무작위로 움직입니다. 이 작업을 몇 천 번 수행하면 각 낙타가 이길 확률을 추정 할 수 있습니다. 다시, 우리는 다음을 사용하여 예상 값을 얻습니다.

EV_gamewin = (chance_1st)*(payout) - (chance_2nd_or_worse)*(cost)

다른 옵션은 낙타 (항상 하나의 동전을 생산하므로 기대 값은 1)를 옮기고 함정을 설치하는 것입니다. 두 팀 모두 함정을 배치하는 것이 함정을 완전히 무시할 수있는 약한 옵션이라고 생각했습니다. 이 정보로 봇은 예상 값이 가장 높은 옵션을 선택했습니다.

토너먼트는 마지막 장소 마무리와 동일하게 2 위를 차지 했으므로, 1 위를 차지할 기회가있는 경우에는 의미가 있습니다. SBH는 distance_from_first_place 및 nearness_to_end를 사용하여 봇이 얼마나 위험한지 결정했습니다. 처음부터 멀고 끝까지 가면 위험이 높을 것이고, 게임이 끝날 때 또는 끝이 멀면 위험이 낮습니다. . 봇은 위험이 낮 으면 기대 가치가 높은 옵션을 선택하고 높은 위험성을 가진 옵션을 산출하는 높은 위험성을 결정합니다. 정확한 방정식은

Functional_EV = EV + (upshot-EV) * riskiness

여기서 upshot은 의사 결정에서 얻을 수있는 최고 지불금이며 위험 범위는 0에서 1까지입니다.


0

players.py

이들은 토너먼트를 진행하기 위해 엄청나게 바보 같은 봇입니다. 그들은 거의 논리가 없지만 사람들이 사용할 수있는 프레임 워크 역할을합니다.

import random
import math
from playerinterface import PlayerInterface

class Player0(PlayerInterface):
    def move(player,g):
        #This dumb player always moves a camel
        return [0]

class Player1(PlayerInterface):
    def move(player,g):
        #This player is less dumb. If they have the least amount of money they'll make a round winner bet
        #If they aren't in last then they'll place a trap on a random square. Still p dumb though
        if min(g.player_money_values) == g.player_money_values[player]:
            return [2,random.randint(0,len(g.camels)-1)]
        return [1,math.floor(2*random.random())*2-1,random.randint(1,10)]

class Player2(PlayerInterface):
    def move(player,g):
        #This dumb player always makes a round winner bet
        return [2,random.randint(0,len(g.camels)-1)]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.