• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Ich mal wieder ;)

freed

Neues Mitglied
hi leuteich hatte schon einen thread für minesweeper...dabei habe ich nen echt schönen lösungsansatz von merhaus bekommen...danke nochmal^^
ich wollte jetzt das spiel komplett machen und habe dabei fast alles probiert aber ich komm nicht weiter...dabei fehlen mir 2 sachen...
zu der ersten...die zahlen einsetzen...
mein ansatz:
auf minen prüfen:
x-1;y-1
x-1;y
x;y+1
x;y-1
x;y
x;y+1
x+1;y-1
x+1;y
x+1;y+1

soweit...is kein befehl dabei...da ich mit diesem isMine-> nicht so richtig vertraut bin^^
das ich kein geschriebenes array habe macht die sache dabei auch noch ne ecke schwerer^^
denn so wie oben nur mit ismine funktioniert is nicht...

ach ja der quelltext^^

<?php

class Minesweeper_Cell
{
public $isMine = false;
public $isRevealed = false;
public $posX = -1;
public $posY = -1;


public $adjacentMines = 0;
}

function buildField($sizeX, $sizeY, $numberOfMines)
{
if ($numberOfMines > $sizeX * $sizeY) {
throw new Exception('Minen>Feld');
}

//Feld
$field = array_fill(0, $sizeX, array());

$x = 0;
foreach ($field as &$row) {
for ($y = 0; $y < $sizeY; $y++) {
$cell = new Minesweeper_Cell();
$cell->posX = $x;
$cell->posY = $y;
$row[] = $cell;
}
$x++;
}
unset($row);

//Minen
$i = 0;
while ($i < $numberOfMines) {
$testX = array_rand($field);
$testY = array_rand($field[$testX]);

$cell = $field[$testX][$testY];

if (!$cell->isMine) {
$cell->isMine = true;
$i++;
}
}

return $field;
}

error_reporting(-1);
session_start();
header('content-type: text/html; charset=utf-8');

//Voreinstellungen
if (!isset($_SESSION['field'])) {
/* Start new game */
$_SESSION['field'] = buildField(8,8,10);
}

//Aktion
if (isset($_POST['form_id'])) {
if ($_POST['form_id'] === 'cell_clicked')
$tmp = array_keys($_POST['cell']);
$x = array_pop($tmp);

$tmp = array_keys($_POST['cell'][$x]);
$y = array_pop($tmp);

$cell = $_SESSION['field'][$x][$y];

if ($cell->isMine) {
$cell->isRevealed = true;
} else {
$cell->isRevealed = true;
}
} else if ($_POST['form_id'] === 'new_game') {
$_SESSION = array();
/* Start new game */
$_SESSION['field'] = buildField(8,8,10);
}
}

$field = $_SESSION['field'];

?><!DOCTYPE html>

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Minesweeper</title>
<style type="text/css">

* {
margin: 0;
padding: 0;
}

body {
padding: 60px;
}

.minesweeper {
margin-bottom: 30px;
}

.minesweeper p.row {
clear: both;
}

.minesweeper input.cell {
width: 20px;
height: 20px;
float: left;
border: 1px outset #ccc;
}

.minesweeper input.cell.revealed {
border: 1px inset #ccc;
}

</style>
</head>

<body>

<div class="minesweeper">
<form method="post" action="">

<?php foreach ($field as $row): ?>

<p class="row">
<?php foreach ($row as $cell): ?>

<input class="cell<?php echo ($cell->isRevealed) ? ' revealed' : ''; ?>"
type="submit"
name="cell[<?php echo $cell->posX; ?>][<?php echo $cell->posY; ?>]"
value="<?php

if ($cell->isRevealed) {
if ($cell->isMine) {
echo 'X';
?>
<textarea name="textfeld"> <\"Verloren </textarea>


<?php
}
}

?>" />

<?php endforeach; ?>
</p>

<?php endforeach; ?>

<input type="hidden" name="form_id" value="cell_clicked" />
</form>
</div>

<form method="post" action="">
<p>
<input type="hidden" name="form_id" value="new_game" />
<input type="submit" value="Neues Spiel" />
</p>
</form>

</body>

</html>
 
Zuletzt bearbeitet:
Ich habe meine PHP-Version mal rudimentär fertiggebaut:

Repository: mermshaus / phpminesweeper / overview &mdash; bitbucket.org
Demo (nur temporär erreichbar): Minesweeper

Ihr macht das in der Schule oder wie war das? Da ist es sicherlich sinnvoller, auf dem gelernten Stoff aufzubauen und nicht unbedingt eine fertige (dazu noch objektorientiert programmierte) Version verstehen zu wollen.

Hast du nicht irgendwelche eigenen Grundlagen, vor deren Hintergrund du konkretere Fragen stellen könntest?

PS: "Ich mal wieder" ist kein besonders vielsagender Threadtitel.
 
erstmal->find ich es echt gut wie du dich mit fast jedem thread im ganzen forum auseinandersetzt ;)

