Einen sonnigen Tag Euch allen! Seit Tagen bastle ich an einer Javascript-Funktion herum, die zwar notdürftig funktioniert, aber erstens nicht zuverlässig genug und zweitens fürchterlich umständlich. Dass das natürlich an mir als Hobbyprogrammierer liegt, ist mir klar. (Zum Glück gibt's das SelfHTML-Forum...)
Es geht um mein neuestes Javascript-Spiel Same Game. Das Spiel setzt sich aus zufällig angeordneten bunten Bällchen (je nach Level unterschiedlich gross und unterschiedlich viele) zusammen. Ein Klick auf mehrere waag- oder senkrecht zusammenhängende Kugeln derselben Farbe lässt diese verschwinden.
Der Klick auf eine Kugel startet in meinem Skript die Funktion direct(a), wobei a die Ordnungszahl des angeklickten Bällchens ist. Die Funktion sieht zur Zeit so aus:
function direct(a)
{
zeros=[a];
dir=[14,-1,1,14];
for (b=0;b<4;b++) if (bubble[a]==bubble[a+dir[b]])
{
zeros.push(a+dir[b]);
for (c=0;c<4;c++) if (bubble[a]==bubble[a+dir[b]+dir[c]])
{
zeros.push(a+dir[b]+dir[c]);
for (d=0;d<4;d++) if (bubble[a]==bubble[a+dir[b]+dir[c]+dir[d]])
{
zeros.push(a+dir[b]+dir[c]+dir[d]);
//Hier würden sinngemäss noch eine ganze Reihe weiterer, analog
//aufgebauter Loops folgen, die ich der Einfachheit halber hier weglasse.
}
}
}
}
Erklärung: Im Array dir befinden sich sozusagen die Himmelsrichtungen, in denen die Funktion nach gleichfarbigen Kugeln zu suchen hat. Weil auf einer Zeile 14 Kugeln Platz finden, hat Kugel x eine Nachbarkugel oben (x+14), links (x-1) usw. Ich lasse also jeweils eine Schleife viermal testen, ob die Kugel bubble[a] identisch sei mit bubble[a+dir[x]] - falls ja, lege ich sie in den Array zeros, der am Ende alle gleichfarbigen und zusammenhängenden Kugeln enthält, die verschwinden sollen.
Der langen Rede kurzer Sinn: Das ganze funktioniert zwar, aber unendlich langsam und unter enormer Prozessorlast. Der Grund: Ein und dieselbe Kugel wird von allen ihren Nachbarn als gleich erkannt und also mehrfach in den Lösch-Array gelegt. Das und die Verschachtelung der oben stehenden Funktion (jeder Schleifendurchlauf startet eine neue Schleife, die in jedem Durchlauf eine neue Schleife startet usw.) führt zu einer immensen Schleifenzahl, zu enormen Verarbeitungszeiten und ist, natürlich, logischer und programmiertechnischer Blödsinn. Meine Frage nun: Welchen Denkfehler mache ich? Wie sähe ein Suchalgorithmus aus, der dasselbe besorgt, aber jede erkannte Kugel zuverlässig nur einmal erfasst?
Mit grossmächtigem Dank aus der Schweiz, twb