Camel Up Cup: Bir AI masa oyunu turnuvası


11

Deve Kupası 2k18

Bu meydan okumada, yarı popüler masa oyunu Camel Up'ı oynayacağız.

Deve Yukarı! turları kazanmak, oyunu kazanmak veya oyunu kaybetmek, hareketi etkilemek veya bir deveyi hareket ettirmek için tuzaklar kurmak için develere bahis yapan bir masa oyunudur. Bu kararların her biri, kazananı belirleyen şey olan para kazanma şansını size verir. Oyuncular kararlarını vermek için olasılık, oyun durumu değerlendirmeleri ve rakip kiracılık kullanmalıdır. İşte oyunculara nasıl oynayacaklarını gösteren kısa bir video .

Nasıl oynanır

İşte nasıl oynanacağı hakkında kabaca bir fikir. Videolardan birini izlemek daha yararlı olabilir çünkü görselleri var :)

Sırayla 4 seçeneğiniz var.

  1. Bir deveyi hareket ettirin. Bu hareket etmeyenlerden bir deve alır ve 1-3 boşluk arasında hareket ettirir. 1 madalyon al. Beş devenin hepsi hareket ettiğinde mermiler sona erer, sonra hepsi hareket edebilir
  2. Bir tuzak yerleştirin. Bu, turun sonuna kadar tahtada devam eder. + 1 / -1 tuzağını seçersiniz. Bir deve veya deve yığını üzerine düşerse + 1 / -1 taşırlar ve bir bozuk para alırsınız. 0 karesine bir tuzak yerleştiremezsiniz. Develerin bulunduğu yere bir tuzak yerleştirebilirsiniz, ancak yalnızca üzerine gelen develeri etkileyecektir.
  3. Yuvarlak kazanan bahis. Bir tur kazanan için bahis oynarsınız. Bu deveye bahis yapmak için 1. / 2. / 3. olmanıza bağlı olarak 5/3/2/1 alırsınız.
  4. Oyunu kazanan / kaybeden. Oyunun ilk kimin içinde veya sonunda kimin olacağı üzerine bir bahis oynarsınız. Bu deveye bahis yapmak için 1. / 2. / 3. / vb. olmanıza bağlı olarak 8/5/3/1/1 (sanırım) alıyorsunuz

Notlar:

  • 5 deve var. 0-2 arasında rastgele bir pozisyonda başlarlar.
  • Bir deve hareket ettiğinde (bunu tetikleyen şey için yukarıya bakın) 1-3 kare hareket ettirir. Eğer başka bir deve ile bir kareye yerleştirilirlerse, bir diğerinin üzerine konur ve deve yığını oluşturulur. Bir deve hareket edecekse, deve yığınındaki tüm develeri hareket ettirir. Yığının üstündeki deve kurşun olarak kabul edilir
  • +1 tuzağına inerseniz (bunu neyin tetiklediğini görmek için yukarıya bakın) bir kareyi daha ileriye taşırsınız. Standart istifleme kuralları geçerlidir.
  • Ancak -1 tuzağına vurursanız, bir kare geriye doğru hareket edersiniz. Sen git altında varsa o karede olan deve yığını.
  • Bir deve 16 no'lu kareye çarptığında oyun sona erer.
  • Oyun kazanan / kaybeden bahisler deve başına sadece bir kez yapılabilir. Yani oyunu kazanmak ve kazanmak için bir deveye bahse giremezsiniz

Meydan okuma

Bu meydan okumada, dört oyuncu oynamak için bir Python 3 programı yazacaksınız, kazanan Camel Up'ın tüm zafer oyununu alıyor

