Багато людей вважають RPS грою на випадок. Якщо обидва гравці грають непередбачувано, найкраща стратегія - грати випадковим чином. Однак введемо до цього трохи передбачуваності.
Кожен бот матиме можливість сказати іншому боту, що він буде грати одночасно. Потім настає пауза, в якій кожен бот буде знати, що оголосив інший гравець. Якщо він зіграє цю зброю, він оголосив, що набере один бал на додаток до очок за програш для виграшу чи нічиї.
Виграш коштує два очки, нічия, один бал, а програш - 0 балів.
Honest Bot Dishonest
Win 3 2
Draw 2 1
Loss 1 0
У ваших інтересах бути чесним (але також стежити, щоб ваш опонент не вірив вам).
Матчі будуть грати у форматі круглої робіни, а мета полягатиме в тому, щоб максимально збільшити свій власний бал у матчах, які ви граєте.
Формат вводу / виводу:
- Ваш бот буде функцією Python 2.7, який бере 4 аргументи, і повинен мати унікальне ім’я (яке буде використовуватися для представлення вашої подачі).
- Перші два аргументи завжди будуть в порядку: минулий хід супротивника, а потім ваші минулі кроки. Це буде список у порядку від першого до останнього раунду, кожен індекс, що містить список із кроком, який супротивник стверджував, що здійснить, з подальшим кроком, який він фактично зробив.
- Наступні два аргументи дозволять вашому боту визначити, чи це "чесний" раунд чи "справжній" раунд. Якщо це "чесний" раунд, вони обидва будуть "Ніхто". Якщо це "справжній" раунд, вони будуть, для того, рухатися вашим опонентом, який заявив, що зробить, після чого слід рухатися, який ви заявили, що зробите.
- Усі аргументи або частини аргументів, які представляють рухи, використовуватимуть "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