Programmeringstävling (förslag)

Permalänk

Jag hjälper gärna till och skriver lite kod när jag ser att det hela kommit igång lite; det är så ofta sånt här rinner ut i sanden för att ingen riktigt vill ta ansvar. Hoppas det här kommer någonstans, det behövs

Visa signatur

System.out.print(madness ? this.is.SPARTA : "");

Permalänk
Medlem

Fan hold em jag som är sämst på det irl Hur som helst nån med som pysslat lite med nätverksprogrammering kan väl slänga upp ett förslag på hur ett protokoll skulle kunna se ut så kan vi väl diskutera det lite?

Visa signatur
Permalänk

Protokollet är nästan klart, ska bara kolla över ett par detaljer när jag kommer hem. Förvänta er en update till kvällen.

Började lite smått på implementeringen av servern igår. Så fort jag får något som går att köra kommer jag att lägga upp koden via CvsTrac [1] repository och låta arbetet ske i det öppna så att frivilliga kan hjälpa till. Valde att skriva programmet i Python då jag vet att det är många på forumet som använder detta språk.

[1] http://cvstrac.org/

Permalänk
Citat:

Ursprungligen inskrivet av BobbyFromDallas
Protokollet är nästan klart, ska bara kolla över ett par detaljer när jag kommer hem. Förvänta er en update till kvällen.

Började lite smått på implementeringen av servern igår. Så fort jag får något som går att köra kommer jag att lägga upp koden via CvsTrac [1] repository och låta arbetet ske i det öppna så att frivilliga kan hjälpa till. Valde att skriva programmet i Python då jag vet att det är många på forumet som använder detta språk.

[1] http://cvstrac.org/

Härligt

Permalänk
Medlem

Låter roligt, jag är med

Permalänk
Medlem

Kul att det har börjat rulla lite

Är fortfarande skeptisk till poker som spel, tycker att typ fångarnas dilemma hade varit bra nivå att starta på, men ser mig själv nerröstad. Hoppas bara det inte blir 50 st pokerbotar som sitter och räknar pottodds.

Permalänk

Vad skoj med en ny programmeringstävling. Jag ska försöka ta mig tid till att vara med.

Permalänk
Medlem

Låter soft. Jag kodar nog ihop en bot.
Röstar helt klart för nätverksprogrammering (sockets) då det känns enklast.

Permalänk

Här är en första revisionen av ett nätverksprotokoll för en framtida programmeringstävlingen med temat No Limit Texas Holdem. Jag är fortfarande inte övertygad om det intressanta med att skriva nätverksskod men majoriteten ville det so here it is:

http://swecpoker.googlecode.com/svn/trunk/protocol.txt

Även om jag försökt hålla saker o ting så enkelt som möjligt är jag lite orolig för att tävlingen kommer att resultera i att folk spenderar en massa tid på att få ihop en klient som lyckas kommunicera med servern och tröttnar innan man kommer till den roliga AI-biten.

Anyways, ta en titt och ös på med kritik.

Om det är någon som känner för att hjälpa till med att skriva servern så är det bara att hojta till.

Edit:

Vet inte riktigt om jag borde starta en ny tråd eller ej. Låter våra vänliga kvartersmoderatorer bestämma.

Permalänk

Tjusigt!
Skall kolla närmare på det när jag sovit (och sett lite Stargate). Förhoppningsvis går ju nätverksbiten att lösa genom att folk hjälper varandra.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av BobbyFromDallas
Även om jag försökt hålla saker o ting så enkelt som möjligt är jag lite orolig för att tävlingen kommer att resultera i att folk spenderar en massa tid på att få ihop en klient som lyckas kommunicera med servern och tröttnar innan man kommer till den roliga AI-biten.

Mjo, därför vore det bra med en minimal klient som man kan bygga vidare på. Syntaxen för ditt protokoll kan vi ju även använda i framtida tävlingar.

I ditt exempel får jag dock längden på "LOGIN:BobbyFromDallas:1253:VER1\r\n" till 33 bytes, inte 30? Jag räknar alltså då "\r\n" som två tecken.

När servern skickar ett PING, så kommer alltså detta skickas: "xPING\r\n" ?
Ett meddelande på totalt 7 bytes, där första "x" är 6 i binär form (alltså ej i text/asciiform dvs 54).

Kanske kan vara värt att ta med att "\r\n" betyder 13 och 10 i binärform, så ingen misstar sig och skickar med dessa som text, för i bl a Delphi så escape:as inte dessa.

