dempsey
Goto Top

PHP tic tac toe

Hallo Zusammen,

ich versuche gerade ein TicTacToe Spiel über PHP zu entwerfen bzw. es ist die dritte Aufgabe in meiner Ausbildung.
Nun habe ich Grundgerüst usw. erstellt - so weit so gut

ich möchte jetzt wissen, wie ich am besten die Spielmechanik in PHP programmiere. Es sollen 2 Spieler spielen können
aber ich weiss jetzt nicht wie es abläuft, sodass sich beide abwechseln. Muss ich da mehrere Funktionen ineinanderschachteln?

Mein Ausbilder ist leider im Urlaub und ich muss jetzt erstmal alleine klar kommen.Deswegen frag ich euch face-smile

LG,
dempsey

Content-ID: 152780

Url: https://administrator.de/contentid/152780

Ausgedruckt am: 22.11.2024 um 00:11 Uhr

kaiand1
kaiand1 11.10.2010 um 15:36:18 Uhr
Goto Top
Nun des ist so
Beide Spieler Melden sich auf der Seite das die Spielen wollen.
Wenn beide im SPiel sind Spiel-ID1 machst du entweder einen Würfel wer anfängt oder das die sich selbst einigen.
Dann immer abwechselnd darf einer 1 Zug machen wodurch du ja die Abfragen entweder alle X Sekunden die Seite neu lädst oder am besten per Ajax machst.
Verschalteln im grunde ja da du mehere Sachen prüfen mußt um zu wissen wer dran ist ect
Guenni
Guenni 11.10.2010 um 15:55:15 Uhr
Goto Top
Hi dempsey,

dieses Script . . .

http://code.activestate.com/recipes/276962-php-tic-tac-toe/

. . . unter tic-tac-toe.php abspeichern.

Du spielst da zwar gegen den Computer, aber da erhälst du schon

mal einen kleinen Einblick, wie aufwändig das ist.

Gruß
Günni
maretz
maretz 11.10.2010 um 19:49:24 Uhr
Goto Top
moin,

das gibt da eine vielzahl an optionen... Die einfache: Beide Spieler bekommen eine ID die du in ner DB ablegst. Bei dem Spieler bei dem der Wert auf "Aktiv" ist werden die Steuerelemente entsperrt. soweit der klickt sperrst du dessen steuerelemente - und entsperrst die beim anderen spieler...

ob du das dann per ajax realisierst oder per reload is dann ne detailfrage...
dog
dog 11.10.2010 um 20:53:34 Uhr
Goto Top
...das Script ist so alt, dass es auf einem halbwegs aktuellen Server nicht mal mehr laufen wird und zudem programmier-technisch beinahe eine Vergewaltigung.
maretz
maretz 11.10.2010 um 21:02:28 Uhr
Goto Top
jap - das global dürfte schon ein erstes kleineres Problem geben...

und nur nebenbei - ich würde auch überlegen html und php zu trennen (ggf. nen template-system nutzen). das macht es übersichtlicher...

mehr guck ich lieber nich an - hab doch eben erst gegessen, das soll bitte auch drin bleiben!
Guenni
Guenni 11.10.2010 um 21:29:51 Uhr
Goto Top
Hi Master of Scripting,

...das Script ist so alt, dass es auf einem halbwegs aktuellen Server nicht mal mehr laufen wird

und zudem programmier-technisch beinahe eine Vergewaltigung.


Meine PHP Version ist vom Stand 5.2.6-1 und da läuft dieses Script einwandfrei. Wenn das nicht der

Fall wäre, so hätte ich das Script wohl kaum gepostet.


Meine Fresse, hast du eigentlich nichts anderes zu tuen, als auf Beiträge irgendwelche Kommentare abzugeben,

nur um in der Leiter links außen nach oben zu klettern?


Wundert mich nur noch, dass du in dem Script nicht noch irgendeine Lücke entdeckt hast, wo jemand eine SQL-Injection

unterbringen kann. Im Rezitieren einer gewissen Wiki-Seite bist du ja auch der Master of Scripting face-smile

Gruß
Günni
dog
dog 11.10.2010 um 21:45:01 Uhr
Goto Top
Ahnung von PHP hast du nicht, oder?
(Das ist natürlich eine rhetorische Frage. Mit deinem qualifizierten Kommentar zur Bedeutung von SQL-Injections ist ja schon alles gesagt.)

