Многие считают RPS азартной игрой. Если оба игрока играют непредсказуемо, лучшая стратегия - играть случайно. Однако давайте представим немного предсказуемости.
У каждого бота будет возможность рассказать другому боту, во что он будет играть одновременно. Затем наступает пауза, в которой каждый бот узнает, что объявил другой игрок. Если он разыгрывает это оружие, он объявил, что получит одно очко в дополнение к очкам за проигрыш или ничью.
Выигрыш стоит два очка, ничья, одно очко, а проигрыш 0 очков.
Honest Bot Dishonest
Win 3 2
Draw 2 1
Loss 1 0
В ваших же интересах быть честным (но также следить за тем, чтобы ваш оппонент не верил вам).
Матчи будут проводиться в формате кругового турнира, и цель будет состоять в том, чтобы максимизировать ваш собственный общий счет по матчам, которые вы играете.
Формат ввода / вывода:
- Ваш бот будет функцией Python 2.7, которая принимает 4 аргумента и должна иметь уникальное имя (которое будет использоваться для представления вашего представления).
- Первые два аргумента всегда будут в порядке: прошлые ходы противника, за которыми следуют ваши прошлые ходы. Это будет список в порядке от первого до самого последнего раунда, где каждый индекс содержит список с ходом, который, по утверждению оппонента, он сделает, после чего следует ход, который они фактически сделали.
- Следующие два аргумента позволят вашему боту определить, является ли это «честным» раундом или «реальным» раундом. Если это «честный» раунд, они оба будут None. Если это «настоящий» раунд, они будут, по порядку, ходом, который ваш оппонент объявил, что он сделает, после того, как вы заявили, что сделаете.
- Все аргументы или части аргументов, которые представляют ходы, будут использовать «R», «P» и «S» для представления камня, бумаги и ножниц соответственно.
- Ваша функция должна возвращать либо «R» для камня, «P» для бумаги или «S» для ножниц. Боты, которые могут возвращать другие значения, будут дисквалифицированы.
- Каждый бот будет запускаться против каждого другого бота 200 раз, а сам - 100 раз. Цель состоит в том, чтобы быть ботом с наибольшим количеством очков в конце соревнования.
- Что касается обсуждения в комментариях, представленные материалы не могут быть прочитаны или записаны в каком-либо файле, или каким-либо образом саботировать или читать код оппонента.
Примеры:
Это четыре примера ботов, которые я собрал быстро. Они будут участвовать в конкурсе в качестве дополнительных ботов. Если вы проиграли последнему, у вас есть работа.
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"])
контроллер:
А вот контроллер, который я буду использовать. Новые материалы будут импортированы в начале и добавлены в словарь bot_map.
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
Итоговые результаты:
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