Seite 1 von 4

Automat

Verfasst: Mo Dez 28, 2015 11:11 pm
von sashpta
Hey,
ich muss gerade für die Schule nen "Einarmigen Banditen" mit PHP programmieren.
Klappt soweit auch ganz gut, man kanns bestimmt viel kürzer und übersichtlicher schreiben aber hauptsache es funktioniert erst mal :D

Das Ziel ist es, wenn 3 Bilder gleich sind, entweder Diagonal oder in einer waagerechten Reihe, dass man dann gewinnt. (Man gewinnt "mehr", wenn man 2 Reihen hat oder alle gleich oder 2 Diagonale usw.)
Das Problem jetzt ist nur, dass ab und zu (echt super selten), man die Meldung bekommt, man hätte 3 in einer Reihe oder so, obwohl es nur 2 Gleiche sind. Nur ich finde den Fehler nicht. Ist das einfach eine Art "Bug" in PHP oder, was ich für viel wahrscheinlicher halte, ein Fehler bei meinem Code.
Das Einze was sein könnte ist, dass er das Falsche anzeigt, wenn man z.B. 2 mal 2 gleiche Reihen hat (-> 1. und 2. Reihe gleich, als bsp.), das habe ich bis jetzt noch nicht ausprobiert. Aber das kann doch eigentlich nicht der Grund dafür sein, dass er bei 2 Gleichen sagt es seien 3.

Hier mal der Code:

Code: Alles auswählen

<!DOCTYPE html>
<html>
<head>

</head>
<body>

<?php
	$feld[0] = rand(1, 9);
	$feld[1] = rand(1, 9);
	$feld[2] = rand(1, 9);
	$feld[3] = rand(1, 9);
	$feld[4] = rand(1, 9);
	$feld[5] = rand(1, 9);
	$feld[6] = rand(1, 9);
	$feld[7] = rand(1, 9);
	$feld[8] = rand(1, 9);



	# gewinne:
		# Reihe / Diagonal = Sieg
		# 2 Diagonal / 2 Reihen = Doppel Sieg
		# 2 Diagonal + 1 Reihe / 2 Reihen + 1 Diagonal = Dreifach Sieg
		# Alle = Jackpot

	# Texte bei Gewinn:

		$Sieg_R = "SIEG! Du hast 3 Gleiche in einer Reihe!"; 												# done
		$Sieg_D = "SIEG! Du hast 3 Gleiche diagonal!";														# done
		$D_Sieg_R = "DOPPEL SIEG!! Du hast 2 mal 3 Gleiche in einer Reihe!";								# done
		$D_Sieg_D = "DOPPEL SIEG!! Du hast 2 mal 3 Gleiche diagonale!";										# done
		$T_Sieg_2R = "DREIFACH SIEG!!! Du hast 2 mal 3 Gleiche in einer Reihe und 1 diagonales!";
		$T_Sieg_2D = "DREIFACH SIEG!!! Du hast 2 Diagonale und einmal 3 Gleiche in einer Reihe!";
		$Jackpot = "JACKPOT!!!!!!!!!";																		



	# Variablen um zu überprüfen was für ein "Sieg" es ist:

		$ReiheTOP = false;
		$ReiheMID = false;
		$ReiheBOT = false;
		$DiaLR = false;
		$DiaRL = false;
		$DoppelReihe = false;
		$DoppelDia = false;

    for ($i = 0; $i < 3; $i++) {
        Bilder($feld[$i]);
      }

	echo "<br>";

    for ($i = 3; $i < 6; $i++) {
        Bilder($feld[$i]);
      }

	echo "<br>";

    for ($i = 6; $i < 9; $i++) {
        Bilder($feld[$i]);
      }

	echo "<br>";


	function Bilder($feld) {
	switch ($feld):
		 case 1:
		 	 echo '<img src="http://www.kissenjunkie.de/wp-content/uploads/2015/12/Celeste-Kissen-grau-kleine-Sterne-300x300.jpg" width = "50px" height "50px">';
		 	 break;
		 case 2:
		 	 echo '<img src="http://geschenke-fuer-maenner.bernaunet.eu/wp-content/uploads/2015/10/kleiner-Schutzengel-300x300.jpg" width = "50px" height "50px>';
		 	 break;
		 case 3:
		 	 echo '<img src="http://opensource.org/files/osi_keyhole_300X300_90ppi.png" width = "50px" height "50px>';
		 	 break;
		 case 4:
		 	 echo '<img src="http://www.tierisch-gut-drauf.com/wp-content/uploads/sites/12/2015/07/kleiner-kratzbaum-300x300.jpg" width = "50px" height "50px>';
		 	 break;
		 case 5:
		 	 echo '<img src="http://www.cricketlife.net/wp-content/uploads/2015/12/fliesen-fr-kleine-bder-300x300.jpg" width = "50px" height "50px>';
		 	 break;
		 case 6:
		 	 echo '<img src="http://www.opticbits.com/wp-content/uploads/2015/12/sofas-fr-kleine-rume-300x300.jpg" width = "50px" height "50px>';
		 	 break;
		 case 7:
		 	 echo '<img src="http://www.febs.de/wp-content/uploads/2015/05/LinkedIn_logo_initials-300x300.png" width = "50px" height "50px>';
		 	 break;
		 case 8:
		 	 echo '<img src="http://kleinehilfsaktion.de/wp-content/uploads/2014/10/ausblick-kleine-hilfsaktion-300x300.jpg" width = "50px" height "50px>';
		 	 break;
		 case 9:
		 	 echo '<img src="http://www.opticbits.com/wp-content/uploads/2015/11/fliesen-ideen-kleine-badezimmer-300x300.jpg" width = "50px" height "50px>';
		 	 break;
		 endswitch;

}
	# erste Reihe komplett gleich
	if ($feld[0] == $feld[1]) {
		if ($feld[1] == $feld[2]) {
			echo $Sieg_R;
			$ReiheTOP = true;
		}
	}

	# zweite Reihe komplett gleich
	if ($feld[3] == $feld[4]) {
		if ($feld[4] == $feld[5]) {
			echo $Sieg_R;
			$ReiheMID = true;
		}
	}

	# dritte Reihe komplett gleich
	if ($feld[6] == $feld[7]) {
		if ($feld[7] == $feld[8]) {
			echo $Sieg_R;
			$ReiheBOT = true;
		}
	}

	# diagonal (links nach rechts)
	if ($feld[0] == $feld[4]) {
		if ($feld[4] == $feld[8]) {
			echo $Sieg_D;
			$DiaLR = true;
		}
	}

	# diagonal (rechts nach links)
	if ($feld[2] == $feld[4]) {
		if ($feld[4] == $feld[6]) {
			echo $Sieg_D;
			$DiaRL = true;
		}
	}
	
	
 	
 	# 2 GLeiche, oben, mitte
	if ($ReiheTOP == true and $ReiheMID == true) {
		echo $D_Sieg_R;
		$DoppelReihe = true;
	}

	# 2 Gleiche, oben, unten
	if ($ReiheTOP == true and $ReiheBOT == true) {
		echo $D_Sieg_R;
		$DoppelReihe = true;
	}

	# 2 Gleiche, mitte, unten
	if ($ReiheMID == true and $ReiheBOT == true) {
		echo $D_Sieg_R;
		$DoppelReihe = true;
	}
 
	# 2 Gleiche, Diagonal
	if ($DiaLR == true and $DiaRL == true) {
		echo $D_Sieg_D;
		$DoppelDia = true;
	}

	# 3 Gleiche, 2 Reihe + Dia l-r
	if ($DoppelReihe == true and $DiaLR == true) {
		echo $T_Sieg_2R;
	}

	# 3 Gleiche, 2 Reihe + Dia r-l
	if ($DoppelReihe == true and $DiaRL == true) {
		echo $T_Sieg_2R;
	}

	# 3 Gleiche, 2 Dia + Reihe, oben
	if ($DoppelDia == true and $ReiheTOP == true) {
		echo $T_Sieg_2D;
	}

	# 3 GLeiche, 2 Dia + Reihe, mitte
	if ($DoppelDia == true and $ReiheMID == true) {
		echo $T_Sieg_2D;
	}

	# 3 Gleiche, 2 Dia + Reihe, unten
	if ($DoppelDia == true and $ReiheBOT == true) {
		echo $T_Sieg_2D;
	}

	# Alle gleich
	if ($DoppelReihe == true and $ReiheTOP == true || $DoppelReihe == true and $ReiheMID == true || $DoppelReihe == true and $ReiheBOT == true) {
		echo $Jackpot;
	}



?>

	</body>
</html>

Hoffe ihr versteht was ich meine und könnt mir helfen. :)
Danke

MFG

Re: Automat

Verfasst: Di Dez 29, 2015 3:25 pm
von Xin
sashpta hat geschrieben:Hey,
ich muss gerade für die Schule nen "Einarmigen Banditen" mit PHP programmieren.
Klappt soweit auch ganz gut, man kanns bestimmt viel kürzer und übersichtlicher schreiben aber hauptsache es funktioniert erst mal :D
Naja, aktuell funktioniert es nicht und Du siehst den Fehler nicht.
Eine Möglichkeit dem Fehler auf die Schliche zu kommen wäre es also kürzer und übersichtlicher zu schreiben. ^^
sashpta hat geschrieben:Das Ziel ist es, wenn 3 Bilder gleich sind, entweder Diagonal oder in einer waagerechten Reihe, dass man dann gewinnt. (Man gewinnt "mehr", wenn man 2 Reihen hat oder alle gleich oder 2 Diagonale usw.)
Das Problem jetzt ist nur, dass ab und zu (echt super selten), man die Meldung bekommt, man hätte 3 in einer Reihe oder so, obwohl es nur 2 Gleiche sind.
Wie sind die Felder denn dann belegt?
sashpta hat geschrieben:Nur ich finde den Fehler nicht. Ist das einfach eine Art "Bug" in PHP oder, was ich für viel wahrscheinlicher halte, ein Fehler bei meinem Code.
Ich habe schon Bugs in PHP gesehen, aber grundsätzlich sollte man immer davon ausgehen, dass der Bug bei einem selbst liegt.
sashpta hat geschrieben:Das Einze was sein könnte ist, dass er das Falsche anzeigt, wenn man z.B. 2 mal 2 gleiche Reihen hat (-> 1. und 2. Reihe gleich, als bsp.), das habe ich bis jetzt noch nicht ausprobiert. Aber das kann doch eigentlich nicht der Grund dafür sein, dass er bei 2 Gleichen sagt es seien 3.
Bau das ganze doch mal in Funktionen und übergebe das Feld. Als Rückgabe solltest Du einen Ergebnisstring bekommen, der beschreibt, wie die Auswertung verlaufen ist.

Das Feld kann dann entweder über Random bestückt werden oder Du gibst Testfälle vor. Zum Beispiel nur die erste Reihe ist gleich, also erwartest Du als Ergebnis, dass nur die erste Reihe als gleich erkannt wird. So kannst Du deine Funktion sinnvoll abprüfen. Damit nimmst Du auch die ganzen Echos raus, die da drin sind.

Einen Fehler kann ich ansonsten in der Bestimmung nicht finden. Bei einer fraglichen Darstellung, schreibst Du Dir die Darstellung ab und machst einen Testfall draus: Du schreibst die Eingangsdaten in einen Test und der erwartet halt die richtige Bewertung. Wenn das nicht hinhaut, kann man genauer verfolgen, wie das Problem entsteht.

Re: Automat

Verfasst: Di Jan 05, 2016 3:44 pm
von sashpta
Xin hat geschrieben:
Bau das ganze doch mal in Funktionen und übergebe das Feld. Als Rückgabe solltest Du einen Ergebnisstring bekommen, der beschreibt, wie die Auswertung verlaufen ist.

Das Feld kann dann entweder über Random bestückt werden oder Du gibst Testfälle vor. Zum Beispiel nur die erste Reihe ist gleich, also erwartest Du als Ergebnis, dass nur die erste Reihe als gleich erkannt wird. So kannst Du deine Funktion sinnvoll abprüfen. Damit nimmst Du auch die ganzen Echos raus, die da drin sind.

Einen Fehler kann ich ansonsten in der Bestimmung nicht finden. Bei einer fraglichen Darstellung, schreibst Du Dir die Darstellung ab und machst einen Testfall draus: Du schreibst die Eingangsdaten in einen Test und der erwartet halt die richtige Bewertung. Wenn das nicht hinhaut, kann man genauer verfolgen, wie das Problem entsteht.

Meinst du ich soll diese Teile hier alle in Funktionen packen oder wie?

Code: Alles auswählen

  # erste Reihe komplett gleich
    if ($feld[0] == $feld[1]) {
        if ($feld[1] == $feld[2]) {
            echo $Sieg_R;
            $ReiheTOP = true;
        }
    }

    # zweite Reihe komplett gleich
    if ($feld[3] == $feld[4]) {
        if ($feld[4] == $feld[5]) {
            echo $Sieg_R;
            $ReiheMID = true;
        }
    }

    # dritte Reihe komplett gleich
    if ($feld[6] == $feld[7]) {
        if ($feld[7] == $feld[8]) {
            echo $Sieg_R;
            $ReiheBOT = true;
        }
    }

    # diagonal (links nach rechts)
    if ($feld[0] == $feld[4]) {
        if ($feld[4] == $feld[8]) {
            echo $Sieg_D;
            $DiaLR = true;
        }
    }

    # diagonal (rechts nach links)
    if ($feld[2] == $feld[4]) {
        if ($feld[4] == $feld[6]) {
            echo $Sieg_D;
            $DiaRL = true;
        }
    }
    
    
     
     # 2 GLeiche, oben, mitte
    if ($ReiheTOP == true and $ReiheMID == true) {
        echo $D_Sieg_R;
        $DoppelReihe = true;
    }

    # 2 Gleiche, oben, unten
    if ($ReiheTOP == true and $ReiheBOT == true) {
        echo $D_Sieg_R;
        $DoppelReihe = true;
    }

    # 2 Gleiche, mitte, unten
    if ($ReiheMID == true and $ReiheBOT == true) {
        echo $D_Sieg_R;
        $DoppelReihe = true;
    }
 
    # 2 Gleiche, Diagonal
    if ($DiaLR == true and $DiaRL == true) {
        echo $D_Sieg_D;
        $DoppelDia = true;
    }

    # 3 Gleiche, 2 Reihe + Dia l-r
    if ($DoppelReihe == true and $DiaLR == true) {
        echo $T_Sieg_2R;
    }

    # 3 Gleiche, 2 Reihe + Dia r-l
    if ($DoppelReihe == true and $DiaRL == true) {
        echo $T_Sieg_2R;
    }

    # 3 Gleiche, 2 Dia + Reihe, oben
    if ($DoppelDia == true and $ReiheTOP == true) {
        echo $T_Sieg_2D;
    }

    # 3 GLeiche, 2 Dia + Reihe, mitte
    if ($DoppelDia == true and $ReiheMID == true) {
        echo $T_Sieg_2D;
    }

    # 3 Gleiche, 2 Dia + Reihe, unten
    if ($DoppelDia == true and $ReiheBOT == true) {
        echo $T_Sieg_2D;
    }

    # Alle gleich
    if ($DoppelReihe == true and $ReiheTOP == true || $DoppelReihe == true and $ReiheMID == true || $DoppelReihe == true and $ReiheBOT == true) {
        echo $Jackpot;
    }
