Mijneveger in PHP
we moeten voor school een eindopdracht maken ivm PHP, in mijn geval is dat het programma mijneveger schrijven. Het probleem is dat wij slechts beperkte dingen gezien hebben als, forms, for-en if-lussen en arreys. Ook hadden we al de basis van HTML gezien (tabellen, opmaak,..). Het probleem is dus dat die eindopdracht ineens een hele grote stap is van gewone korte oefeningen naar een grote opdracht van een groot aantal lijnen, en dat ik dus geen manier zie om zoiets te doen werken.
Maar dus, de bedoeling bij mij is dus om met gewoon standaard PHP in kladblok het spel mijneveger te schrijven op een 9x9 spelbord met 10 mijnen, dus eigenlijk een meer amateuristischere versie van het echte spel. Ook moeten die mijnen willekeurig worden geplaatst.
Ik heb tot nu toe al een tabel kunnen maken van 9x9 met allemaal radio velden maar ik heb echt geen idee hoe het verder moet. Ik weet dat ik met arreys moet werken omdat ik later in mijn bestand moet kunnen nagaan of er ergens een mijn ligt of niet. Ook weet ik niet goed hoe ik, na op 'ga door' te klikken, die vakken met cijfers 1 tot 8 kan bekomen (om aan te duiden hoeveel mijnen er in de buurt liggen).
Dit heb ik tot nu toe al:
<!DOCTYPE HTML>
<head>Mijneveger</head>
<body>
<form action="mijnevegerspel1.php" method="post">
<table border="1" cellpadding="5" cellspacing="1" width="30%">
Code (php)
</table>
<input type="submit" value="Ga door"/>
</form>
</body>
</html>
Mijn algemene vraag is dus: hoe kan ik met de simpele PHP functies een werkend mijneveger spel maken? Ik vraag dus niet noodzakelijk om de opdracht voor mij op te lossen, maar om mij aan verstaanbare en liefst niet te ingewikkelde manieren te helpen om dit spel mooi te doen werken (voor zover dat kan in deze simpele programmeertaal).
Alvast bedankt voor hulp en tips.
Gewijzigd op 28/05/2011 23:35:30 door Matthias Degreef
Heb je geleerd hoe je functies moet maken? Die onderdelen onderdelen die ik noemde kan je mooi functies voor maken. Bijv. een functie die je het speelbord en een x en y coördinaat geeft, en die dan het getalletje teruggeeft wat in dat vakje zou moeten komen te staan.
Je kan al dat soort functies gemakkelijk maken zonder je op dat moment druk te maken over hoe je het formulier (de tabel) moet gaan maken en verwerken, of hoe je het speelbord tijdens het spel moet gaan onthouden. Programmeer in kleine stapjes, en test ieder stapje. Je zit dan minder te zoeken naar fouten (want hoeveel kan er mis gaan in een klein stapje?) en je programma wordt er beter begrijpbaar door (als je goeie namen aan je functies geeft)
Jelmer rrrr op 29/05/2011 00:43:26:
Bijv. een functie die je het speelbord en een x en y coördinaat geeft, en die dan het getalletje teruggeeft wat in dat vakje zou moeten komen te staan.
Welke functie bedoel je dan?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
function aantal_aanliggende_mijnen($spelbord, $x, $y)
{
aantal_mijnen = 0;
voor $x - 1 tot $x + 1
voor $y - 1 tot $y + 1
als spelbord[x][y] is mijn
hoog aantal_mijnen op.
return aantal_mijnen
}
?>
function aantal_aanliggende_mijnen($spelbord, $x, $y)
{
aantal_mijnen = 0;
voor $x - 1 tot $x + 1
voor $y - 1 tot $y + 1
als spelbord[x][y] is mijn
hoog aantal_mijnen op.
return aantal_mijnen
}
?>
Een zelf-gemaakte functie.
Begin met een zelf gemaakt speelveld, gewoon iets a la
Code (php)
Dat is veel makkelijker testen omdat je nu weet wat het getal voor vakje 3,3 moet zijn. Het speelveld willekeurig bezaaien met mijnen komt daarna wel, is een los onderdeel, kan je apart oplossen.
Parse error: syntax error, unexpected '=' in J:\xampp\htdocs\hulp.php on line 4
Maar dat is nu juist het probleem, zo een functie zoals jij gebruikt hebben wij nog nooit gezien, ik weet dus ook niet goed wat ik daarmee moet aanvangen... Ik zou het graag snappen maar we hebben gewoon te weinig basis om zo'n eindopdracht te maken.
En dat tweede deel, zet ik dat er dan gewoon bij? Maar dan in 9x9?
Maar als je niet geleerd hebt functies te maken, is het idd wel een erg grote stap naar mijneNveger.
Gewijzigd op 29/05/2011 13:36:06 door Pim -
Die laatste link had ik al eens gevonden, maar ik ben er niets mee aangezien hij verschillende connecties maakt. En met dat eerste heb ik dus al mijn probleem kunnen oplossen hoe ik de mijnen willekeurig kan laten plaatsen, nu moet ik dat nog kunnen inwerken in mijn eigen programma :p
Matthias, misschien kun je vanuit dat script wat inspiratie opdoen en toepassen op je eigen script. Niet letterlijk kopiëren, maar gewoon een idee opdoen. Alhoewel zijn versie wel iets anders werkt. Je moet daar juist de mijnen opzoeken.
Ik vind maar niet hoe ik die random mijnen (van in de eerste link van PHP Scripter) in mijn oorspronkelijke tabel kan krijgen met die radio velden. Kan iemand helpen?
Dit genereer je natuurlijk automatisch, maar dit is wel handig om te testen.
Code (php)
Ik zou een array als deze opslaan in de sessie, of serialized in de database opslaan.
Vervolgens maak je een formulier
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<style>
.field{ background: #ccc; height: 10px; width: 10px; float: left; }
.green{ background: #006A00 url('good.jpg') top left no-repeat; }
.mine { background: #f00 url('mine.jpg') top left no-repeat; }
</style>
<?
foreach($speelveld as $x => $y_array)
{
foreach($y_array as $y => $veld_type)
{
print '<div class="field" rel="'$x.'_'.$y.'"> </div>';
}
print '<div style="clear: both;">'
}
?>
.field{ background: #ccc; height: 10px; width: 10px; float: left; }
.green{ background: #006A00 url('good.jpg') top left no-repeat; }
.mine { background: #f00 url('mine.jpg') top left no-repeat; }
</style>
<?
foreach($speelveld as $x => $y_array)
{
foreach($y_array as $y => $veld_type)
{
print '<div class="field" rel="'$x.'_'.$y.'"> </div>';
}
print '<div style="clear: both;">'
}
?>
Laat met een javascript ajax call uitvoeren, om de gevolgen van de klik te berekenen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?
// Dit kan goed met jQuery
$('.field').click(function(){
rel = $(this).attr('rel');
// verwerk pagina aanroepen
});
$('.field').rightclick(function()
{
// pagina die een vlag neerzet
});
?>
// Dit kan goed met jQuery
$('.field').click(function(){
rel = $(this).attr('rel');
// verwerk pagina aanroepen
});
$('.field').rightclick(function()
{
// pagina die een vlag neerzet
});
?>
--- Verwerkpagina ---
Op deze pagina worden een javascript actielijst gegenereerd.
Bijvoorbeeld een mijn:
Code (php)
1
2
3
4
2
3
4
<script type="text/javascript">
<?php
print '$(\'.field[rel='.$rel.'\').addClass(\'mine\');';
?></script>
<?php
print '$(\'.field[rel='.$rel.'\').addClass(\'mine\');';
?></script>
Gewijzigd op 31/05/2011 17:58:53 door Pieter van Linschoten
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
// een array 1-81 in random volgorde zetten
$array = range(1,81);
shuffle($array);
// eerste 108 selecteren
$array_slice = array_slice($array, 0, 10);
echo '<table><tr><td></td>';
for($i = 1;$i < 101;$i++){
//zit $i in $array_slice
if(in_array($i, $array_slice)){
echo '<td style="color:f00;">1</td>'; //1 is mijn
}
else{
echo '<td id="vak">0</td>'; //0 is geen mijn
}
if($i%10 == 0){
echo '</tr><td>';
}
}
echo '</tr></table>';
?>
// een array 1-81 in random volgorde zetten
$array = range(1,81);
shuffle($array);
// eerste 108 selecteren
$array_slice = array_slice($array, 0, 10);
echo '<table><tr><td></td>';
for($i = 1;$i < 101;$i++){
//zit $i in $array_slice
if(in_array($i, $array_slice)){
echo '<td style="color:f00;">1</td>'; //1 is mijn
}
else{
echo '<td id="vak">0</td>'; //0 is geen mijn
}
if($i%10 == 0){
echo '</tr><td>';
}
}
echo '</tr></table>';
?>
In dit krijgen:
<!DOCTYPE HTML>
<head>Mijneveger</head>
<body>
<form action="mijnevegerspel1.php" method="post">
<table border="1" cellpadding="5" cellspacing="1" width="30%">
Code (php)
</table>
<input type="submit" value="Ga door"/>
</form>
</body>
</html>
Gewijzigd op 31/05/2011 18:07:40 door Matthias Degreef
Heb je het zelf al geprobeerd?
Ja, en ik krijg altijd meldingen dat er ergens een foutje zit. Ik blijf ondertussen zelf proberen hoor! ;)
Gewijzigd op 31/05/2011 18:19:01 door PHP Scripter
Ik heb altijd de error van unexpected $end, of error op line... als je het nog wil weten. Het is gewoon de bedoeling dat wanneer ik een radio veld aanduid en verstuur dat ik dat heb aangeduid dat ik met "if" lussen kan achterhalen of onder die radio die ik heb aangeduid of daar een 1 of een 0 stond. Klink simpel maar lukt dus duidelijk (nog) niet (voor mij).
ik zou denken dat je een schoolvak hebt gekozen waar je eigenlijk bijna niks van kan
Maarten Buijs op 31/05/2011 19:01:32:
ik zou denken dat je een schoolvak hebt gekozen waar je eigenlijk bijna niks van kan
Ik heb daar niet voor gekozen, zit standaard in ons lessenpakket. We hebben dat 1 uur in de week en dan krijgen we zo'n opdracht :p
Gewijzigd op 31/05/2011 19:03:26 door Matthias Degreef
Quote:
Het spijt me maar het mag enkel uit php codes bestaan, en het is dus ook niet met javascript... we werken met XAMPP en dus helpen javascript codes niet.
Zolang je een browser gebruikt, kun je javascript gebruiken.
Verder is de manier waarop je het nu aanpakt, nogal omslachtig.
Vraag je zelf af:
Waar haal ik de mijnen op het speelveld vandaan?
Code (php)
1
2
3
4
5
2
3
4
5
<?
$array = range(1,81);
shuffle($array);
$array_slice = array_slice($array, 0, 10);
?>
$array = range(1,81);
shuffle($array);
$array_slice = array_slice($array, 0, 10);
?>
Hoe zorg ik ervoor, dat ik, na het posten van mijn opgave, niet de volgorde van mijnen kwijt ben?
Hoe controleer ik, of een veld waar ik op klik, een mijn bevat?
Het versturen van de volgende regel:
Kan je afvangen met:
Code (php)
Gewijzigd op 31/05/2011 19:16:48 door Pieter van Linschoten
Daar kom ik al een heel eind mee denkik, dank je.
hier mijn schript van bestand 1:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$array = range(1,81);
shuffle($array);
$array2 = serialize($array);
$array_slice = array_slice($array, 1, 10);
echo "<form action=\"Spel2.php\" method=\"post\">
<table border=\"1\" cellpadding=\"5\" cellspacing=\"1\" width=\"30%\"><tr>";
for($i = 1;$i <= 81;$i++){
if(in_array($i, $array_slice)){
echo"<td><center><input type=\"radio\" name= \"veld\" value=\"1\"/></center></td>";
}
else{
echo"<td><center><input type=\"radio\" name= \"veld\" value=\"0\"/> $i"; $j = serialize($i); echo"</center></td>";
$j = serialize($i);
}
if($i%9 == 0){
echo "</tr>";
}
}
?>
$array = range(1,81);
shuffle($array);
$array2 = serialize($array);
$array_slice = array_slice($array, 1, 10);
echo "<form action=\"Spel2.php\" method=\"post\">
<table border=\"1\" cellpadding=\"5\" cellspacing=\"1\" width=\"30%\"><tr>";
for($i = 1;$i <= 81;$i++){
if(in_array($i, $array_slice)){
echo"<td><center><input type=\"radio\" name= \"veld\" value=\"1\"/></center></td>";
}
else{
echo"<td><center><input type=\"radio\" name= \"veld\" value=\"0\"/> $i"; $j = serialize($i); echo"</center></td>";
$j = serialize($i);
}
if($i%9 == 0){
echo "</tr>";
}
}
?>
</table>
<input type="hidden" name="array2" value="" />
<input type="hidden" name="j" value="" />
<input type="submit" value="Ga door"/>
</form>
en bestand 2:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
$veld = $_POST["veld"];
$array2 = unserialize($_POST["array2"]);
$array3 = serialize($array2);
$j = unserialize($_POST["j"]);
echo "$j"; //toont telkens 81??
$array_slice = array_slice($array2, 1, 10);
if($veld == 1){
echo "Je hebt een mijn geraakt en bent dood! <p> <a href=\"Spel.php\">Begin opnieuw!</a>";
}
else{
echo "<form action=\"Spel3.php\" method=\"post\">
<table border=\"1\" cellpadding=\"5\" cellspacing=\"1\" width=\"30%\"><tr>";
for($i = 1;$i <= 81;$i++){
if($i == $j){
echo"<td><center>0</center></td>";
}
else{
if(in_array($i, $array_slice)){
echo"<td><center><input type=\"radio\" name= \"veld\" value=\"1\"/></center></td>";
}
else{
echo"<td><center><input type=\"radio\" name= \"veld\" value=\"0\"/></center></td>";
$k = serialize($i);
}
if($i%9 == 0){
echo "</tr>";
}
}
}
echo
"</table>
<input type=\"hidden\" name=\"array3\" value=\"echo $array3;\"/>
<input type=\"hidden\" name=\"k\" value=\"<?php echo $k; ?>\" />
<input type=\"submit\" value=\"Ga door\"/>";
}
?>
$veld = $_POST["veld"];
$array2 = unserialize($_POST["array2"]);
$array3 = serialize($array2);
$j = unserialize($_POST["j"]);
echo "$j"; //toont telkens 81??
$array_slice = array_slice($array2, 1, 10);
if($veld == 1){
echo "Je hebt een mijn geraakt en bent dood! <p> <a href=\"Spel.php\">Begin opnieuw!</a>";
}
else{
echo "<form action=\"Spel3.php\" method=\"post\">
<table border=\"1\" cellpadding=\"5\" cellspacing=\"1\" width=\"30%\"><tr>";
for($i = 1;$i <= 81;$i++){
if($i == $j){
echo"<td><center>0</center></td>";
}
else{
if(in_array($i, $array_slice)){
echo"<td><center><input type=\"radio\" name= \"veld\" value=\"1\"/></center></td>";
}
else{
echo"<td><center><input type=\"radio\" name= \"veld\" value=\"0\"/></center></td>";
$k = serialize($i);
}
if($i%9 == 0){
echo "</tr>";
}
}
}
echo
"</table>
<input type=\"hidden\" name=\"array3\" value=\"echo $array3;\"/>
<input type=\"hidden\" name=\"k\" value=\"<?php echo $k; ?>\" />
<input type=\"submit\" value=\"Ga door\"/>";
}
?>