Funderade lite på varför du har med radbrytningar när man ändå måste ta bort dem, och första byten ändå anger hur lång strängen är? Innebär det kanske att man kan använda några enkla getline-liknande nätverksfunktioner i något språk så ha kvar dem.

Permalänk
Medlem

Radbrytningarna borde vara kvar, det underlättar i vissa språk, t.ex. ruby, där man har "readline" som läser sockets tills den stöter på en radbrytning.

Har börjat lite och märkt att det blir mycket lättare med readline.

Permalänk
Medlem

En snabb fråga bara
Varför används \r\n för att terminera rader här. Vet att det även är så i IRC-protokollet, men jag har som inte riktigt fattat poängen med \r innan newline som separerare. Är det för att man ska tillåta newlines i meddelandena eller? readline i många språk läser ju bara till \n så det sabbar ju newlines i meddelanden ändå om man använder det iaf

Tycker det ser soft ut annars. Längd-byten i början behövs väl egentligen inte. Många språk (java med fler) har ju readline som läser tills en radbrytning inträffar.

Andra språk som t.ex. python brukar man ju läsa in ett stort antal tecken ur socketen i en buffert, och sedan behandla den datan. Är ju inget större problem att splitta den vid newlines och på så sätt få sig en readline där heller Är inneffektivt (även om det inte spelar någon roll här) att bara läsa en byte med längden och sedan läsa in ett meddelande i taget väl?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av BobbyFromDallas
Här är en första revisionen av ett nätverksprotokoll för en framtida programmeringstävlingen med temat No Limit Texas Holdem. Jag är fortfarande inte övertygad om det intressanta med att skriva nätverksskod men majoriteten ville det so here it is:

http://swecpoker.googlecode.com/svn/trunk/protocol.txt

Även om jag försökt hålla saker o ting så enkelt som möjligt är jag lite orolig för att tävlingen kommer att resultera i att folk spenderar en massa tid på att få ihop en klient som lyckas kommunicera med servern och tröttnar innan man kommer till den roliga AI-biten.

Anyways, ta en titt och ös på med kritik.

Om det är någon som känner för att hjälpa till med att skriva servern så är det bara att hojta till.

Edit:

Vet inte riktigt om jag borde starta en ny tråd eller ej. Låter våra vänliga kvartersmoderatorer bestämma.

Är det inte mer logiskt att koda valörern 10 till åtminstånde 'T'? på så vis har alla valörer och färger längden en byte (ett ascii-tecken).

EDIT:

Vi enades väl om att skriva en server i python? I varje fall har jag skrapat ihop ett skelett till en server:

pokerserver.py

#!/usr/bin/env python from socket import * from select import * from string import * class pokerServer: def __init__(self, port, backlog=10): self.clients = [] self.timeout = 100000 self.master = socket(AF_INET, SOCK_STREAM) # Can reuse port self.master.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) self.adress = (gethostname(), port) self.master.bind(self.adress) self.master.listen(backlog) print "Server set up on: " + str(self.adress) def getMessage(self, client): # Get the length of the message. length = client.recv(1) # If recv returned "" then the client has died. # otherwise we have a message. if not length == "": message = client.recv(ord(length)) message.rsplit(':') return message.rsplit(':') else: raise IOError def handleMessage(self, message, fromClient): # handle messages here. pass def mainLoop(self): while True: # Wait for something to read. reads, writes, errors,= select(self.clients+[self.master], [], [], self.timeout); for read in reads: if (read == self.master): # We go a new connection # So add the new client to clients. client, address = read.accept() self.clients.append(client) print "New connection from: " + str(address) else: # A client sent a message try: message = self.getMessage(read) except IOError: self.clients.remove(read) print "Client unexpectedly disconnected." else: self.handleMessage(message, read) print "Client at said: " + str(message) if __name__ == "__main__": server = pokerServer(9999) server.mainLoop()

Visa signatur

MacBook Pro: 2.0GHz Intel Core Duo / ATI x1600 256MB / 1x1GB 667 DDR2 / 100GB SATA Drive@5400rpm

Permalänk
Medlem

Jag har ett förslag till en förändring i protokollet, sätt färgerna innan valören på korten, det blir lättare att parsea korten då.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av You
Jag har ett förslag till en förändring i protokollet, sätt färgerna innan valören på korten, det blir lättare att parsea korten då.

