Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Pokeri

Sivun loppuun

manninen [29.05.2012 15:37:34]

#

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>

Grez [29.05.2012 15:52:37]

#

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.

manninen [29.05.2012 16:53:58]

#

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

Grez [29.05.2012 17:10:48]

#

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[

Blaze [29.05.2012 17:16:59]

#

Grez kirjoitti:

Onko sinulla 53 kortin pakka?

Jokeri mukana?

manninen [29.05.2012 17:22:33]

#

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>

Grez [29.05.2012 17:26:19]

#

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.

manninen [29.05.2012 18:07:12]

#

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?

Grez [29.05.2012 18:35:05]

#

Vaikkapa

$eisallitut = array(1,2,7);
while(in_array($arvottu = rand(0,51), $eisallitut)) {}

manninen [29.05.2012 22:44:41]

#

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>

manninen [30.05.2012 08:08:58]

#

Ennen kuin lähden rakentamaan mitään if else if rakennetta ;) kysyisin vinkkejä millä tavalla kannattaa lähteä etsimään osumia pokeripöydässä.

Grez [30.05.2012 08:37:12]

#

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;
}

ZeroGravity [30.05.2012 09:03:11]

#

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

manninen [30.05.2012 10:08:31]

#

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.

manninen [30.05.2012 16:41:05]

#

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 :)

Grez [30.05.2012 16:48:39]

#

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)

manninen [31.05.2012 10:02:30]

#

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ä.

Metabolix [31.05.2012 11:02:49]

#

manninen kirjoitti:

virheilmoitus viittaa riviin for (int $i ...

Mikähän tuo int luulee rivillä olevansa?

Grez [31.05.2012 11:09:22]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta