Viele Leute halten RPS für ein Glücksspiel. Wenn beide Spieler unvorhersehbar spielen, ist es die beste Strategie, nach dem Zufallsprinzip zu spielen. Lassen Sie uns jedoch ein wenig Vorhersehbarkeit einführen.
Jeder Bot hat die Möglichkeit, dem anderen Bot mitzuteilen, was er gleichzeitig spielen wird. Dann gibt es eine Pause, in der jeder Bot weiß, was der andere Spieler angekündigt hat. Wenn es diese Waffe ausspielt, die es angekündigt hat, erhält es zusätzlich zu seinen Punkten einen Punkt für einen Sieg, eine Niederlage oder ein Unentschieden.
Ein Sieg ist zwei Punkte wert, ein Unentschieden, ein Punkt und ein Verlust 0 Punkte.
Honest Bot Dishonest
Win 3 2
Draw 2 1
Loss 1 0
Es ist in Ihrem besten Interesse, ehrlich zu sein (aber auch sicherzustellen, dass Ihr Gegner Ihnen nicht glaubt).
Die Matches werden in einem Round-Robin-Format gespielt und das Ziel ist es, Ihre eigene Gesamtpunktzahl über die von Ihnen gespielten Matches hinweg zu maximieren.
E / A-Format:
- Ihr Bot wird eine Python 2.7-Funktion sein, die 4 Argumente akzeptiert und einen eindeutigen Namen haben muss (der verwendet wird, um Ihre Einreichung darzustellen).
- Die ersten beiden Argumente lauten immer der Reihe nach: die letzten Züge des Gegners, gefolgt von Ihren letzten Zügen. Hierbei handelt es sich um eine Liste in der Reihenfolge von der ersten bis zur letzten Runde, wobei jeder Index eine Liste mit dem Zug enthält, den der Gegner angeblich ausführen würde, gefolgt von dem Zug, den er tatsächlich ausgeführt hat.
- Mit den nächsten beiden Argumenten kann Ihr Bot feststellen, ob es sich um eine "ehrliche" oder eine "echte" Runde handelt. Wenn es sich um eine "ehrliche" Runde handelt, sind beide "Keine". Wenn es sich um eine "echte" Runde handelt, handelt es sich um den Zug, den Ihr Gegner angekündigt hat, gefolgt von dem Zug, den Sie angekündigt haben.
- Alle Argumente oder Teile von Argumenten, die Bewegungen darstellen, verwenden "R", "P" und "S", um Stein, Papier bzw. Schere darzustellen.
- Ihre Funktion sollte entweder ein "R" für Stein, ein "P" für Papier oder ein "S" für Schere zurückgeben. Bots, die die Möglichkeit haben, andere Werte zurückzugeben, werden disqualifiziert.
- Jeder Bot wird 200 Mal gegen jeden anderen Bot und 100 Mal gegen sich selbst ausgeführt. Ziel ist es, am Ende des Wettbewerbs der Bot mit den meisten Punkten zu sein.
- In Bezug auf die Diskussion in den Kommentaren dürfen die Einsendungen keine Dateien lesen oder in diese schreiben oder in irgendeiner Weise den Code des Gegners sabotieren oder lesen.
Beispiele:
Dies sind vier Beispiel-Bots, die ich schnell zusammengestellt habe. Sie werden als zusätzliche Bots am Wettbewerb teilnehmen. Wenn Sie bis zum letzten verlieren, müssen Sie noch etwas arbeiten.
def honestpaper(I,dont,care,about_these):
return "P"
def honestrock(I,dont,care,about_these):
return "R"
def honestscissors(I,dont,care,about_these):
return "S"
import random
def randombot(I,dont,care,about_these):
return random.choice(["R","P","S"])
Regler:
Und hier ist der Controller, den ich verwenden werde. Neue Einreichungen werden zu Beginn importiert und dem bot_map-Wörterbuch hinzugefügt.
from honestrock import honestrock
from honestpaper import honestpaper
from honestscissors import honestscissors
from randombot import randombot
bot_map = {
0:honestrock, 1:honestpaper, 2:honestscissors, 3:randombot
}
player_num=len(bot_map)
def real(history1,history2,number,honest1,honest2):
return bot_map[number](history1,history2,honest1,honest2)
def honest(history1,history2,number):
return bot_map[number](history1,history2,None,None)
def play_match(num1,num2):
history1=[]
history2=[]
score1=0
score2=0
for x in range(250):
h1=honest(history2,history1,num1)
h2=honest(history1,history2,num2)
r1=real(history2,history1,num1,h2,h1)
r2=real(history1,history2,num2,h1,h2)
if h1==r1: score1+=1
if h2==r2: score2+=1
if r1==r2: score1+=1; score2+=1
elif r1=="R":
if r2=="P": score2+=2
else: score1+=2
elif r1=="P":
if r2=="S": score2+=2
else: score1+=2
else:
if r2=="R": score2+=2
else: score1+=2
history1.append([h1,r1])
history2.append([h2,r2])
return score1,score2
scores = []
for x in range(player_num):
scores.append(0)
for _ in range(100):
for x in range(player_num):
for y in range(player_num):
scorex,scorey=play_match(x,y)
scores[x]+=scorex
scores[y]+=scorey
for score in scores:
print score
Endergebnisse:
csbot 3430397
thompson 3410414
rlbot 3340373
have_we_been_here_before 3270133
mason 3227817
deepthought 3019363
adaptive_bot 2957506
THEbot 2810535
dontlietome 2752984
irememberhowyoulie 2683508
learningbot4 2678388
betrayal 2635901
averager 2593368
honestrandom 2580764
twothirds 2568620
mirrorbot 2539016
tit4tat 2537981
honestscissors 2486401
trusting_bot 2466662
rotate_scissors 2456069
rotate_paper 2455038
rotate_rock 2454999
honestpaper 2412600
honestrock 2361196
rockBot 2283604
trustingRandom 2266456
user5957401bot 2250887
randombot 2065943
Dx 1622238
liarliar 1532558
everybodylies 1452785