Om man ändrar '10' till 'T' borde det väl inte spela någon roll? (vilket jag håller med ookk att vi borde göra)...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av You
Jag har ett förslag till en förändring i protokollet, sätt färgerna innan valören på korten, det blir lättare att parsea korten då.

Det har väl ingen betydelse?

Jag jobbat lite mer med servern nu: (Måste hitta ett bättre sätt att lägga upp koden...)

#!/usr/bin/env python from socket import * from select import * from string import * from timer import * validPlayerIDs = ["1"] class pokerServer: def __init__(self, port, backlog=10): self.clients = [] self.players = [] self.pings = [] self.timeout = 100000 self.master = socket(AF_INET, SOCK_STREAM) # Can reuse port self.master.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) self.adress = (gethostname(), port) self.master.bind(self.adress) self.master.listen(backlog) print "Server set up on: " + str(self.adress) def getMessage(self, client): # Get the length of the message. length = client.recv(1) # If recv returned "" then the client has died. # otherwise we have a message. if not length == "": message = client.recv(ord(length)) message.rsplit(':') return message.rsplit(':') else: raise IOError def sendMessage(self, client, message): # Add the length at the beginning of the message string. length = len(message) message = str(ord(length)) + message sent = client.send(message) # An error or we did not send a whole message. if sent < len(message): raise IOError def didNotPong(client): pass def handleMessage(self, message, fromClient): # handle messages here. msgtype = messages[0] # LOGIN if msgtype == "LOGIN" nick = message[1] playerID = message[2] version = message[3] # Only valid players can connect. if (playerID in validPlayerIDs) players[playerID] = {"nick" : nick, "version" : version, "ping"} sendMessage(client, "STATUS:100:OK") else: sendMessage(client, "STATUS:202:Invalid PlayerID") # ACTION elif msgtype == "ACTION": what = message[1] if what = "FOLD": sendMessage(client, "STATUS:100:OK") elif what = "CHECK": sendMessage(client, "STATUS:100:OK") elif what = "CALL": sendMessage(client, "STATUS:100:OK") elif what = "BET": amount = message[2] sendMessage(client, "STATUS:100:OK") elif what = "RAISE": amount = message[2] sendMessage(client, "STATUS:100:OK") # PONG elif msgtype == "PONG": self.pings[client].cancel() def mainLoop(self): while True: # Wait for something to read. reads, writes, errors,= select(self.clients+[self.master], [], [], self.timeout); for read in reads: if (read == self.master): # We go a new connection # So add the new client to clients. client, address = read.accept() self.clients.append(client) print "New connection from: " + str(address) else: # A client sent a message try: message = self.getMessage(read) except IOError: self.clients.remove(read) print "Client unexpectedly disconnected." else: self.handleMessage(message, read) print "Client at said: " + str(message) if __name__ == "__main__": server = pokerServer(9999) server.mainLoop()

Visa signatur

MacBook Pro: 2.0GHz Intel Core Duo / ATI x1600 256MB / 1x1GB 667 DDR2 / 100GB SATA Drive@5400rpm

Permalänk
Medlem

Lägg upp koden på en private pastebin så länge, typ http://sweclockers.pastebin.com/

Citat:

Om man ändrar '10' till 'T' borde det väl inte spela någon roll? (vilket jag håller med ookk att vi borde göra)...

Har du iof. rätt i, men något av det borde man göra

Permalänk
Medlem

Ungefär vilken tid är det som det rör sig om? när ska man vara klar med sitt bidrag.

Visa signatur
Permalänk
Medlem

Hur kommer servern hantera ofrivilliga disconnects kommer man få en chans att koppla upp sig igen inom en viss tid eller är man körd?

Visa signatur
Permalänk
Medlem

borde ju agera så att om man inte svarar på eventuellt PING-msg så har man 30 sek på sig och om man inte svarat då disconnectas man på riktigt?

Visa signatur

Mycket mumbo-jumbo nu känner jag.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av xtermin8
Hur kommer servern hantera ofrivilliga disconnects kommer man få en chans att koppla upp sig igen inom en viss tid eller är man körd?

Det är upp till oss att bestämma.
Men jag tycker att det inte är så himla nödvändigt... ett pokerspel är ju inget som pågår speciellt länge. Om man disconnectas så kan man ju skita i spelet. Lär ju ändå inte hända för ofta. När vi kör tävlingen så får vi ju se till att alla är anslutna.

Citat:

