Olen jo kirjoutellut pokeripelini teosta muutamia kysymyksiä jotka jotkut varmaan muistavat. Nyt tuli todella paha ongelma eteen enkä ole parin päivän miettimisellä keksinyt. Ongelmia on kaksi.
1. Ongelma:
Minun pitäisi saada selville kuka on maksanut potin koska koodi toimii siten että se käy vuorotellen kaikki pelaajat läpi. Kun tulee sivupotti siitä seuraava pelaaja käy läpi kaikki sivupotit jotka on syntynyt sillä kierroksella ja maksaa niihin. Ongelma on se että jos pelaaja on jo maksnut pottiin. Esim.
Pelaaja1: korottaa 500
Pelaaja2: maksaa allin ja tekee sivupotin
Pelaaja3: korottaa 1000
Pelaaja4: maksaa allin ja tekee sivupotin.
Pelaaja1: korottaa 2000
Pelaaja2: vuoroa ei tule koska rahat 0
Pelaaja3: maksaa ensimmäisestä sivupotista lähtien kaikkiin potteihin vaadittavan summan.
Tästä näkee että ongelmana on että pelaaja maksaa ensimmäiseen sivupottiin kaksi kertaa. Olen miettinyt ongelman ratkaisuksi sellaista että tallentaisin nimen perään kaikkien pelaajien nimet jotka ovat maksaneet sivupottiin. Sivupotissa on jo ennestään pelaajan nimi joka teki sivupotin, kierros jolla tämä tapahtui ja paljonko jäi maksamatta.
Ongelma2:
Minun pitäisi saada sivupottien maksajien määrä selville. Kun tulee tilanne että sivupotteja on tullut sitten tulee pelaajan vuoro joka ei ole tällä kierroksella maksanut. Hänellä ei riitä kuin ekan sivupotin maksuun rahat jonka jälkeen hän tekee sivupotin entisen sivupotin tilalle ja siirtää entist yhden eteenpäin. Tietty määrä rahaa pitää siirtää takaisin tähän pottiin joten minun pitäisi saada maksajien määrä selville. Jos tekisin ongelma 1 ratkaisun voisin helposti katsoa maksajien määrän.
En ole kovin hyvä selittämään tätä asiaa näin lyhyesti. Koodini on varmasti turhan monimutkainen mutta toivon että jotkut voisivat vastata tähän jotain tai edes kysyä jotain. Viimeksi oli samanlainen ongelma että en osannut selittää mutta joku sanoi jotain niin tajusin että miten asia pitäisi toteuttaa. Kiitos kaikista vastauksista niistä on varmasti paljon apua.
Konkreettisen esimerkin näyttämistä hankaloittaa, että tosta sun selostuksesta ei käy ilmi, paljonko noi All-in:t on.
Mutta jos oletaan, että pelaajilla on käytettävissä:
P1 53000
P2 8425
P3 25984
P4 15446
Mun mielestä tuossa ei oikeasti tarvitse pitää muuta tietoa, kuin paljonko pelaajalla on potissa rahaa ja onko pelaaja foldannut:
Eli tässä esimerkissäsi lopputulos olisi, että kukaan ei ole foldannut ja rahaa on potissa seuraavasti
Potissa:
P1 17446
P2 8425
P3 17446
P4 15446
Näiden perusteella saat laskettua
1) Näytettävät sivupotit
2) Voitonjaon kun tiedät käsien paremmuusjärjestyksen
Eli jos nyt päässä lasken niin
Pääpotti: 8425, mukana kaikki
Sivupotti 1: 7021, mukana Pelaajat 1,3 ja 4
Sivupotti 2: 2000, mukana Pelaajat 1 ja 4
Voitonjoka mun mielestä olisi helpointa tehdä ihan välittämättä mistään sivupoteista tuolla "paljonko pelaaja on laittanut rahaa ja onko foldannut taulukolla". Eli mennään vaan käsien peremmuusjärjestyksessä
Toista kullekin ei-foldanneelle pelaajalle paremmuusjärjestyksessä
1) Ota potissa jäljelläolevista rahoista kultakin max sen verran kuin itsellä on potissa jäljellä
Jos useammalla pelaajalla on tasapeli, niin sitten niissä täytyy mennä pelaajat siinä järjestyksessä, että ensimmäiseksi vähiten panostanut saa 1/n normaalista voitosta, sitten seuraava 1/(n-1) ja sitä seuraava 1/(n-2) jne.
Eli tällä logiikalla koko homma on alle tunnin koodausurakka eikä mitään ongelmia pitäisi tulla.
Kiitos vastauksesta Grez. Tuo kuulosti hyvältä mutta en oikein tainnut ymmärtää koska tässä on edelleen mielestäni ongelma. Esim.
Pelaajilla on rahaa:
player1 - 10 100$
player2 - 5 100$
player3 - 7 600$
Aluksi kaikilta otetaan blindit eli 100$.
Potti on siis 300$ ja pelaajilla on 100$ vähemmän rahaa.
Sitten tulee ensimmäinen kierros:
Player1 korottaa 10 000$.
Player2 maksaa 5000$.
player3 maksaa 7500$.
Potit näyttävät tämän jälkeen seuraavilta.
Potti 2 500$ (vain player1 mukana)
Potti2 15 300$ (kaikki mukana)
Potti3 5 000$ (player1 ja player3 mukana)
Eli mikäli oikein ymmärsin nyt pelaajat asetetaan paremmuus järjestykseen:
#1 player2
#2 player1
#3 player3
Sitten katsotaan paljonko player2 on laittanut pöydälle (eli kaikkiin potteihin). Summa on 100$(blindi) + 5000$ = 5100$. Nyt tästä eteenpäin en ymmärrä mitä pitäisi tehdä koska jos kerromme luvun 5100$ mukanaolijoiden määrällä saamme luvun joka ei välttämättä ole oikea koska emme tiedä kuinka moni maksoi silloin mutta foldasi ennen potin jakoa.
Näihin on vaikee vastailla, kun et kerro kaikki olennaisia yksityiskohtia. Oon esim. olettanut että kyseessä olisi normaali Texas Hold-Em, mutta tokihan voi olla että puhut jostain muusta pokerin lajista.
E1ss kirjoitti:
Player1 korottaa 10 000$.
Player2 maksaa 5000$.
player3 maksaa 7500$.
Ahaa, pelataanko tässä siis sellaisilla säännöillä, että voi vaan päättää maksaa pienemmän summan kuin mihin on korotettu, vaikkei menisi all-in? (Vai menikö noi all-in ja sattui nyt vaan olemaan noin pyöreen verran jäljellä?)
E1ss kirjoitti:
Sitten katsotaan paljonko player2 on laittanut pöydälle (eli kaikkiin potteihin). Summa on 100$(blindi) + 5000$ = 5100$. Nyt tästä eteenpäin en ymmärrä mitä pitäisi tehdä koska jos kerromme luvun 5100$ mukanaolijoiden määrällä saamme luvun joka ei välttämättä ole oikea koska emme tiedä kuinka moni maksoi silloin mutta foldasi ennen potin jakoa.
No siis tähän mennessä ainakaan et oo kertonut että kukaan olisi foldannut... Mun mielestä normaaleilla säännöillä pelaaja on maksanut joko
1) "täyden määrän" tai
2) jotain ja on all-in tai
3) jotain, jonka jälkeen foldannut.
Eli onko mulla väärä käsitys säännöistä? Vai onko noi sivupotit sellaisia, joita pelaajat voi ihan vaan huvikseen muodostella. Eli esim. pelaaja 1 ja 3 vois sopia keskenään missä vaiheessa vaan peliä, että pistävät pystyyn sivupotin joka ei vaikuta muihin pelaajiin mitenkään?
Ei kun ihan normaalit säännöt. Player2 maksoi kaikki peliin. Voit katsoa esimerkin alusta
player1 - 10 100$
player2 - 5 100$
player3 - 7 600$
Että player2 omisti vain 5000$. Hän maksoi kaikki koska edellinen pelaaja oli laittanut 10k$ eikä hänellä ollut enempää rahaa.
Lisäys: Tästä muodostui ensimmäinen sivupotti.
Lisäys: Kun sanoit että pelaaja olisi normaali säännöillä maksanut täyden määrän niin mitä tarkoitat. Ei pelaaja voi maksaa 10k jos hänellä on vain 5k.
Niin siis tossa sun esimerkissä "täysi määrä" on 10 100. Jos rahat ei riitä eikä halua foldata, niin voi mennä "all-in", jolloin se määrä on jotain muuta kuin "täysi määrä" (mun listalla vaihtoehto 2)
Niin eli player2 ja player3 tekee vaihtoehdon 2. Mutta huomaa että pelaajat ovat maksaneet blindit ensimmäisellä kierroksella ja nyt heillä on
player1 - 10 000$
player2 - 5000$
player3 - 7500$
Mä en nää että sillä olis mitään merkitystä, onko kyseessä blindi, katsominen, korotus, vai all-in. Ainoo millä on merkitystä että paljonko kaikkiaan rahaa on tuupannut ja onko foldannut vai ei.
Se mitä en nyt suorilta muista että jos foldaa jossain kohti, niin voiko silti saada vielä jotain rahoja. Olin ton mun esimerkin kirjoittanut ajatuksella että ei, mutta tuskin on ongelma muuttaa toimimaan oikein jos foldannutkin voi saada jotain.
Esim.
Player1 korottaa 10 000
player2 maksaa 5000 (KOSKA RAHAT LOPPUIVAT ELI ON ALLIN)
player3 maksaa 10 000
Player4 maksaa 10 000
Potti 15 000 (kaikki paitsi player2 mukana)
Potti2 20 000 (kaikki mukana)
Seuraavaksi jaetaan yksi pöytäkortti. Sen jälkeen player3 foldaa. Lopuksi katsotaan kenellä on paras käsi. Player2 omistaa parhaan käden.
Miten lasketaan paljonko hän saa rahaa jos ei ole tallennettu tietokantaan että player kahdelta loppui rahat kesken eikä hän ole mukana potissa? Jos lasketaan niinkuin ehdotit että mukanaolijat * pelaajan laittamat rahat laskutoimitus olisi:
3(koska yksi pelaaja on foldannut tässä vaiheessa) * 5000
Foldannut ei sääntöjen mukaan saa mitään.
E1ss kirjoitti:
Seuraavaksi jaetaan yksi pöytäkortti. Sen jälkeen player3 foldaa.
Eli P3 foldaa, koska ei halua maksaa minimikatsomismaksua? (Vai ihan vaan huvikseen vaikka ei tarvitsisi tuossa vaiheessa laittaaa rahaa lisää muutenkaan?)
Anyways, jos ajatellaan että kerroit kaikki tapahtumat mitä tuolla kierroksella tapahtui, niin lopputuloshan olisi, että seuraavat on sijoitettu:
P1: 10000
P2: 5000
P3: 10000 Folded
P4: 10000
Eli jos playerillä 2 on paras, käsi, niin annetaan P2:lle kaikkien pelaajien sijoittamista rahoista max 5000, eli tässä tapauksessa 20000.
Tämän jälkeen potissa on vielä
P1: 5000
P2: 0
P3: 5000 Folded
P4: 5000
Sit pitäis tietää kummalla (P1 vai P4) on paremmat kortit, että tiedettäis, kuka saaa 15000
Miten koodi pystyy tietämään että player3 maksoi panostuksen. On mahdollista että hän olisi foldannut ennen kuin panostukset tehtiin.
Lisäys: Uskon kuitenkin keksineeni ratkaisun joten kiitos ajastasi. Lähden kehittelemään ideaani.
E1ss kirjoitti:
Miten koodi pystyy tietämään että player3 maksoi panostuksen. On mahdollista että hän olisi foldannut ennen kuin panostukset tehtiin.
No miksi koodin pitäisi se erikseen vielä tietää? Jos on maksanut panostuksen, niin silloin kierrokseen häneen sijoittamansa summa on sen panostuksen verran enemmän.
Jotenkin koko ajan kuulostaa, että yrität tehdä yksinkertaiset asiat turhan vaikeasti.
Siis nyt et ymmärää aivan tilannetta. Tuo idea minkä sanoit toimii suurimman osan ajasta mutta välillä yksi pelaaja foldaa ensimmäisellä kierroksella nyt teoreettisesti ilman syytä. Seuraavalla kierroksella pelaajat korottavat ja syntyy sivupotti. Lopuksi kun katsotaan että pelaaja joka teki sivupotin omistaa parhaan käden. Sinun ideasi oli että kerrotaan mukana olijoiden määrällä sivupotin tehneen pelaajan laittamat panokset. Yksi pelaaja on kuitenkin foldannut ennen kuin kukaan on korottanut joten hän ei ole maksanut panosta. Sivupotin tehneelle pelaajalle annetaan siis liikaa rahaa jonka takia vika ei saa ollenkaan rahaa. Tämä texas hold'emin teko on paljon hankalampaa kuin päältä näyttää. Itseäkin harmittaa kun lähdin tekemään näin hankalaa projektia jota en ehkä koskaan saa tehtyä.
E1ss kirjoitti:
Siis nyt et ymmärää aivan tilannetta. Tuo idea minkä sanoit toimii suurimman osan ajasta mutta välillä yksi pelaaja foldaa ensimmäisellä kierroksella nyt teoreettisesti ilman syytä.
Sehän toimii silloinkin aivan mainiosti..
Pistetään vaikka nyt alkupanos 100 kultakin, sit pelaaja 1 katsoo 200:lla, pelaaja 2 foldaa, pelaaja 3 korottaa 1000, pelaaja 4:llä on jäljellä vain 933 mutta laittaa all-in, pelaaja 1 katsoo. Potissa on seuraavat:
P1: 1300
P2: 100 Fold
P3: 1300
P4: 1033
Sanotaan vaikka että P4:llä olis paras käsi ja P1 toiseks paras, niin:
P4: saa max 1033 kunkin laittamista rahoista, eli 1033 + 100 + 1033 + 1033 = 3199, jonka jälkeen
P1: 267
P2: 0 Fold
P3: 267
P4: 0 (voidaan myös ajatella Foldiksi tässä vaiheessa)
Joten P1 saa 267+267 = 534
E1ss kirjoitti:
Sinun ideasi oli että kerrotaan mukana olijoiden määrällä sivupotin tehneen
Ei ollut. Minun ideassa ei ollut yhtään kertolaskua.
E1ss kirjoitti:
Sivupotin tehneelle pelaajalle annetaan siis liikaa rahaa jonka takia vika ei saa ollenkaan rahaa.
Siis missä kohti annetaan liikaa rahaa? Olet varmaan lukenut jotenkin väärin mitä olen kirjoittanut.
Aihe on jo aika vanha, joten et voi enää vastata siihen.