Seite 1 von 1

PHP: Verschachtelte IF-Abfrage - ein Problem

Verfasst: 25. Feb 2010, 17:28
von Latzhosenträger
Ich, ein PHP-Noob bastle gerade an etwas herum.
Ein teil davon ist es, den Handwert auf einer Hand im Kartenspiel "Schwimmen" zu errechnen. Allerdings habe ich einen Fehler darin. Ich finde ihn nicht.

Das Ergebnis ist 11, sollte aber 21 sein. Die 3 Karten (Wird im Code nicht ersichtlich) sind Pik Ass, Pik König und Kreuz 7.

Code: Alles auswählen

  <?php
  include("arrays.php");

  $karte1 = $kartenid[7];
  $karte2 = $kartenid[8];
  $karte3 = $kartenid[10];

  $kartenfarbe1 = $kartenfarbe[$karte1];
  $kartenfarbe2 = $kartenfarbe[$karte2];
  $kartenfarbe3 = $kartenfarbe[$karte3];

  $kartenwert1 = $kartenwert[$karte1];
  $kartenwert2 = $kartenwert[$karte2];
  $kartenwert3 = $kartenwert[$karte3];

  $kartenart1 = $kartenart[$karte1];
  $kartenart2 = $kartenart[$karte2];
  $kartenart3 = $kartenart[$karte3];

  $kartenname1 = $kartenname[$karte1];
  $kartenname2 = $kartenname[$karte2];
  $kartenname3 = $kartenname[$karte3];

  if($kartenfarbe1 == $kartenfarbe2)
  {
    if($kartenfarbe1 == $kartenfarbe3)
    {
	   $handwert = $kartenwert1 + $kartenwert2 + $kartenwert3;
    }
  }
  else
  {
	  $handwert = $kartenwert1 + $kartenwert2;
  }

   if($kartenfarbe2 == $kartenfarbe3)
    {
      $handwert = $kartenwert2 + $kartenwert3;
    }
  elseif($kartenart1 == $kartenart2)
    {
      if($kartenart1 == $kartenart3)
      {
        if($kartenart1 == "Ass")
             {
             $handwert = "33";
             }
        else {
                   $handwert = "30,5";
                 }
       }
	} 
  elseif(($kartenwert1 > $kartenwert2) && ($kartenwert1 > $kartenwert3))
     {
     $handwert = $kartenwert1;
     }
  elseif(($kartenwert2 > $kartenwert1) && ($kartenwert2 > $kartenwert3))
     {
     $handwert = $kartenwert2;
     }
  else
     {
     $handwert = $kartenwert3;
     }
    
echo "$handwert";
  ?>

Re: PHP: Verschachtelte IF-Abfrage - ein Problem

Verfasst: 25. Feb 2010, 18:39
von drancer
Ich kenn mich nicht allzu gut mit php aus, bin also auch ein Laie, aber ich denke ich kann helfen:
1.

Code: Alles auswählen

 ...
if($kartenfarbe1 == $kartenfarbe2)
  {
    if($kartenfarbe1 == $kartenfarbe3)
    {
      $handwert = $kartenwert1 + $kartenwert2 + $kartenwert3;
    }
  }
  else
  {
     $handwert = $kartenwert1 + $kartenwert2;
  }...
Da ist ein kleiner Fehler drin, das "else" bezieht sich auf das 1. if, sollte sich aber auf das 2. if beziehen.
Daher gibt dein Code dir nur den höchsten Wert aus, in deinem Fall 11, da das Ass die höchste Karte ist.

Abgesehen davon, mach das doch nicht so umständlich. Folgendes ist viel leichter zu verstehen und zu kommentieren:

Code: Alles auswählen

... Initialisierung wie gehabt...
$handwert = $kartenwert1;   //"Mindestwert" quasi
if ($kartenwert2 > $handwert)   //Werte vergleichen, falls Karte 2 größer -> neuer Handwert
   $handwert = $kartenwert2;

if ($kartenwert3 > $handwert)   //Werte vergleichen, falls Karte 3 größer -> neuer Handwert
   $handwert = $kartenwert3;


if ($kartenfarbe1 == $kartenfarbe2)   // Farbe der ersten beiden Karten -> Summe als Handwert
   $handwert = $kartenwert1 + $kartenwert2;

if ($kartenfarbe1 == $kartenfarbe3)   // Farbe der ersten und dritten Karte -> Summe als Handwert
   $handwert = $kartenwert1 + $kartenwert3;

if ($kartenfarbe2 == $kartenfarbe3)   // Farbe der letzten beiden Karten -> Summe als Handwert
   $handwert = $kartenwert2 + $kartenwert3;

if (($kartenfarbe1 == $kartenfarbe2) && ($kartenfarbe1 == $kartenfarbe3))   //alle drei Farben überprüfen
   $handwert = $kartenwert1 + $kartenwert2 + $kartenwert3;


if($kartenart1 == $kartenart2)          //den Teil hab ich von dir übernommen
    {
      if($kartenart1 == $kartenart3)
      {
        if($kartenart1 == "Ass")
             {
             $handwert = "33";
             }
        else {
                   $handwert = "30,5";
                 }
       }
   } ... 
Die ganzen Verschachtelungen find ich zu verwirrend ;)
Außerdem sieht man, wenn man die Variable $handwert andauernd verändert, eher wo der Fehler liegen kann. Man gehe zu dem Punkt, an dem $handwert der Endwert übergeben wird, alles drüber ist richtig, im Rest liegt der Fehler.

Re: PHP: Verschachtelte IF-Abfrage - ein Problem

Verfasst: 25. Feb 2010, 18:49
von Latzhosenträger
Super, das ist mein Fehler, ich denke zu kompliziert. :>
Manchmal hau ich mir echt an die Stirn. :D

Jetzt hab ich noch eine kleinigkeit geändert

Code: Alles auswählen

if(($kartenart1 == $kartenart2) && ($kartenart1 == $kartenart3))          //30 Halbe + Blitz
    {
        if($kartenart1 == "Ass")
             {
             $handwert = "33";
             }

        else {
             $handwert = "30,5";
               }
    }
So ists besser ;)

Danke.

Re: PHP: Verschachtelte IF-Abfrage - ein Problem

Verfasst: 25. Feb 2010, 21:33
von check
Wieso so umständlich?
Geschweifte Klammern sind doch nur bei Anweisungsblöcken nötig.

if($kartenart1 == "Ass")
{
$handwert = "33";
}
Hier z.B. könntest du die {} dir sparen, hilft der Übersichtlichkeit!

Re: PHP: Verschachtelte IF-Abfrage - ein Problem

Verfasst: 26. Feb 2010, 02:08
von mopf
wieso benutzt du überhaupt so viele if else anwendungen?

nutz doch switch case. ist übersichtlicher:

http://php.net/manual/de/control-structures.switch.php

Re: PHP: Verschachtelte IF-Abfrage - ein Problem

Verfasst: 26. Feb 2010, 16:41
von bwoebi
stetha, er sagt er wäre PHP-Noob, in der Hinsicht muss ich dir aber recht geben ;)

Re: PHP: Verschachtelte IF-Abfrage - ein Problem

Verfasst: 26. Feb 2010, 18:12
von mopf
deswegen habe ich ja nen link mit erklärungen gepostet ;)