Ursprungligen inskrivet av The-k0rf
borde ju agera så att om man inte svarar på eventuellt PING-msg så har man 30 sek på sig och om man inte svarat då disconnectas man på riktigt? [/B]

Som jag har tänkt mig att fortsätta koda servern så kommer den vänta på ett PONG svar i x sekunder. Om den inte fått svaret inom denna tid så droppas clienten.

Har kodat lite på en pokerspelar-klass:

http://sweclockers.pastebin.com/852658

Saknas bland annat logiken för att avgöra vem som vunnit / förlorat. Annars tror jag den är ganska komplett.

Visa signatur

MacBook Pro: 2.0GHz Intel Core Duo / ATI x1600 256MB / 1x1GB 667 DDR2 / 100GB SATA Drive@5400rpm

Permalänk
Citat:

Ursprungligen inskrivet av madah
Mjo, därför vore det bra med en minimal klient som man kan bygga vidare på. Syntaxen för ditt protokoll kan vi ju även använda i framtida tävlingar.

I ditt exempel får jag dock längden på "LOGIN:BobbyFromDallas:1253:VER1\r\n" till 33 bytes, inte 30? Jag räknar alltså då "\r\n" som två tecken.

När servern skickar ett PING, så kommer alltså detta skickas: "xPING\r\n" ?
Ett meddelande på totalt 7 bytes, där första "x" är 6 i binär form (alltså ej i text/asciiform dvs 54).

Kanske kan vara värt att ta med att "\r\n" betyder 13 och 10 i binärform, så ingen misstar sig och skickar med dessa som text, för i bl a Delphi så escape:as inte dessa.

Funderade lite på varför du har med radbrytningar när man ändå måste ta bort dem, och första byten ändå anger hur lång strängen är? Innebär det kanske att man kan använda några enkla getline-liknande nätverksfunktioner i något språk så ha kvar dem.

Tjena madah och alla andra.

Det är bara jag som räknat fel, allt du säger stämmer. Ska uppdatera texten i protokollet.

Förstår att det kan verka konstigt med att introducera radbrytningar samtidigt som man använder en längdangivelse. Det är en workaround för alla Unix system som använder en linebuffered stdio implementering, och detta är en del av min backupplan ifall det visar sig att det inte är praktiskt att skriva nätverkskod. Som ni kanske märker så skickar klienten egentligen två olika meddelanden, ACTION och PONG, medans servern spottar ur sig en massa meddelanden hela tiden. Även detta har en tanke bakom sig, skulle vi byta till stdio så finns det vissa idiotiska begränsingar när det kommer till IPC mellan två procecesser som använder stdio för att kommunicera med varandra. Klienten måste t.ex. flusha() alla write kommandon mot servern, annars buffras enbart datan, eller använda radbrytningar för att avsluta alla writes ifall serverns spawnar klientern via en pseudo-TTY (som i sin tur är "line-buffered"). Ju mindre klienten måste skicka till serverns, desto bättre.

Beroende på hur stor erfarenhet man har och nogrann man vill kan man välja mellan följande två implementeringmetoder:

1. Använder olika getline funktioner och skippar helt enkelt första tecknet i varje inkommande meddelande.
2. Vill lära sig det korrekta paranoida "trust no one" tänket och kollar av längdangivelse, använder timeouts etc.

Angående valörer och tecken för siffror, nja. Det finns säkert en hel del personer som har spelat poker och då känns TQ lagom främmande. Vad är problemet? 10Q och 2Q parsar man så här: strippa sista tecknet och lagra det som färgen, resten av strängen är kortets värde.

Angående servern:

Snygg jobbat, ookk. Jag håller som sagt på med logiken för servern, dvs. själva rollen som "dealern" i sammanhanget. Kommer med en uppdatering imorgon.

Finns det några oklarheter om hur det är tänkt att protokollet ska användas?

Kommer att uppdatera protokollet med ett exempel på en match mellan två spelare där jag kommenterar alla meddelanden som skickas mellan dem.

Denna uppdatering sker någon gång ikväll.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av BobbyFromDallas
Tjena madah och alla andra.

...

Kommer att uppdatera protokollet med ett exempel på en match mellan två spelare där jag kommenterar alla meddelanden som skickas mellan dem.

Denna uppdatering sker någon gång ikväll.

Perfekt håller just på att skissa lite på hur ett spel skulle kunna se ut och det hjälper till ganska mycket om du skriver ner ett exempel även om protokollet är ganska enkelt att förstå.

