Tic Tac Toe

In einem Python-Grundkurs war eine Aufgabe ein Tic Tac Toe zu programmieren. Da lag der Gedanke nicht fern, das als kleines Web-Spiel auf PHP zu übertragen. Sicher gibt es da schon einige, aber selbst gebastelt zur Übung ist eben doch was anderes. Der Spieler klickt seine Wahl an, der Computer errechnet sich seine Chancen und zieht. Dann ist der Spieler wieder dran, so lange, bis einer gewonnen hat oder kein Zug mehr möglich ist.

Ich habe ein bisschen über Algorithmen recherchiert und bin bei Minmax gelandet, was ich aber nur adaptiert habe. Meine Version rechnet nicht bis zum letzten möglichen Zug durch, vielleicht bastele ich mir das irgendwannn, und hat noch ein bisschen Zufall mit drin. Damit verhält sich der Computer ein bisschen mehr wie ein menschlicher Spieler.

Ich berechne für jedes freie Feld bzw. jede Reihe, in der ein Zug möglich ist, einen Score. Dieser beeinflusst dann, wie der Computer zieht. Hat er mehrere Möglichkeiten mit dem gleichen Score, dann kommt noch etwas Zufall ins Spiel, ganz so, wie es beim Menschen auch wäre.

Zum Spiel geht es hier.

Und der Code. Vielleicht nicht elegant oder gut ausgearbeitet. Aber von einem Einsteiger selbst gemacht ohne groß zu kopieren.

<html>

<head>

<metacharset="UTF-8">

<title>Tic Tac Toe</title>

<style>

table {border-color: white; border-width: 1px;}

tr {height: 100px; background-color: lightgray;}

th {width: 100px; background-color: lightgray; text-align: center; font-size: 80px;}

button {border: 0; background-color: lightgray; font-size: 80px; padding: 45px;}

</style>

</head>

<body>

<h1>Tic Tac Toe</h1>

<p>In einem Python-Grundkurs war eine Aufgabe ein Tic Tac Toe zu programmieren. Da lag der Gedanke nicht fern, das als kleines Web-Spiel auf PHP zu übertragen. Sicher gibt es da schon einige, aber selbst gebastelt zur Übung ist eben doch was anderes.</p>

<p>Der Kurs ging davon aus, dass es zwei menschliche Spieler gegeneinander spielen. Doch ich entschied mich hier für User gegen Computer. Warum? Ich konnte lernen, wie man einen Algorithmus programmiert, der gewinnen kann.</p>

<h2>Die Regeln</h2>

<ul>

<li>Ein Zufallsgenerator entscheidet, wer beginnt.</li>

<li>Der menschliche Spieler hat X.</li>

<li>Der Computer hat O.</li>

<li>Wer zuerst eine Reihe vertikal, horizontal oder diagonal voll hat, hat gewonnen.</li>

</ul>

<h2>Das Spiel</h2>

<?php

function ComputerPlays($field) {

$avail=[];

$score=array();

$s=0;

foreach ($field as $k =>$v) {

if ($field[$k] == "") {

array_push($avail, $k);

}

}

$pattern=[[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]];

foreach ($pattern as $x) {

if ((in_array($x[0], $avail)) OR (in_array($x[1], $avail)) OR (in_array($x[2], $avail))) {

for ($i=0; $i<3; $i++) {

if ($field[$x[$i]] == "X") {

$s=$s-1;

}

elseif ($field[$x[$i]] == "O") {

$s=$s+1;

}

else {

$s=$s;

}

}

if (($field[$x[0]]=="O" && $field[$x[1]]=="O") || ($field[$x[1]]=="O" && $field[$x[2]]=="O")) {

$s=$s-10;

}

array_push($x, $s);

array_push($score, $x);

$s=0;

}

}

usort($score, fn($a, $b) => $a[3] <=> $b[3]);

$can=[];

foreach ($score as $x) {

if ($x[3]==$score[0][3]) {

array_push($can, $x);

}

}

$c=[];

foreach ($can as $x) {

array_pop($x);

array_push($c, $x);

}

$d=[];

foreach ($c as $x) {

foreach ($x as $y) {

if ($field[$y]=="") {

array_push($d, $y);

}

}

}

return$d[rand(0, sizeof($d)-1)];

}

function CheckWinner($field) {

$pattern=[[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]];

foreach ($pattern as $x) {

if ($field[$x[0]]=="X" && $field[$x[1]]=="X" && $field[$x[2]]=="X") {

$win="Spieler";

}

if ($field[$x[0]]=="O" && $field[$x[1]]=="O" && $field[$x[2]]=="O") {

$win="Computer";

}

}

return $win;

}

if (!isset($_POST['field'])) {

$field=[1=>"",2=>"",3=>"",4=>"",5=>"",6=>"",7=>"",8=>"",9=>""];

}

else {

foreach ($_POST["field"] as $k=>$v) {

$field[$k+1]=$v;

}

$key = array_keys($_POST);

$field[$key[2]]=$_POST[$key[2]];

$win=CheckWinner($field);

if ($win) {

echo "Der ",$win," hat gewonnen!";

}

?>

<?php

if ($_POST[$key[1]]=="O" and !$win) {

$comp=ComputerPlays($field);

$field[$comp]="O";

$_POST[$key[1]]="X";

$win=CheckWinner($field);

if ($win) {

echo "Der ",$win," hat gewonnen!";

}

}

}

?>

<table>

<?php

$th=0;

while ($th < 9) {

if ($th == 0) {

echo"<tr>";

}

elseif ($th == 3 or $th == 6) {

echo "</tr><tr>";

}

$th++;

if (!$win) {

echo "<form action='' method='post'>";

}

echo "<th id=",$th,">";

if ($field[$th]=="") {

foreach ($field as $fielditem) {

echo "<input type='hidden' name='field[]' value='$fielditem'>";

}

echo "<input type='hidden' name='player' value='O'>";

echo "<button type='submit' name='",$th,"' value='X'></button>";

}

else {

echo $field[$th];

}

echo "</th>";

if (!$win) {

echo "</form>";

}

}

?>

</table>

<form action="index.php">

<button class="back" type="submit">Neu starten!</button>

</form>

</body>

</html>

Beitrag veröffentlicht

in

von

Schlagwörter:

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert