Mijnenveger omliggende velden
Ik ben aan het proberen om met php een mijnenveger spel na te maken. De velden waar de bommen in liggen laat ik random berekenen en sla ik op in een array.
De vraag die ik nu heb, hoe kan ik het beste de omliggende velden van deze bommen berekenen? Dus hoeveel bommen er tegen een bepaald vakje aanliggen..
Hier een voorbeeld van de array met bommen:
Code (php)
1
2
3
2
3
<?php
Array ( [1] => 156 [2] => 311 [3] => 122 [4] => 199 [5] => 169 [6] => 221 [7] => 228 [8] => 314 [9] => 114 [10] => 152 [11] => 232 [12] => 245 [13] => 276 [14] => 242 [15] => 324 [16] => 28 [17] => 343 [18] => 27 [19] => 89 [20] => 301 [21] => 204 [22] => 47 [23] => 116 [24] => 301 [25] => 345 [26] => 237 [27] => 393 [28] => 266 [29] => 254 [30] => 336 [31] => 306 [32] => 233 [33] => 18 [34] => 281 [35] => 244 [36] => 41 [37] => 325 [38] => 210 [39] => 393 [40] => 125 [41] => 63 [42] => 60 [43] => 341 [44] => 324 [45] => 319 [46] => 368 [47] => 276 [48] => 276 [49] => 380 [50] => 272 [51] => 186 )
?>
Array ( [1] => 156 [2] => 311 [3] => 122 [4] => 199 [5] => 169 [6] => 221 [7] => 228 [8] => 314 [9] => 114 [10] => 152 [11] => 232 [12] => 245 [13] => 276 [14] => 242 [15] => 324 [16] => 28 [17] => 343 [18] => 27 [19] => 89 [20] => 301 [21] => 204 [22] => 47 [23] => 116 [24] => 301 [25] => 345 [26] => 237 [27] => 393 [28] => 266 [29] => 254 [30] => 336 [31] => 306 [32] => 233 [33] => 18 [34] => 281 [35] => 244 [36] => 41 [37] => 325 [38] => 210 [39] => 393 [40] => 125 [41] => 63 [42] => 60 [43] => 341 [44] => 324 [45] => 319 [46] => 368 [47] => 276 [48] => 276 [49] => 380 [50] => 272 [51] => 186 )
?>
Ik hoop dat iemand me hiermee kan helpen..
Ik denk dat de snelste klap is voor elke bom alle omliggende vakken bepalen, en vervolgens voor elk vak een var +1 zetten...
dus van bijvoorbeeld bord[4][4] zijn de omliggende velden
[5][4]
[4][5] enz.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$field[$counter] = 0;
if( in_array( $counter + $this->fieldSize, $bombs ) )
$field[$counter]++;
if( in_array( $counter + $this->fieldSize + 1, $bombs ) )
$field[$counter]++;
if( in_array( $counter + $this->fieldSize - 1, $bombs ) )
$field[$counter]++;
if( in_array( $counter - $this->fieldSize, $bombs ) )
$field[$counter]++;
if( in_array( $counter - $this->fieldSize + 1, $bombs ) )
$field[$counter]++;
if( in_array( $counter - $this->fieldSize - 1, $bombs ) )
$field[$counter]++;
if( in_array( $counter - 1, $bombs ) )
$field[$counter]++;
if( in_array( $counter + 1, $bombs ) )
$field[$counter]++;
?>
$field[$counter] = 0;
if( in_array( $counter + $this->fieldSize, $bombs ) )
$field[$counter]++;
if( in_array( $counter + $this->fieldSize + 1, $bombs ) )
$field[$counter]++;
if( in_array( $counter + $this->fieldSize - 1, $bombs ) )
$field[$counter]++;
if( in_array( $counter - $this->fieldSize, $bombs ) )
$field[$counter]++;
if( in_array( $counter - $this->fieldSize + 1, $bombs ) )
$field[$counter]++;
if( in_array( $counter - $this->fieldSize - 1, $bombs ) )
$field[$counter]++;
if( in_array( $counter - 1, $bombs ) )
$field[$counter]++;
if( in_array( $counter + 1, $bombs ) )
$field[$counter]++;
?>
Alleen, als een veld nu aan het einde van rij ligt, dan pakt hij hem soms ook voro de rijen daaronder.
Voorbeeld ( x is een bom )
1 - 2 - 2 - 2 - 2
x - 2 - x - x - 1
2 - 3 - 2 - 2 - 3
x - 1 - 0 - 0 - 0
Zoals je ziet, die 3 op de 3e rij, is voor die links er boven, maar ook voor die op de rij eronder en erboven in de 1e kolom.. Hoe kan ik dit tegengaan?
Je kan de lengte van een array bepalen (bijvoorbeeld zo: count($field[1]) -> Deze geeft de lengte van de rij. Zit een bom op het veld die gelijk staat aan de lengte van de rij - 1 (een array begint met tellen bij 0) dan bereken je alleen in dezelfde rij en links ervan.
Dit is het ongeveer geworden:
http://private.xxx.nl/projects/scripts/mijnenveger/
Gewijzigd op 02/03/2012 14:17:10 door B a s
Tip: id's mogen niet met een cijfer beginnen.
@Jan: aangepast!
netjes hoor ziet er wel al leuk uit
Dank je :) Heb er nog wat leuke extra's aan toegevoegd als hint, veld markeren als bom, en een leuk geluidje als je af / klaar bent. Tevens kan je zelf de grootte van het veld nu bepalen :D
Wel leuk gemaakt overigens :)
Ik heb nu alle aanwezige velden in een Array staan.
Stel veld 10 heeft een '2', dan is het: Array[ 10 ] => 2
Is veld 10 een bom, dan is het: Array[ 10 ] => 0
Is veld 10 'leeg', dan is het: Array[ 10 ] -1
Nou, dan ga je elk aangrenzend veld af, net als je doet met het bepalen van een nummer voor een vakje. Is het vakje leeg, dan omdraaien, is het een nummer die eraan grenst, dan omdraaien. Is het een bom dan niet. Het is een beetje dezelfde techniek die erbij komt kijken.
En dan moet ik voor elk omliggend vak ook weer alle omliggende vakken bepalen... etc... etc... eens kijken hoe dat gaat lukken :p
Simpel, dat hoeft alleen bij omliggende vakjes van een aangrenzend leeg vakje. Staat er een nummer, dan hoef je niet alle omliggende vakjes af, staat er een bom, dan hoef je ook niet alle omliggende vakjes af.
Sla alle omliggende lege vakjes op in een array, en ga daarmee verder, of doe het direct door in de controle lus:
Edit: Het lijkt er op dat het me is gelukt!
Als iedereen even zou willen testen of alles werkt, dan zal ik als dat het geval is alles posten :)
http://private.xxx.nl/projects/scripts/mijnenveger/
Gewijzigd op 02/03/2012 14:17:18 door B a s
Bovendien klikte ik niet op een leeg vakje, maar een nummer daar 1 vakje vandaan. -> Je moet die functie ALLEEN aanroepen wanneer op een leg vakje is geklikt ;)
Zie de 1 helemaal rechtsonderin...
ps. Dit komt doordat als je op een leeg vakje klikt er automatisch een 1 in komt te staan.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Ik ben nu aan het kijken waar die vandaan komt