ich versuche (just 4 fun) ein spiel zu programmieren, das wie M$' s Minesweeper funktioniert. Da ich das ganze auf einer homepage einbinden möchte, muss es in javascript sein...
dazu habe ich ein 2D array erstellt, jedoch lassen sich meine Minen nicht plazieren.
hier der relevante Code:
(der wert "9" bezeichnet eine Mine, da die werte 0 [leeres Feld] und 1-8 gebraucht werden.)
Code :
//...
//Array erzeugen
var a = new Array(30);
for (var i = 0; i < a.length; ++i)
{
a[i] = new Array(16);
}
//alle Werte auf Null setzten
for (var z=0;z<30;z++)
{
for (var s=0;s<16;s++)
{
a[z][s] = 0;
}
}
//zufällig minen verlegen
while(Minen <= 99)
{
x = 1 + parseInt(Math.random() * 30);
y = 1 + parseInt(Math.random() * 16);
if(a[x][y] != 9)
{
a[x][y] = 9;
Minen++;
if(a[x + 1][y + 1] != 9)
{
a[x + 1][y + 1]++;
}
if(a[x + 1][y] != 9)
{
a[x + 1][y]++;
}
if(a[x + 1][y - 1] != 9)
{
a[x + 1][y - 1]++;
}
if(a[x][y + 1] != 9)
{
a[x][y + 1]++;
}
if(a[x][y - 1] != 9)
{
a[x][y - 1]++;
}
if(a[x - 1][y + 1] != 9)
{
a[x - 1][y + 1]++;
}
if(a[x - 1][y] != 9)
{
a[x - 1][y]++;
}
if(a[x - 1][y - 1] != 9)
{
a[x - 1][y - 1]++;
}
}
}
//...
was ich mir dabei gedacht habe:
es wird ein 30*16 feld initialisiert
dann random werte erzeugt, die die koordinaten der Mine darstellen
wenn dieses feld noch keine Mine ist, wird ihm der Wert 9 (Mine) zugewiesen
alle felder die um dieses herumligen, werden, wenn sie noch keine Mine snd um 1 erhöht
die schleife startet wieder von vorne
ich weiß, das das platzieren der nummern um das feld aufwendig ist, und besser gelöst werden kann, aber FF (und IE sowie Opera) zeigen immer dort das Problem.
schreib doch mal die Fehlermeldung mit hin und an welcher Zeile er sich genau anstößt.
Ich kenn zwar kein JavaScript, aber in Java hätte man das Array auch mit new Array[30][16]; erstellen können. Das geht wohl mit JavaScript nicht?
Wenn du weist dass man das platzieren schöner lösen kann, wieso probierst du das nicht aus? Dann verschwindet vielleicht auch die Fehlermeldung.
Ich hab mich jetzt zwar auch schon länger nicht mit JavaScript beschäftigt, aber..
In der For-Schleife steht "++i".
Bei der Minenplatzierung steht "a[x + 1][y + 1]++".
Also das "++" hinter der Variable.
Gehört das so?
Ansosnten würde mir jetzt auch kein Fehler auffallen.
Wenn Du die Mienen legst, dann hat x,y zufällig Werte aus dieser Menge:
x = {1 ... 30} y = {1 ... 16}
Für die Randwerte beispielsweise x == 30 greifst Du beim Arrayzugriff mit a[x+1][y+1] außerhaupt des Arrays zu. Sogar schon x==29 geht schief. Ähnliches bei y.
Entweder das Array gleich größer machen oder beim Verteilen überprüfen ob Du am Rand bist.
Wenn Du eine einzelne Miene legst beträgt die Wahrscheinlichkeit, dass dies gut geht noch knapp 82%. Wenn Du 99 Mienen legst und alle so weit vom Rand entfernt liegen sollen, dass die Abfrage gut geht, liegt Deine Erfolgsquote bei weniger als 0,0000002%.
Nachricht bearbeitet von 7oby am 06.08.2008 um 18:28:19
@ illuminatus: Der Operator "++" kann sowohl vor den Operanden als auch dahinter gesetzt werden, allerdings gibt es dann einen Unterschied:
int i = 2;
print i;
print i++;
print i;
liefert auf der Konsole nämlich:
2
2
3
während
int i = 2;
print i;
print ++i;
print i;
2
3
3
liefert.
Deine Idee, die Minen zufällig mit For-Schleifen zu platzieren halte ich unter performance-Gesichtspunkten für suboptimal, erst recht mit den vielen if-Bedingungen, die jedes Mal abgeprüft werden müssen. Besser wäre es, ein zufälliges Feld auszuwählen und diejenigen Felder, in denen schon eine 9 steht, von der nächsten Ziehung auszuschließen.
Dieses Thema ist länger als 6 Monate inaktiv. Bitte überprüfen Sie, ob Ihr beabsichtigter Kommentar noch einen Mehrwert bringt oder das Anlegen eines neuen Themas nicht besser wäre.