Ledsen för att jag försvann, blev tvungen att hantera en del tråkiga
saker som tyvärr konsumerat all min lediga tid.
Tävlingen:
Nu vet jag inte riktigt hur långt savje har kommit med
implementeringen av sin server och hur det fungerar med
nätverksprotokollet. Hade inte riktigt tänkt mig att versionen
jag arbetade på skulle vara den slutgiltliga versionen.
Håller inte riktigt med om att uppgiften är så svår som Delight
kanske tror. Men jag är benägen att hålla med honom om att det
kommer att vara tidskrävande, i alla fall så som det ser ut nu
med nätverksprotokoll och felhanteringen som hör till. Här följer
därför ett reviderat förslag på hur man kan tänka sig hålla en
liknande tävling:
No Limit Holdem - Heads Up.
N stycken pokerbotar gör upp mot varandra, två och två,
round-rubin style.
Hur eliminerar man nätverksprotokollet utan att tvinga folk att
skriva sin pokerbotar i ett specifikt programmeringsspråk?
Stdio, komplett matchhistorik och ett "stateless" kommunikations-
protokoll. Pokerbotarna exekveras varje gång det är deras tur,
fattar sina beslut utifrån matchhistoriken som de läser via stdin
och informerar "dealern" genom att skriva till stdout.
Protokollet?
Så här ser ett meddelande ut när en spelare skall agera för första
gången i en omgång:
HAND:114:sb:3000/3000:10/20:10/20||QsQd||\r\n
Så här ser meddelandet ut när handen är färdigspelad:
HAND:114|sb:3500/2500:10/20:0/0|cr10r20c/r10r30c/rc/cr50r100c|QsQd/5s2s6h/9c/Ac|Ks2d:+500|\r\n
| A | B | C | D | E |
Vi bryter ner meddelandet i dess huvudsakliga komponenter för att
undersöka protokollet:
A = HAND:114|...|\r\n
| | |
H P L
H = handnummer, heltal
P = meddelandets parametrar
L = <CRLF>, ASCII 13 + ASCII 10
B = sb:3500/2500:10/20:0/0
| | | |
P S B R
P = denne spelares position, sb eller bb
S = spelarnas stackar i ordningen sb/bb
B = storleken på blinds i ordningen sb/bb
R = minsta antal chips som för call/raise
C = cr10r20c/r10r30c/r20r40c/cr50r100c
| | | |
P F R T
P = preflop börjar med sb <--
F = flop börjar med bb
R = river börjar med bb
T = turn börjar med bb
Actions = c [call]
r <heltal> [raise]
f [fold]
a [allin]
D = QsQd/5s2s6h/9c/Ac
| | | |
H F R T
H = hole cards, 2st
F = flop cards, 3st
R = river card, 1st
T = turn card, 1st
kort = <valör|färg>
valör = 2,3,4,5,6,7,8,9,T,J,Q,K,A
färg = s,d,h,c
E = Ks2d/+500
| |
P R
P = motståndarens kort, 2st
R = result för denna hand i chips, ex -300, +500
Det kanske ser lite komplicerat ut men det är väldigt enkelt och
elegant i praktiken. Utöver HAND behövs det enbart två meddelanden för
att protokollet ska bli komplett, NEWHAND\r\n och ERROR:sträng\r\n.
NEWHAND skickas ut i början av varje omgång för att botar ska få
chansen att återställa sig själva och göra sig redo för en ny hand.
ERROR skickas egentligen enbart ut när något av följande skett:
a) en bot har kraschat eller tagit för lång tid på sig
b) en bot har gjort en felaktig raise
I sådana fall kommer pokerboten att automatiskt förlora handen, potten
överförs till motståndaren och en ny omgång startar. I praktiken
kommer detta att vara otroligt sällsynt eftersom det är nästintill
omöjligt att göra något fel om man man använder sig av informationen som
man får via HAND.
Hur kommunicerar bottarna till "dealern"? Tja, det räcker med att
skriva ett par tecken till stdout, samma actions som i [C], dvs 'c',
'r', 'f' eller 'a'. Det enda dealern gör är att den lägger till
actions på rätt plats i [C], lägger till kort i [D] och presenterar
resultat från showdowns genom att lägga till [E].
Vad tror ni?
Tror inte att det går att göra det enklare än så här. Man borde
nästan kunna skriva en bot som enbart "callar" med mindre än 50
rader kod.