Ich würde dir empfehlen erst mal ein paar Grundlagen zu lernen bevor du andere dermaßen unbegründet anmachst.

Aber bitte, gehen wir es mal durch:

global $bsize,$playerToken,$myToken,$gameOver,$winArr,$rowArr,$colArr,$digArr,$vals,$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9;

Im globalen Kontext globale Variablen zu definieren ist absoluter Schwachsinn.

<?

Diese Syntax wird in einem aktuellen PHP gar nicht mehr in der Standardkonfiguration angenommen und fliegt in PHP6 raus.
Erst wenn man mutwillig short_open_tags aktiviert läuft das und davon rät PHP nicht ohne Grund deutlich ab.

function genBox($size) {
global $bsize,$playerToken,$myToken,$gameOver,$winArr,$rowArr,$colArr,$digArr,$vals,$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9;

Du kannst mir auch sicher sagen wo es zu einem guten Stil gehört, dass man in jeder einzelnen Funktion 18 Globalen definiert.
Schon eine davon ist eine zu viel!

$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9

Jeder der sich mal 10 Minuten mit Programmieren befasst hat und bis zu Arrays gekommen ist dürfte verstehen, warum das ein Parade-Beispiel für ganz großen Mist ist.

if($who=="")
return 1;
else
return 0;

Mit auch nur ein bisschen Ahnung hätte man das geschrieben als:
return ($who=='');
(Den allgemeinen Sinn der Funktion mal nicht betrachtet).

if($HTTP_POST_VARS) {

Seit Ewigkeiten ist das $_POST.
HTTP_POST_VARS ist seit 4.1.0 (!) veraltet und fliegt in PHP6 raus!

		if($movIndex==0)
			$s1=$myToken;
		if($movIndex==1)
			$s2=$myToken;
		if($movIndex==2)
			$s3=$myToken;
		if($movIndex==3)
			$s4=$myToken;
		if($movIndex==4)
			$s5=$myToken;
		if($movIndex==5)
			$s6=$myToken;
		if($movIndex==6)
			$s7=$myToken;
		if($movIndex==7)
			$s8=$myToken;
		if($movIndex==8)
			$s9=$myToken;

Ich hoffe dazu muss ich nicht auch noch was sagen?

Und die Programm-Logik habe ich mir bisher noch nicht mal angeschaut...

Ich weiß ja nicht, ob es für dich zum guten Ton gehört einen Anfänger mit Uralt-Code zu belasten (wie Cisco das mit den Netz-Klassen macht), aber für mich nicht.
Florian.Sauber
Florian.Sauber 12.10.2010 um 00:22:03 Uhr
Goto Top
Zitat von @kaiand1:
Dann immer abwechselnd darf einer 1 Zug machen wodurch du ja die Abfragen entweder alle X Sekunden die Seite neu lädst oder am besten per Ajax machst.

Zitat von @maretz:
bei dem der Wert auf "Aktiv" ist werden die Steuerelemente entsperrt. soweit der klickt sperrst du dessen steuerelemente und entsperrst die beim anderen spieler...

Ich denke das dies bei dem Aufgabentyp nicht notwendig. Ich kann mich irren, aber ich gehe davon aus, daß die Aufgabe sich so versteht, daß 2 Spieler über ein gemeinsames Interface spielen. Spieler1zieht->reload->Spieler2zieht->reload.

LG Florian
dempsey
dempsey 13.10.2010 um 09:46:01 Uhr
Goto Top
Hallo Zusammen,

also ihr müsst erstmal wissen, dass ich auch gewisse Vorgaben habe. Vielleicht ergeben sie für euch keinen Sinn aber mein Ausbilder hat sich dabei schon etwas gedacht und deswegen darf ich jetzt nicht mit DB arbeiten.
Ich soll das ganze nämlich mit hiddenfeldern machen. Das wird dann mit einem Counter später durchgezählt usw. usw. aber wie dem auch sei.

ich habe das "Spielfeld" in meiner ausgabe.php generiert und ich möchte jetzt z.b. es so machen, dass an der stelle wo ich den button drücke, da ein einfaches jpg erscheint.
Da ich noch in den Anfangsschuhen von PHP stecke, bitte ich um nachsicht face-smile

Ich werde nachher mal ein paar Sachen hier posten, damit ihr ungefähr seht, was ich fabriziert hab =)
kaiand1
kaiand1 13.10.2010 um 10:42:05 Uhr
Goto Top
Nun nur mit Hiddenfelder wird es schwer da du ja die Kommunikation mit den 2ten User brauchst wo er seine Kreuze macht.
Du könntes die Daten in einer Datei speichern und auslesen.
Aber sowas sagt man direckt am Anfang das du dies unter Einschränkungen zu Progamieren hast...
maretz
maretz 13.10.2010 um 10:53:21 Uhr
Goto Top
Moin,

das ganze mit "hidden feldern"? War das die explizite Vorgabe - oder war es nur "keine Datenbank"? Im letzten Fall könnte man ja noch ne Datei auf dem Server legen bei dem das Spiel abgefragt wird...

Ansonsten würde ich auch versuchen keine Hidden-Fields zu nehmen - da das ganze natürlich keinen Sinn ergibt. Wenn dann in die Session-Variablen packen und über ne Datei den Austausch zwischen den Spielern regeln. Oder soll es so sein das die beiden Spieler vor EINEM Browser sitzen und sich den teilen? (d.h. wirklich die Maus von Hand zu Hand geben)? Dann würde das mit Hidden natürlich gehen (wenn auch nicht schön). Da hättest du 9 Hidden Felder
(hf1_1, hf1_2, hf1_3,....hf3_2,hf3_3). Die setzt du einfach auf -1 zum Start (nicht belegt), 0 oder 1 (je nach Spieler). Jetzt ist es dann im simpelsten Fall stupide Tipparbeit für das Ergebnis

if ((hf1_1==0) AND (hf1_2==0) and (hf1_3==0)) echo "player 1 won!" und so weiter... (geht natürlich auch eleganter -> aber DA darfst du dir dann nen weg überlegen ;)
Florian.Sauber
Florian.Sauber 13.10.2010 um 13:25:48 Uhr
Goto Top
Zitat von @maretz:
Oder soll es so sein das die beiden Spieler vor EINEM Browser sitzen und sich den teilen? (d.h. wirklich die Maus von Hand zu Hand geben)? ...

Da würde ich fast darauf wetten...

LG Florian
dempsey
dempsey 13.10.2010 um 16:49:13 Uhr
Goto Top
Also es beide Informationen Stimmen -> Hiddenfelder verwenden und -> keine Datenbank

Es soll keinen Computer mit KI geben ! Florian hatte da recht .. Letztendlich sollen nur mein Ausbilder und ich an einem und dem selben Browser das TicTacToe spielen können.

  <?php
	function bild(){
	
		//$value = "<input class=\"button\" name=\"button1\" type=\"submit\" value=\"absenden\"/>";  
		if ($_POST['A1'] =='A1'){  
		$value = "<p><img src=\"x.jpg\" alt=\"Spieler1\"></p>";  
		}
		return ($value);		
	}
	
	
	function playground($A1, $A2, $A3, $B1, $B2, $B3, $C1, $C2, $C3) {
	
		//Erstellung von Spielfeld A1 bis A3		
		$value = "<tr>\n";  
		$value.= "<td div id=\"fields\">\n";  
		$value.= "<input name=\"hiddenA1\" type=\"hidden\" value=\"1\"/>";  
		$value.= "<input class=\"button\" name=\"A1\" type=\"submit\" value=\"A1\"/>";  
		$value.= $A1;
		$value.= "</td>\n";  
		$value.= "<td div id=\"fields\">\n";  
		$value.= "<input name=\"hiddenA2\" type=\"hidden\" value=\"1\"/>";  
		$value.= "<input class=\"button\" name=\"A2\" type=\"submit\" value=\"A2\"/>";  
		//$value.= fields($A2);
		$value.= "</td>\n";  
		$value.= "<td div id=\"fields\">\n";  
		$value.= "<input name=\"hiddenA3\" type=\"hidden\" value=\"1\"/>";  
		$value.= "<input class=\"button\" name=\"A3\" type=\"submit\" value=\"A3\"/>";  
		//$value.= fields($A3);
		$value.= "</td>\n";  
		$value.= "</tr>\n";  
		//Erstellung von Spielfeld B1 bis B3
		$value.= "<tr>\n";  
		$value.= "<td div id=\"fields\">\n";  
		$value.= "<input name=\"hiddenB1\" type=\"hidden\" value=\"1\"/>";  
		$value.= "<input class=\"button\" name=\"B1\" type=\"submit\" value=\"B1\"/>";  
		//$value.= fields($B1);
		$value.= "</td>\n";  
		$value.= "<td div id=\"fields\">\n";  
		$value.= "<input name=\"hiddenB2\" type=\"hidden\" value=\"1\"/>";  
		$value.= "<input class=\"button\" name=\"B2\" type=\"submit\" value=\"B2\"/>";  
		//$value.= fields($B2);
		$value.= "</td>\n";  
		$value.= "<td div id=\"fields\">\n";  
		$value.= "<input name=\"hiddenB3\" type=\"hidden\" value=\"1\"/>";  
		$value.= "<input class=\"button\" name=\"B3\" type=\"submit\" value=\"B3\"/>";  
		//$value.= fields($B3);
		$value.= "</td>\n";  
		$value.= "</tr>\n";  
		//Erstellung von Spielfeld C1 bis C3
		$value.= "<tr>\n";  
		$value.= "<td div id=\"fields\">\n";  
		$value.= "<input name=\"hiddenC1\" type=\"hidden\" value=\"1\"/>";  
		$value.= "<input class=\"button\" name=\"C1\" type=\"submit\" value=\"C1\"/>";  
		//$value.= fields($C1);
		$value.= "</td>\n";  
		$value.= "<td div id=\"fields\">\n";  
		$value.= "<input name=\"hiddenC2\" type=\"hidden\" value=\"1\"/>";  
		$value.= "<input class=\"button\" name=\"C2\" type=\"submit\" value=\"C2\"/>";  
		//$value.= fields($C2);
		$value.= "</td>\n";  
		$value.= "<td div id=\"fields\">\n";  
		$value.= "<input name=\"hiddenC3\" type=\"hidden\" value=\"1\"/>";  
		$value.= "<input class=\"button\" name=\"C3\" type=\"submit\" value=\"C3\"/>";  
		//$value.= fields($C3);
		$value.= "</td>\n";  
		$value.= "</tr>\n";  
		
		return($value);
	}
	


?>

bislang sieht die Ausgabe so aus, dass das Spielfeld generiert wird und oben bei der Funktion bild() wird beim betätigen von Knopf A1, ein rotes Kreuz angezeigt. Das geschieht allerdings nicht da wo es hin sollte.

hier seht ihr mal, wie es aussieht: http://img818.imageshack.us/img818/1897/tttx.jpg
das rote x soll den Button ersetzen aber ich glaube, dass wird etwas komplizierter und ich komme an der Stelle nicht weiter
dempsey
dempsey 14.10.2010 um 14:31:09 Uhr
Goto Top
Ich hoffe mal, dass hier nochmal einer reinschaut aber ich bin wieder ein stück weitergekommen aber leider läuft in meiner funktion etwas verkehrt aber ich finde das problem noch nicht so wirklich

	function bild($i){
		
		$buttons = array(0 => "A1", 1 => "A2", 2 => "A3", 3 => "B1", 4 => "B2", 5 => "B3", 6 => "C1", 7 => "C2", 8 => "C3");  
		
				
		$value = "<input class=\"button\" name=".$i."\" type=\"submit\" value=".$buttons[$i]."></input>";  
	
			if ($_POST['$buttons[$i]'] =='$buttons[$i]'){  
			
				$value = "<p><img src=\"x.jpg\" alt=\"Spieler1\"></p>";  
		}	
		return ($value);		
	}

Ich generiere hier die 9 Buttons und ich möchte mit einem Mausklick auf das jpg zugreifen bzw. das jpg soll den button ersetzen aber irgendwie haut das nicht hin
momentan steht in der ifanweisung if ($_POST['$buttons[$i]'] =='$buttons[$i]') aber ich habe hier nur rumgespielt also nciht direkt meckern face-wink

die buttons rufe ich am ende mit
$value.="bild(0);
$vaöie.=bild(1); usw. usw.
auf..