Yritän tehdä pokeripelialustaa, mutta ongelmakseni koituu kahden saman kortin vertailu, joka ei jostain syystä toimi. En tiedä johtuuko se siitä, että arvot näyttävät var_dump komennolla olevan string muotoa. Enkä jostain kumman syystä saa muutettua sitä int arvoksi.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com"> <title></title> </head> <body> <form name="pokeri" method="post"> <?php //print_r($_REQUEST); $luodutKortit = array(); $valitut = array(); $valitut = empty($_REQUEST['kortti']) ? 0 : $_REQUEST['kortti']; $numbers = array(); $numbers = range(0, 10); shuffle($numbers); var_dump($numbers); var_dump($valitut); if(empty($valitut)){ for($i = 0; $i <= 4; $i++){ echo '<input type="checkbox" name="kortti['.$numbers[$i].']" value="'.$numbers[$i].'">'. $numbers[$i] .' '; } }else{ $count = count($valitut); foreach($valitut as $val){ $luodutKortit[] .= intval($val); } var_dump($luodutKortit); for($x = 0; $x <= 4; $x++){ $valittuKortti = empty($luodutKortit[$x]) ? 0 : intval($luodutKortit[$x]); $arvottuKortti = intval($numbers[$x]); if($x < $count){ echo '<input type="checkbox" name="kortti['.$valittuKortti.']" value="'.$valittuKortti.'">'; echo $valittuKortti; } else { if($valittuKortti = $arvottuKortti){ echo '<input type="checkbox" name="kortti['.$arvottuKortti.']" value="'.$arvottuKortti.'">'; echo $arvottuKortti; }else{ echo 'sama'; } } } } ?> <input type="submit" value="Pyydä lisää kortteja"> </body> </form> </html>
manninen kirjoitti:
if($valittuKortti = $arvottuKortti){
Tässä sijoitat muuttujaan $valittuKortti muuttujan $arvottuKortti arvon ja sen jälkeen testaat onko ko. arvo tosi vai epätosi. Eli jos $arvottuKortti on 0, niin menee else-haaraan, muussa tapauksessa if-haaraan.
Vertailuoperaattori on PHP:ssä == tai ===. = on sijoitusoperaattori.
Ongelma ratkesi komennolla in_array, mutta törmäsin seuraavaan ongelmaan
onko mahdollista tehdä niin, että arvotaan numero väliltä 0-52, mutta numero ei saa olla esim 1,2,7
On mahdollista tehdä niin.
Vaikka et kysynytkään miten, kerron pyytämättä: Esimerkiksi arpomalla niin monta kertaa kunnes arvontatulos ei ole 1,2 tai 7.
Saanko muuten kysyä miksi arvotaan väliltä 0-52? Onko sinulla 53 kortin pakka? Vai tarkoititko väliä [0,52[
Grez kirjoitti:
Onko sinulla 53 kortin pakka?
Jokeri mukana?
Ei ole jokeria. korteissa liikaa. tuossa korttien arpomisen "moottori". Voisiko viisaammat vilkaista bugeja sekä antaa parannusvinkkejä. nyt pitää alkaa rakentamaan muuta :)
ps. näköjään edelleen voi tulla 2 samaa numeroa.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com"> <title></title> </head> <body> <form name="pokeri" method="post"> <?php //print_r($_REQUEST); $luodutKortit = array(); $valitut = array(); $valitut = empty($_REQUEST['kortti']) ? 0 : $_REQUEST['kortti']; $numbers = array(); $numbers = range(0, 6); shuffle($numbers); //var_dump($numbers); //var_dump($valitut); if(empty($valitut)){ for($i = 0; $i <= 4; $i++){ echo '<input type="checkbox" name="kortti['.$numbers[$i].']" value="'.$numbers[$i].'">'. $numbers[$i] .' '; } }else{ $count = count($valitut); foreach($valitut as $val){ $luodutKortit[] .= intval($val); } //var_dump($luodutKortit); for($x = 0; $x <= 4; $x++){ $arvottuKortti = intval($numbers[$x]); $valittuKortti = empty($luodutKortit[$x]) ? 0 : intval($luodutKortit[$x]); if($x < $count){ echo '<input type="checkbox" name="kortti['.$valittuKortti.']" value="'.$valittuKortti.'">'; echo 'valittu ' . $valittuKortti . ' '; } else{ if(in_array($arvottuKortti, $luodutKortit)){ $new_card = $numbers = rand(0, 6); if(in_array($new_card, $luodutKortit)){ $new_card = $numbers = rand(0, 6); echo '<input type="checkbox" name="kortti['.$new_card.']" value="'.$new_card.'">'; echo $new_card; }else{ echo '<input type="checkbox" name="kortti['.$new_card.']" value="'.$new_card.'">'; echo $new_card; } }else{ echo 'arvottu' . $arvottuKortti .' '; echo '<input type="checkbox" name="kortti['.$arvottuKortti.']" value="'.$arvottuKortti.'">'; }}} } ?> <input type="submit" value="Pyydä lisää kortteja"> </body> </form> </html>
Blaze kirjoitti:
Jokeri mukana?
Ajattelin kyllä sitäkin, mutta yleensä on 2 tai 0 jokeria, jonka takia 53 kortin pakka tuntui oudolta muttei tietenkään mahdottomalta.
Grez kirjoitti:
On mahdollista tehdä niin.
Vaikka et kysynytkään miten, kerron pyytämättä: Esimerkiksi arpomalla niin monta kertaa kunnes arvontatulos ei ole 1,2 tai 7.
Saanko muuten kysyä miksi arvotaan väliltä 0-52? Onko sinulla 53 kortin pakka? Vai tarkoititko väliä [0,52[
millä tavalla se tapahtuu?
ratkaistu
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta name="generator" content="PSPad editor, www.pspad.com"> <title></title> </head> <body> <?php echo "<p>POST: ", var_dump($_POST), "</p>"; ?> <form name="pokeri" method="post"> <?php $numbers = array(); $numbers = range(0, 6); shuffle($numbers); $valitut = array(); $valitut = empty($_REQUEST['kortti']) ? 0 : $_REQUEST['kortti']; if(empty($valitut)){ for($i = 0; $i <= 4; $i++){ echo '<input type="checkbox" name="kortti['.$numbers[$i].']" value="'.$numbers[$i].'">'. $numbers[$i] .' '; } }else{ $count = count($valitut); foreach($valitut as $val){ // Pidetään valitut kortit valittuina echo '<input type="checkbox" checked name="kortti['.$val.']" value="'.$val.'">'.$val.' '; } // valmiiks valitut pitää poistaa.. $numbers = array_diff($numbers, $valitut); for($x = $count; $x < 5; $x++) { $avain = array_rand($numbers); $arvottu = $numbers[$avain]; unset($numbers[$avain]); echo '<input type="checkbox" name="kortti['.$arvottu.']" value="'.$arvottu.'">'. $arvottu .' '; } } ?> <input type="submit" value="Pyydä lisää kortteja"> </body> </form> </html>
Ennen kuin lähden rakentamaan mitään if else if rakennetta ;) kysyisin vinkkejä millä tavalla kannattaa lähteä etsimään osumia pokeripöydässä.
Laittaisin kortit järjestykseen ja kävisin läpi löytyykö "käsi" arvokkaimmasta alkaen.
Jos et halua käyttää else if ... tyylistä rakennetta, niin voit toki tehdä käden hausta esim. funktion
(Alla olevan kirjoitin vaan suoraan tähän enkä ole mitenkään testannut. Idea selvinnee vaikka olisi virheitäkin)
function Käsi($kortit) { //0=pata2, 1=pata3, 12=pataässä, 13=ruutu2 jne. foreach ($kortit as $k) { $a = $k % 13; $arvo[] = $a; if (!isset($arvoja[$a])) $arvoja[$a] = 0; $arvoja[$a]++; } sort($arvo); rsort($arvoja); $väri = Maa(min($kortit)) == Maa(max($kortit)); $suora = Suora($arvo); if ($väri && $suora) return 1; //Värisuora if ($arvoja[0] == 4) return 2; //Neljä samaa if ($arvoja[0] == 3) return ($arvoja[1] == 2) ? 3 : 6; //Täyskäsi : kolmoset if ($väri) return 4; //Väri if ($suora) return 5; //Suora if ($arvoja[0] == 2) return ($arvoja[1] == 2) ? 7 : 8; //Kaksi paria : pari return 9; //Hai } function Maa($kortti) { return ($kortti - ($kortti % 13))/13; } function Suora($arvot) { for ($i=0; $i<4; $i++) if ($arvot[$i] != ($arvot[$i+1]+12)%13) return false; return true; }
Onko kyse tavallisesta pokerista vai texas holdemista? Jos jälkimmäisestä, tuolla on tehty code-golf tyyppisesti ratkaisu myös PHP:lle:
http://stackoverflow.com/questions/3364869/code-golf-who-has-the-best-poker-hand
Liikenteeseen olen lähdössä ihan tavallisen pokerin kannalta. Ensin on järkevämpää murtaa sen logiikan salat itselle ja sitten siirtyä muihin pokereihin.
Kiitos tuosta pätkästä! Tutustun siihen kerron miten käy.
foreach ($kortit as $k) { $a = $k % 13; $arvo[] = $a; if (!isset($arvoja[$a])) $arvoja[$a] = 0; $arvoja[$a]++; }
miksi kyseisen kohdan tulos on
Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 )
taisinpa tajuta :)
manninen kirjoitti:
miksi kyseisen kohdan tulos on
Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 )
Jos "tulos" tarkoittaa $arvo taulukkoa, niin koska olet antanut kortit-taulukossa neljä korttia, jotka on kaikki kolmosia.
Jos "tulos" tarkoittaa $arvoja taulukkoa, niin koska olet antanut kortit-taulukossa neljä korttia, jotka on numeroa 2, 3, 4 ja 5.
Ja huomasin muuten juuri, että koodissani on bugi, eli rivillä 11 pitäisi olla rsort eikä sort. (Korjasin)
Parse error: syntax error, unexpected T_VARIABLE, expecting ';' in C:\wamp\www\pokeri\kasi.php on line xx function Suora($arvot){ for (int $i=0; $i<4; $i++) if ($arvot[$i] != ($arvot[$i+1]+12)%13) return false; return true; }
virheilmoitus viittaa riviin for (int $i=0; $i<4; $i++) if ( ...., mutta en minä näe siinä kyseistä virhettä.
manninen kirjoitti:
virheilmoitus viittaa riviin for (int $i ...
Mikähän tuo int luulee rivillä olevansa?
Joo, se oli minun koodissa. (Kuten sanoinkin, voi olla virheitä). Helposti tulee automaagisesti sormista noita int määrityksiä for-looppeihin kun pääsääntöisesti koodailee muilla kielillä :D
Testasin nyt sitten tuon laittamani koodin ja enää siinä ei ollut jäljellä virheitä, kun int poistettiin ja aiemmin mainittu sort -> rsort -muutos oli tehty.
Aihe on jo aika vanha, joten et voi enää vastata siihen.