Jetzt mal ganz von Anfang an. Disclaimer: Ich hab deinen Code nicht angeschaut und bediene mich nur aus deinen Beispielen hier im Thread. Aber das problem muss anscheinend ganz unten angegangen werden, da dir wichtige Grundlagen fehlen und du seit Wochen ohne Fortschritt rumwerkelst.
Erst ein mal das Spielfeld. Deine Idee mit der Matrix war gut, genau das ist ja ein Spielfeld, ein zweidimensionales Feld mit Punkten, welche durch 2 Koordinaten angegeben werden können. Deine Idee, den HTML-Code direkt in dem Spielfeld zu speichern hingegen war weniger sinnvoll, speichern müssen wir nur die Daten, das Markup sieht immer gleich aus.
Ich arbeite hier mit funktionen, deshalb muss ich immer das Spielfeld als Parameter übergeben, das wird schnell umständlich, erspart dir aber das hantieren mit Klassen, was wohl noch nicht behandelt habt.
Wir müssen also erkennen, ob ein Feld bereits besetzt wurde und wenn ja, welcher Spieler dort gesetzt hat. Dafür bestimmen wir 2 Konstanten, welche die Spieler darstellen. Noch nicht belegte Felder können mit false, 0, NULL oder sonst einem Wert der dir gefällt befüllt werden. Ich verwende in diesem Beispiel false.
Unser Spielfeld sieht am Anfang eines Spiels also so aus:
0 1 2 3 4 5 6
0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0
Alles anzeigen
In PHP wird das Spielfeld, wie du schon selber herausgefunden hast, mittels zweier verschachtelten for-Schleifen aufgebaut.
function newField(array $field, $rows = 6, $cols = 7)
{
for ( $row = 0; $row < $rows; $row++ )
{
for ( $col = 0; $col < $cols; $col++ )
{
$field[$row][$col] = false;
}
}
return $field;
}
Alles anzeigen
Um einen Stein zu setzen, müssen wir überprüfen, ob in der Spalte noch platz ist. Dazu schreiben wir 2 neue Funktionen. Eine, um zu überprüfen, ob auf einer Position schon ein Stein liegt, eine zweite, um den Stein auf die unterste freie Reihe zu setzen. Die checkPos-Funktion erhält ausserdem noch die Fähigkeit, auf einen bestimmten Spieler zu prüfen, das wird uns später bei der Auswertung eines Zuges nützlich sein.
/**
* Prüft, ob eine Position leer ist oder ob ein Stein von einem
* bestimmten Spieler vorhanden ist.
*/
function checkPos($field, $row, $col, $player = false)
{
if ( $player === false )
{
// Gibt true zurück, wenn das Feld auf false steht.
return ! $field[$row][$col];
}
else
{
// Gibt true zurück, wenn das Feld dem angegebenen Spieler gehört.
return $field[$row][$col] === $player;
}
}
/**
* Versucht, einen neuen Stein für den angegebenen Spieler in der
* übergebenen Spalte zu setzen. Gibt true aus, wen der Zug
* erfolgreich war.
*/
function placePiece($col, $player, &$field, $rows = 6)
{
// Von "unten" nach "oben" durch die matrix loopen.
// Könnte auch anders herum gelöst werden, müsste
// dann aber bei derr Darstellung beachtet werden.
for ( $row = $rows-1; $row >= 0; $row-- )
{
// Wenn die position frei ist, wird der Stein gesetzt.
if ( checkPos($field, $row, $col) )
{
$field[$row][$col] = $player;
return true;
}
}
return false;
}
Alles anzeigen
Das mal als kleiner Ansporn, wie dieses Problem angegangen werden kann. Es fehlt natürlich noch viel, um diesen Code zu einem funktionierenden Spiel zu machen, z.B. habe ich noch keine Funktion, die überprüft, ob ein Zug gewinnt. Die Darstellung und Speicherung der Daten sind getrennte Probleme, welche Separat behandelt werden sollten. Schau mal selbst, wie du damit klar kommst, sollte noch ein Problem auftauchen findet sich sicher Hilfe, versuch aber erst mal, selber dahinter zu kommen.
Für die Darstellung habe ich dir noch eine kleine Funktion, welche eine Mögliche variante Zeigt, grundsätzlich solltest du aber HTML und PHP möglichst getrennt halten.
/**
* Generiert eine einfache HTML-Tabelle, welche das Spielfeld darstellt.
*/
function drawField($field)
{
$compiled = "<table>";
foreach ( $field as $row )
{
$compiled .= "\n<tr>";
foreach ( $row as $col )
{
$val = $col ? $col : '_';
$compiled .= "<td>".$val."</td>";
}
$compiled .="</tr>";
}
$compiled .= "\n</table>";
return $compiled;
}
Alles anzeigen
Was die eigentliche Anwendung der Funktionen angeht, hier ein kleines Beispiel von 3 statisch programmierten Zügen, welche anschliessend angezeigt werden.
define('P_ONE', 'X');
define('P_TWO', 'O');
$field = newField();
placePiece(1,P_ONE, $field);
placePiece(4,P_TWO, $field);
placePiece(4,P_ONE, $field);
echo drawField($field);
Alles anzeigen