Visa signatur
Permalänk
Medlem
Citat:

Ursprungligen inskrivet av wallabou
Ungefär vilken tid är det som det rör sig om? när ska man vara klar med sitt bidrag.

Jag tycker vi kör en pågående tävling, i alla fall ett tag. Tror utvecklingsmöjligheterna är väldigt stora för pokerbotar så man kan förfina dom lite (mycket) mer till varje turnering... När första tävlingen ska gå av stapeln behöver vi ju inte slå fast nu, kan ju se hur utvecklingen går för folk...

"Angående valörer och tecken för siffror, nja. Det finns säkert en hel del personer som har spelat poker och då känns TQ lagom främmande. Vad är problemet? 10Q och 2Q parsar man så här: strippa sista tecknet och lagra det som färgen, resten av strängen är kortets värde."
- Jag har fått uppfattningen att T för tio var relativt väletablerat, men men inget stor grej som sagt (Sen kan man undra vad 2Q är för kort )

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av BobbyFromDallas
Tjena madah och alla andra.
etc.

Angående valörer och tecken för siffror, nja. Det finns säkert en hel del personer som har spelat poker och då känns TQ lagom främmande. Vad är problemet? 10Q och 2Q parsar man så här: strippa sista tecknet och lagra det som färgen, resten av strängen är kortets värde.

Angående servern:

Snygg jobbat, ookk. Jag håller som sagt på med logiken för servern, dvs. själva rollen som "dealern" i sammanhanget. Kommer med en uppdatering imorgon.

Finns det några oklarheter om hur det är tänkt att protokollet ska användas?

Det finns ju inget som hindrar att man kodar 10 som 'T' men visar det för användaren som strängen "10" ?
Bättre att att koda som 'T' men visa som 10.

Angående protokollet så skulle det vara bra att ha en...
STATUS:x:Server Full
...eftersom det kan inträffa.

EDIT
Jag har gjort ännu mer framsteg på servern samt att jag rensat allt som har med pokerspeladet att göra för det tänkte BobbyFromDallas implementera:

EDIT2:

server updaterad:
http://sweclockers.pastebin.com/852825

*nytt*
jag har skrivit ett skelett till en klient, det är bara att fylla i "din" kod på rätt ställe i handleMessage:
http://sweclockers.pastebin.com/852826

Visa signatur

MacBook Pro: 2.0GHz Intel Core Duo / ATI x1600 256MB / 1x1GB 667 DDR2 / 100GB SATA Drive@5400rpm

Permalänk
Medlem

Jag håller på att skriva en klient nu men är inte helt klar över reglerna i Texas Holdem.

Om det är min tur att betala small blind eller big blind och jag inte har råd, får jag då satsa alla pengar jag har och spela med, eller är jag ute ur spelet?

Om man är mitt inne i ett spel och någon annan bettar mer än min totala pengasumma, får jag då fortsätta spela om jag bettar alla pengar jag har?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av ChristofferC
Jag håller på att skriva en klient nu men är inte helt klar över reglerna i Texas Holdem.

Om det är min tur att betala small blind eller big blind och jag inte har råd, får jag då satsa alla pengar jag har och spela med, eller är jag ute ur spelet?

Om man är mitt inne i ett spel och någon annan bettar mer än min totala pengasumma, får jag då fortsätta spela om jag bettar alla pengar jag har?

1) Om du inte har råd så måste du satsa alla dina pengar, om du vinner så kommer antagligen inte hela potten att tilldelas dig. Det blir en så kallad "split" där tvåan får den del av potten som du inte betalat för.

2) Samma princip där, du väljer att all-in eller fold, du kan bara vinna vad du satsat i slutändan ändå. Om du vinner så kommer det bli en "split".

Visa signatur

MacBook Pro: 2.0GHz Intel Core Duo / ATI x1600 256MB / 1x1GB 667 DDR2 / 100GB SATA Drive@5400rpm

Permalänk
Medlem

Men blindsen och ens bankroll tas väl hand om servern om jag har förstått protokollet rätt, eller? Och om man inte har mer pengar, disconnectas man bara då eller hur går det till?

Permalänk
Medlem

Angående protokollet: Är det vettigt att ha MinBet, MaxBet när det är No-Limit-Holdem?

Visa signatur

MacBook Pro: 2.0GHz Intel Core Duo / ATI x1600 256MB / 1x1GB 667 DDR2 / 100GB SATA Drive@5400rpm