Programınız aşağıdakileri içeren oyun tablosunu alacaktır:

  • camel_track : develerin konumlarıyla
  • trap_track : tuzakların yeri ile ([trap_type (-1,1), oyuncu] formunun girişi)
  • player_has_placed_trap : oyuncuların bu turda bir tuzak yapıp yapmadığını söyleyen bir dizi
  • round_bets : Bu rauntta oynanan bahisler dizisi. Formun [deve, oyuncu]
  • game_winner_bets / game_loser_bets : Develerin oyunu kazanması veya kaybetmesi için yapılan bahislerin dizileri. Bahis yaptıklarını değil , yalnızca bahis yapan oyuncuların değerini görebileceksiniz . Kime bahis oynadığınızı bilirsiniz. formun # sayısı [deve, oyuncu]
  • player_game_bets : game_winner_bets / game_loser_bets'in başka bir temsili. Yine, sadece botunuzun yaptığı bahislere bakın.
  • player_money_values : her oyuncunun sahip olduğu para miktarını gösteren bir dizi.
  • camel_yet_to_move : Bir devenin bu turda hareket edip etmediğini gösteren bir dizi.

Oyun masasının üstünde şunları da elde edersiniz:

  • player : hangi oyuncu numarasında olduğunuzu söyleyen bir tam sayı (0-3).

Oyuncuların geri dönmesi gereken sözdizimi:

  • [0]: Deveyi Taşı
  • [1, trap_type, trap_location]: Tuzağı Yerleştir
  • [2, projected_round_winner]: Yuvarlak Kazanan Bahsi Yap
  • [3, projected_game_winner]: Oyunu Kazanan Bahsi Yap
  • [4, projected_game_loser]: Oyun Kaybeden Bahsi Yap

Bu bir move (oyuncu, gamestate) yöntemiyle sarılmalıdır

Örneğin, son sırada yer alırlarsa yuvarlak kazanan bir bahis yapacak bir oyuncu. Eğer değilse, rastgele bir kareye bir tuzak koyacaklar.

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)]

Oyun birkaç nedenden dolayı seçildi: seçim yapmak için nispeten küçük bir seçenek havuzuna sahiptir (tur başına yaklaşık 20 seçenek, genellikle yaklaşık 3-4'e kadar daraltılabilir), oyunlar kısadır ve bir şans unsuru vardır ( böylece "kötü" botlar bile kazanabilir).

Oynanış

Turnuva koşucusu burada bulunabilir: deve-up kupası . camelup.pyBir turnuva çalıştırmak için çalıştırın veya oyunları çalıştırmak için PlayGame işlevi. Bu havuzu yeni gönderimlerle güncel tutacağım. Örnek programlar bulunabilir players.py.

Bir turnuva 10 oyuncu başına 100 oyundan oluşur (yuvarlanır, böylece 14 oyuncu 200 oyun anlamına gelir). Her oyun, dört pozisyonu doldurmak için oyuncu havuzundan seçilen dört rastgele oyuncu olacaktır. Oyuncular oyunda iki kez yer alamazlar.

puanlama

Her oyunun galibi, oyunun sonunda en fazla paraya sahip olan oyuncudur. Bir oyunun sonunda beraberlik olması durumunda, azami para miktarına sahip tüm oyunculara bir puan verilir. Turnuvanın sonunda en çok puanı alan oyuncu kazanır. Oyunları çalıştırırken skorlar yayınlayacağım.

Gönderilen oyuncular havuza eklenir. Üç aptal bot ve başlamak için yaptığım bir bot ekledim.

Uyarılar

Girişlerde değişiklik yapmayın. İşbirliği veya kusur dışında başka bir programın yürütülmesini etkilemeye çalışmayın. Başka bir sunumu tanımaya ve rakibe kendi pahasına fayda sağlamaya çalışan fedakar bir sunum yapmayın. Standart boşluklar yasaklanmıştır.

Botunuzun aldığı zamanı tur başına ~ 10s olacak şekilde sınırlayın.

Gönderiler daha önceki gönderimleri çoğaltamaz.

Lütfen diğer oyuncuların game_winner veya game_loser bahislerini görüntülemeyin. Yapması oldukça kolay ama yine de hile yapıyor.

Herhangi bir sorunuz varsa, sormaktan çekinmeyin.

Kazanan

Yeni gönderiler gönderildikçe yarışma süresiz olarak açık kalacaktır. Ancak, bu sorunun gönderilmesinden bir ay sonra (20 Temmuz) elde edilen sonuçlara göre bir kazanan ilan edeceğim (bir cevap kabul ediyorum).

Sonuçlar

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

Belki onu okudum ama oyunda kaç Deve var? Ayrıca, diğer tarafa gitmek için kaç kare seyahat etmeleri gerekiyor? GitHub kodunuza dayanarak, 5 deve ve 25 kare olduğundan eminim, ancak meydan okuma açıklamasında belirtilenleri görmedim. Bahis oynamak için, herhangi bir miktarda bahis yapabilir miyiz, yoksa varsayılan olarak 1 bahis yapar mı? Harcama sınırımız var mı yoksa her turda süresiz bahis yapabilir miyiz? Bir deveyi hareket ettiren oyunculara gelince, hangi deve hareket ediyor? Eşleşen oyuncu-nr ile deve? Evet ise, neden 4 oyuncu ama 5 deve var?
Kevin Cruijssen

1
Perl cevapları için mükemmel olurdu
Rastgele adam

PPCG'ye Hoşgeldiniz!
AdmBorkBork

10 oyuncu başına 100 oyun, özellikle çok rasgele bir oyunla IMO oldukça düşük görünüyor
Nathan Merrill

1
@AdmBorkBork Teşekkür ederim! Ben bu konuda yeniyim bu yüzden tüm işaretçiler hoş geldiniz. Bu gerçek hayatta iyi çalıştı - burada nasıl oynadığını görmek için amped
Tyler Barron

Yanıtlar:


1

Sir_Humpfree_Bogart.py

Bu Camel Up Cup Turnuvası için yaptığım bir bot .

İlk olarak, develerin turun sonunda bitebileceği tüm olası konfigürasyonlara bakarlar. Sonra turu kazanan bir deveye bahis yapmanın beklenen değerini belirlerler.

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

Sonra deveyi kazanana kadar develeri rastgele hareket ettirirler. Bunu birkaç bin kez yaptıktan sonra her devenin kazanma ve kaybetme şansını tahmin edebilirsiniz. Yine, bunların beklenen değerini alıyoruz

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

Diğer tek seçenek bir deveyi (her zaman bir jeton verir, bu yüzden beklenen değeri birdir) hareket ettirmek ve bir tuzak yerleştirmektir. Her iki ekip de bir tuzak kurmanın onu tamamen görmezden gelmeye yetecek kadar zayıf bir seçenek olduğunu hissetti. Bu bilgi ile botlar beklenen en yüksek değere sahip seçeneği seçti.

Turnuva ikinci bir yer olarak göründüğü için, son bir yerle aynı şekilde bitirdiğinden, ilk sırada yer almak için şansınız varsa, bu mantıklıdır. SBH, botun ne kadar riskli olması gerektiğini belirlemek için distance_from_first_place ve nearness_to_end yöntemlerini kullandı; burada ilkten çok uzak ve yakın olursanız risklilik yüksek olurdu ve oyunun ilkinde veya uzaktaysanız risk düşük olacaktır. . Düşük riskli bot, yüksek beklenen değer seçeneğine ve yüksek riskli seçenek sunan yüksek riskliliğe sahip bir eyleme karar verir. Tam denklem şuydu:

Functional_EV = EV + (upshot-EV) * riskiness

upshot, bir karardan alabileceğiniz en yüksek ödeme ve risklilik 0 ile 1 arasında değişir.


0

players.py

Bunlar turnuvanın başlaması için inanılmaz derecede aptal botlar. Neredeyse hiç mantığı yok ama insanların kullanması için çerçeveler gibi davranıyorlar

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)]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.