Ik vind het spelletje GoldStrike http://www.funnygames.nl/spelletjes/2374.html erg verslavend, maar erger me aan delen van de gameplay. Daarom besloot ik vanavond dat spelletje in Javascript opnieuw te bouwen, zoals ik het graag zou zien.
Ik stuit daarbij op een stack overflow (too much recursion) error in een recursieve functie die ik niet opgelost krijg. Ook in gevallen waarbij de functie zichzelf slechts 1 maal aanroept, geeft de browser deze fout.
Om de situatie zo goed mogelijk te begrijpen, is het handiger om even op bovenstaande link te klikken dan dat ik het hier probeer uit te leggen. Heb je meteen een momentje spelplezier
Het probleem doet zich voor wanneer de speler klikt op een stenengroep om deze te verwijderen. Het script zoekt naar de totale groep van gelijkgekleurde stenen, die naast, onder of boven elkaar kunnen liggen. Dit gebeurt door middel van een recursieve functie die respectievelijk checkt of de bovenliggende, rechter, onderliggende en/of linker steen hetzelfde is, en de functie opnieuw aanroept met de coordinaten van een gevonden steen. Vervolgens retourneert de functie een array met coordinaten, waaraan de huidige steen wordt toegevoegd. Uiteindelijk levert dit de totale array van stenen op, die, als deze 2 of meer elementen bevat, gewist moet worden. (Een enkele steen kan namelijk niet worden verwijderd.
De foutmelding ontstaat wanneer ik op een steen klik die in een groep hoort van meer dan 1 steen. Bij bijvoorbeeld een groep van twee stenen zal de functie zichzelf slechts 1 keer opnieuw aanroepen, maar daar ontstaat de fout al. Het meest vreemde is, dat als ik regel 11-17 (de check voor de onderliggende steen en de linker steen) verwijder, dan werkt de functie voor een geheel leeg veld wel (99 recursieve aanroepen!). Hetzelfde als ik regel 3-9 weghaal.
Ik snap er geen fluit van. Ik heb al geprobeerd om geen array te gebruiken, maar een string, en de coordinaten daar kommagescheiden aan toe te voegen, maar de foutmelding blijft. Het lijkt wel alsof de Javascript-interpreter vaststelt dat 2+ mogelijke recursieve aanroepen binnen een functie teveel zijn, ongeacht of deze ook daadwerkelijk gebruikt worden.
Je vindt het script op http://www.endlesscassettes.com/goldstrike/. Het belangrijkste verschil met het originele spel is dat nieuwe rijen niet automatisch ontstaan, maar moeten worden toegevoegd door op de '>>' knop te klikken.
Ik hoop dat iemand een idee heeft wat hier mis gaat, of een mogelijke oplossing weet. Ik kom er maar niet uit.
Groet,
Jo3p
Ik stuit daarbij op een stack overflow (too much recursion) error in een recursieve functie die ik niet opgelost krijg. Ook in gevallen waarbij de functie zichzelf slechts 1 maal aanroept, geeft de browser deze fout.
Om de situatie zo goed mogelijk te begrijpen, is het handiger om even op bovenstaande link te klikken dan dat ik het hier probeer uit te leggen. Heb je meteen een momentje spelplezier
Het probleem doet zich voor wanneer de speler klikt op een stenengroep om deze te verwijderen. Het script zoekt naar de totale groep van gelijkgekleurde stenen, die naast, onder of boven elkaar kunnen liggen. Dit gebeurt door middel van een recursieve functie die respectievelijk checkt of de bovenliggende, rechter, onderliggende en/of linker steen hetzelfde is, en de functie opnieuw aanroept met de coordinaten van een gevonden steen. Vervolgens retourneert de functie een array met coordinaten, waaraan de huidige steen wordt toegevoegd. Uiteindelijk levert dit de totale array van stenen op, die, als deze 2 of meer elementen bevat, gewist moet worden. (Een enkele steen kan namelijk niet worden verwijderd.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| function search_group(row, column, backgroundcolor, group) {
if (row>0 && document.getElementById((row-1)+"_"+column).style.backgroundColor==backgroundcolor ) {
group = search_group(row-1, column, backgroundcolor, group);
}
if (column<columns-1 && document.getElementById(row+"_"+(column+1)).style.backgroundColor==backgroundcolor ) {
group = search_group(row, column+1, backgroundcolor, group);
}
if (row<rows-1 && document.getElementById((row+1)+"_"+column).style.backgroundColor==backgroundcolor ) {
group = search_group(row+1, column, backgroundcolor, group);
}
if (column>0 && document.getElementById(row+"_"+(column-1)).style.backgroundColor==backgroundcolor ) {
group = search_group(row, column-1, backgroundcolor, group);
}
group[group.length]=row+"_"+column;
return group;
} |
De foutmelding ontstaat wanneer ik op een steen klik die in een groep hoort van meer dan 1 steen. Bij bijvoorbeeld een groep van twee stenen zal de functie zichzelf slechts 1 keer opnieuw aanroepen, maar daar ontstaat de fout al. Het meest vreemde is, dat als ik regel 11-17 (de check voor de onderliggende steen en de linker steen) verwijder, dan werkt de functie voor een geheel leeg veld wel (99 recursieve aanroepen!). Hetzelfde als ik regel 3-9 weghaal.
Ik snap er geen fluit van. Ik heb al geprobeerd om geen array te gebruiken, maar een string, en de coordinaten daar kommagescheiden aan toe te voegen, maar de foutmelding blijft. Het lijkt wel alsof de Javascript-interpreter vaststelt dat 2+ mogelijke recursieve aanroepen binnen een functie teveel zijn, ongeacht of deze ook daadwerkelijk gebruikt worden.
Je vindt het script op http://www.endlesscassettes.com/goldstrike/. Het belangrijkste verschil met het originele spel is dat nieuwe rijen niet automatisch ontstaan, maar moeten worden toegevoegd door op de '>>' knop te klikken.
Ik hoop dat iemand een idee heeft wat hier mis gaat, of een mogelijke oplossing weet. Ik kom er maar niet uit.
Groet,
Jo3p