also wir haben in der schule projekte bekommen...da konnte man von schwierigkeiten wählen...ich habe erstmal eine arbeit für note 2 gemacht und ein programm für palindrome geschrieben...das ging relativ schnell aber jetzt halt die aufgabe minesweeper zu programmieren...
problem bzw. laut lehrerin die schwierigkeit ist dabei dass ich zu wenige befehle in der schule gelernt habe um das programm zu schreiben...daher sollen wir uns bsw auf selfphp schlau machen...
da es da aber erstens ca. 5milliarden befehle gibt ( ich übertreibe^^) fällt es mir schwer die richtigen zu finden...
versteh mich bitte nicht so dass ich nur kein bock habe das alleine zu machen und lieber andere die arbeit machen lasse...
ich würde wirklich gerne alles selber programmieren...nur leider kann ich das nicht...ich habe es echt oft probiert und mich mit dem thema richtig auseinanderer gesetzt...deshalb versuche ich den von dir geschriebenen lösungsANSATZ vom letzten thread zu verstehen und ihn komplett fertig zu schreiben...
aber wie oben schon erwähnt bin ich mit diesem befehl -> nicht vertraut...
außerdem is das array mit buildfield und nicht geschrieben deshalb mit dem von oben funktioniert es nicht...

ich werde jetzt erstmal schauen wie du es gelöst hast und dann versuchen es selbst umzuschreiben...

DANKE

p.s. ach ja noch kurze frage... was sollen diese ganzen * anfangs?
 
Wie wäre es mit einem <button type="submit" name="cell" value="x,y">*</button> statt den <input>s? Dann muss man nur noch:
PHP:
list($x, $y) = explode(',', $_POST['cell']);
 
Ich denke, ich verstehe dich da schon richtig. Mir ging es mehr darum, dass die Aufgabe nicht ganz trivial ist und meine Lösung -- na ja -- zu viel voraussetzt. (Ich habe irgendwann einfach angefangen, Minesweeper so in PHP zu programmieren, wie ich es machen würde.) Das sieht zwar nett aus, hilft dir aber vermutlich nicht wirklich weiter, da du mit zu vielen unbekannten Konzepten auf einmal konfrontiert wirst. (Du siehst gewissermaßen das Ziel, aber den Weg nicht. :)) Etwa:

- Ein um 90 Grad gegen den Uhrzeigersinn "gedrehtes" Koordinatensytem, dessen "X-Achse" von oben nach unten und dessen "Y-Achse" von links nach rechts läuft. (Das ist gewissermaßen die Antwort auf die Frage: Wie lassen sich die Daten möglichst sinnvoll organisieren -- vor allem auch hinsichtlich der Ausgabe.)

- Rekursion. Beim Anklicken eines Feldes mit 0 benachbarten Minen werden automatisch die Nachbarfelder aufgedeckt. In diesem Zusammenhang: Wie vermeide ich Endlosschleifen bei Rekursion?

- Objektorientierung. Klassen, Instanzen, Sichtbarkeiten von Methoden und Variablen, Getter/Setter-Methoden, ...

- HTTP-Sessions/Serialisierung. Das Spielobjekt wird einmal pro Spieler serialisiert auf dem Server gehalten und zu Beginn eines Requests ausgelesen und bei Ende eines Requests entsprechend verändert wieder geschrieben.

- ...

Einige Dinge davon lassen sich stark vereinfachen (auf die Objekorientierung ließe sich etwa ganz verzichten).

Deshalb die Frage, ob ihr da im Unterricht (?) irgendwelche Ansätze ausgearbeitet habt, zu denen du vielleicht konkretere Fragen hast.

freed schrieb:
p.s. ach ja noch kurze frage... was sollen diese ganzen * anfangs?

Meinst du die Kommentare?

Code:
/**
 *
 */

Das ist (in mehreren Sprachen) der Standardweg, Kommentarblöcke zu schreiben (also Kommentare, die sich über mehrere Zeilen erstrecken). Von der Syntax her würde ein /* am Anfang der ersten Zeile und ein */ am Ende der letzten Zeile ausreichen, aber diese Schreibweise hat sich eingebürgert. (Zudem werden Kommentarblöcke, die mit /** statt /* eingeleitet werden, von Tools ausgewertet, die etwa eine Dokumentation zum Sourcecode generieren können. → PHPDoc - Wikipedia, the free encyclopedia)

Falls du irgendwas im Spiel selbst meinst, ist das ziemlich sicher ein Bug. :) Ich habe es bisher nur im Firefox getestet. (Und gerade im IE6 aufgerufen, wo die einzelnen Reihen nicht sauber untereinander stehen.)

Apropos:

@crash: Das funktioniert leider im IE6 und IE7 nicht, da diese Browser aus irgendeinem Grund den Inhalt ("*") des Elements als Wert setzen, nicht das value-Attribut.

Test:

Code:
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>New</title>
    </head>
    <body>
        <?php print_r($_POST); ?>
        <form method="post" action="">
            <p>
                <button type="submit" name="cell" value="0,1">*</button>
                <button type="submit" name="cell" value="0,2">*</button>
                <button type="submit" name="cell" value="0,3">*</button>
            </p>
        </form>
    </body>
</html>
 
Zurück
Oben