È Natale a luglio, quindi quale modo migliore per festeggiare di uno scambio di regali di elefante bianco virtuale!
Per questa sfida di King of the Hill, devi creare un robot che gioca in una simulazione di scambio di White Elephant , cercando di ottenere il regalo più prezioso che può.
Regole del gioco
- Il gioco si svolgerà in molti round, ognuno composto da un numero variabile di turni.
- Round Setup : ci saranno tanti regali quanti sono i giocatori nel gioco, ognuno valutato casualmente in modo uniforme nell'intervallo [0 ... 1), con questo valore sconosciuto fino a quando il presente non viene "aperto". I giocatori verranno messi in un ordine casuale in una coda. Il primo giocatore verrà espulso dalla parte anteriore della coda.
- Quando è il turno di un giocatore, possono aprire un regalo o rubare il regalo di un altro giocatore, passando il turno al giocatore il cui regalo è stato rubato.
- Ogni regalo può essere rubato fino a 3 volte.
- Non puoi rubare al giocatore che ti ha appena rubato.
- Ogni giocatore può avere solo un regalo alla volta.
- Dopo che un regalo è stato aperto, il gioco avanza al giocatore successivo saltato fuori dalla coda. Questo sarà il prossimo giocatore in ordine di turno che non ha ancora avuto un turno.
- Fine del round : quando tutti i regali sono stati aperti, il round termina e il valore del presente detenuto da ciascun giocatore viene aggiunto al punteggio di quel giocatore. Inizia un nuovo round, con ogni giocatore che ora non ha regali e l'ordine dei giocatori viene mischiato.
- Fine del gioco : il gioco termina quando almeno un giocatore ha totalizzato
100500 punti, con la vittoria assegnata al giocatore con il valore totale più alto di regali.
Coding
Tutti gli invii devono essere compatibili con Python 3.7. Devi scrivere una classe che eredita direttamente da WhiteElephantBot
. Per esempio:
class FooBot(WhiteElephantBot):
# Your implementation here
Puoi fornire un __init__
metodo (che accetta un argomento name
) nella tua classe bot, che deve chiamare super().__init__(name)
. La tua classe deve avere un take_turn
metodo che prevede i seguenti argomenti in questo ordine:
players
: L'elenco dei nomi dei giocatori, in ordine di turno, di tutti i giocatori che non hanno ancora regali.presents
: Un dizionario che mappa i nomi dei giocatori su 2 tuple contenente il valore attuale detenuto da quel giocatore e il numero di volte che il presente è stato rubato. Ciò includerà solo altri giocatori che sono attualmente in possesso di regali.just_stole
: Se l'ultima azione intrapresa è stata un furto, questo sarà il nome del giocatore che ha appena rubato. In caso contrario, lo saràNone
.
Ogni argomento sarà immutabile o un nuovo oggetto in modo che la mutazione di uno qualsiasi di essi non abbia alcun effetto sul gioco. Se lo desideri, puoi conservare una copia di qualsiasi argomento.
Un valore di esempio per presents
:
{
'Alice': (0.35, 0),
'Bob': (0.81, 2),
'Charlie': (0.57, 1)
}
Il tuo take_turn
metodo dovrebbe restituire il nome del giocatore da cui vuoi rubare o None
aprire un regalo. Se genera un'eccezione, restituisce qualcosa di diverso da un str
o None
, o il nome di un giocatore da cui non puoi rubare, aprirai un regalo di default.
Il tuo costruttore verrà chiamato all'inizio di ogni round, quindi non riuscirai a ricordare lo stato da round a round.
Ereditando da WhiteElephantBot
, avrai accesso a un steal_targets
metodo che prenderà i regali just_stole
e restituirà un elenco di nomi di giocatori dai quali puoi rubare.
Tutti i moduli necessari per lo script devono essere importati nella parte superiore della voce.
Test Driver
Il driver di prova può essere trovato qui . Non è necessario includere from white_elephant import WhiteElephantBot
nella risposta pubblicata, tuttavia un modulo locale dovrà farlo.
Concorrenti di base
- Casuale : sceglie a caso se aprire un nuovo regalo o rubare, con il bersaglio rubato scelto in modo uniforme in modo casuale.
- Greedy : ruba il regalo più prezioso che può essere rubato. Se non è possibile rubare regali, apri un regalo.
- Bello : apre sempre un nuovo regalo. Non ruba mai.
Regole aggiuntive
- È tua responsabilità cogliere tutte le eccezioni. Se la tua classe non riesce a rilevare un'eccezione, verrà squalificata. Inoltre, non intercettare KeyboardInterrupts.
- Non utilizzare file o altri metodi per bypassare l'impossibilità di salvare lo stato tra i giochi. Ad esempio, non è possibile salvare uno stato di rete neurale in un file a metà corsa.
- Il bot deve essere autonomo nel codice di classe e nelle costanti correlate.
- È possibile utilizzare solo importazioni di librerie standard.
- Non vi sono requisiti di prestazione rigorosi. Sii ragionevole e prudente. Se la prestazione diventa un problema, mi riservo il diritto di aggiungere limiti di tempo.
Una voce per persona.Se invii più di una voce, i tuoi robot potrebbero non funzionare insieme. Consentirò più voci per persona per ora, anche se potrei riprogrammarlo in seguito se dovesse diventare un problema.- Questa è una competizione aperta senza una data di fine distinta. Sarà rieseguito ogni volta che sono in grado quando ci sono stati cambiamenti significativi.
EDIT1: modificato il punteggio vincente da 100 a 500 in modo che le classifiche siano più coerenti. Il driver di test ha un nuovo bugfix e riflette anche le modifiche del punteggio di vittoria.
EDIT2: chiarimento della nota sulle importazioni richieste.
Classifica (all'8 agosto 2018)
- SampleBot (500.093)
- LastMinuteBot (486.163)
- RobinHood (463.160)
- OddTodd (448.825)
- GreedyBot (438.520)
- SecondPlaceBot (430.598)
- ThresholdBot (390.480)
- Giocatore d'azzardo (313.362)
- NiceBot (275.536)
- RandomBot (256.172)
- GoodSamaritan (136.298)