und wenn ja jedes dann in ne eigene oder wie?

Aber das wär dann doch noch unübersichtlicher und noch mehr oder?





Habs jetzt mal bisschen getestet, klappt soweit alles :)
Ist halt nur noch das Problem, dass er immer alle zutreffenden Texte anzeigt und nicht den höchten Gewinn. (https://gyazo.com/fda5f2f999cc6c01dc4d36e41e446c69) Aber das könnte ich doch eigentlich mit Variablen machen. Jedoch hätte ich dann immer noch das Problem mit der Unübersichtlichkeit, wahrscheinlich wärs dann noch schlimmer. :x

Re: Automat

Verfasst: Mi Jan 06, 2016 12:45 am
von Xin
sashpta hat geschrieben:Meinst du ich soll diese Teile hier alle in Funktionen packen oder wie?

Code: Alles auswählen

  # erste Reihe komplett gleich
    if ($feld[0] == $feld[1]) {
        if ($feld[1] == $feld[2]) {
            echo $Sieg_R;
            $ReiheTOP = true;
        }
    }
Auch das ist eine gute Idee.

Code: Alles auswählen

  $reiheTop = reiheTop( $feld );
  $reiheMid = reiheMid( $fekd );
  ...
sashpta hat geschrieben:und wenn ja jedes dann in ne eigene oder wie?
Aber das wär dann doch noch unübersichtlicher und noch mehr oder?
Halte ich für eine brauchbare Möglichkeit die Sachen übersichtlicher zu machen.

Was ich aber wirklich meinte ist, dass Du das Feld bestückst und dann die Auswertung machst.

Code: Alles auswählen

$field = randomField();

$result = evaluate( $field );

presentResult( $result );
[code]

Dadurch, dass Du kapselst, kannst Du nun auch Tests schreiben:

[code]
$field = generate( 1, 1, 1, 0, 0, 0, 0, 0, 0 );  // First Row
$result = evaluate( $field );
testResult( $result, "SIEG! Du hast 3 Gleiche in einer Reihe!" );

$field = generate( 0, 0, 0, 1, 1, 1, 0, 0, 0 );  // Second Row
$result = evaluate( $field );
testResult( $result, "SIEG! Du hast 3 Gleiche in einer Reihe!" );

...
[code]


Habs jetzt mal bisschen getestet, klappt soweit alles :)
Ist halt nur noch das Problem, dass er immer alle zutreffenden Texte anzeigt und nicht den höchten Gewinn. (https://gyazo.com/fda5f2f999cc6c01dc4d36e41e446c69) Aber das könnte ich doch eigentlich mit Variablen machen. Jedoch hätte ich dann immer noch das Problem mit der Unübersichtlichkeit, wahrscheinlich wärs dann noch schlimmer. :x[/quote]

Die Funktion evaluate() sollte nichts mehr ausgeben. Also erst recht nichts doppelt. Die solltest Du so programmieren, dass sie einfach genau das Ergebnis liefert, das Du haben möchtest. Hier denke ich aber eher an eine Enum, als an "SIEG! Du hast 3 Gleiche in einer Reihe!". ^^

Re: Automat

Verfasst: Do Jan 07, 2016 3:10 pm
von sashpta
Xin hat geschrieben:Was ich aber wirklich meinte ist, dass Du das Feld bestückst und dann die Auswertung machst.

Code: Alles auswählen

$field = randomField();

$result = evaluate( $field );

presentResult( $result );
[code]

Dadurch, dass Du kapselst, kannst Du nun auch Tests schreiben:

[code]
$field = generate( 1, 1, 1, 0, 0, 0, 0, 0, 0 );  // First Row
$result = evaluate( $field );
testResult( $result, "SIEG! Du hast 3 Gleiche in einer Reihe!" );

$field = generate( 0, 0, 0, 1, 1, 1, 0, 0, 0 );  // Second Row
$result = evaluate( $field );
testResult( $result, "SIEG! Du hast 3 Gleiche in einer Reihe!" );

...
[code]

[/quote]

Wenn ich das so mache wie du das vorgeschlagen hast muss ich doch alles umschreiben ? Zudem hab ich um ehrlich zu sein keine Ahnung was du meinst mit deiner Idee^^ 

[quote="Xin"]
Die Funktion evaluate() sollte nichts mehr ausgeben. Also erst recht nichts doppelt. Die solltest Du so programmieren, dass sie einfach genau das Ergebnis liefert, das Du haben möchtest. Hier denke ich aber eher an eine Enum, als an "SIEG! Du hast 3 Gleiche in einer Reihe!". ^^[/quote]
Das mit dem "SIEG" und "DOPPELSIEG" kann man ja noch ändern, aber erst mal solls funktionieren. ^^
Aber in die Funktion evaluate() müsste ich dann die ganze ifs reinmachen, die zZ testen was es ist, ob alle gleich sind, etc. oder?


Und mal was anderes :D
wie füg ich denn nen Button ein der das alles ausführt?

Re: Automat

Verfasst: Fr Jan 08, 2016 12:18 am
von Xin
sashpta hat geschrieben:Wenn ich das so mache wie du das vorgeschlagen hast muss ich doch alles umschreiben ? Zudem hab ich um ehrlich zu sein keine Ahnung was du meinst mit deiner Idee^^
Zum einen glaube ich nicht, dass Du so viel Code hast, dass ein neuschreiben ein Problem darstellt, zum anderen ist Neuschreiben eine gute Möglichkeit, um Alternativen auszuprobieren und zu lernen.

Die Idee ist, dass Du Dein Problem in kleinere Blöcke unterteilst.
Erstelle ein Feld.
Prüfe, ob das Feld gewinnt.
Gebe ein Ergebnis aus.
sashpta hat geschrieben:Aber in die Funktion evaluate() müsste ich dann die ganze ifs reinmachen, die zZ testen was es ist, ob alle gleich sind, etc. oder?
Richtig.
sashpta hat geschrieben:Und mal was anderes :D
wie füg ich denn nen Button ein der das alles ausführt?

Code: Alles auswählen

<form method="get" action="script.php">
<input type="submit" /> 
</form>

Re: Automat

Verfasst: Fr Jan 08, 2016 10:43 am
von sashpta
Ich werde das mit dem Button später mal ausprobieren danke
Wie kann ich denn für jedes Feld einzeln überprüfen ob es gewinnt? Das hängt ja von den anderen Felder ab.

Re: Automat

Verfasst: Sa Jan 09, 2016 11:39 am
von Xin
sashpta hat geschrieben:Wie kann ich denn für jedes Feld einzeln überprüfen ob es gewinnt? Das hängt ja von den anderen Felder ab.
Ich meine mit Feld "Spielfeld", welches aus 9 Elementen besteht.

Re: Automat

Verfasst: Sa Jan 09, 2016 1:46 pm
von sashpta
Aber so hab ich das doch oder nicht? Man hat das Feld und dann wird es ausgewertet. Wo ist denn da der Unterschied zu deinem?

Re: Automat

Verfasst: Sa Jan 09, 2016 2:21 pm
von Xin
sashpta hat geschrieben:Aber so hab ich das doch oder nicht? Man hat das Feld und dann wird es ausgewertet. Wo ist denn da der Unterschied zu deinem?
Ich übergebe das Feld der Auswertungsfunktion, Du erzeugst es innerhalb der Auswertungsfunktion.
Ich kann die Auswertung also für ein von mir festgelegtes und übergebenes Feld testen - Du nicht, weil Du nicht weißt auf welches Spielfeld sich das Ergebnis bezieht.