Javascript 2D array

Forum Eigene Website, Hosting, Webdesign, Programmieren : Javascript 2D array

Tom's Hardware: 1,4 Mio. Mitglieder aus 6 verschiedenen Ländern beantworten alle Ihre Fragen über Computer-Technik und IT. Um Hilfe zu erhalten, registrieren Sie sich kostenlos!
Wort:    Username:           
 

Heey

mal wieder ein Problem mit javascript...

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 :
  1. //...
  2.     //Array erzeugen
  3.     var a = new Array(30);
  4.     for (var i = 0; i < a.length; ++i)
  5.     {
  6.         a[i] = new Array(16);
  7.     }
  8.     //alle Werte auf Null setzten
  9.     for (var z=0;z<30;z++)
  10.     {
  11.         for (var s=0;s<16;s++)
  12.         {
  13.             a[z][s] = 0;
  14.         }
  15.     }
  16.     //zufällig minen verlegen
  17.     while(Minen <= 99)
  18.     {
  19.         x = 1 + parseInt(Math.random() * 30);
  20.         y = 1 + parseInt(Math.random() * 16);
  21.         if(a[x][y] != 9)
  22.         {
  23.             a[x][y] = 9;
  24.             Minen++;
  25.             if(a[x + 1][y + 1] != 9)
  26.             {
  27.                 a[x + 1][y + 1]++;
  28.             }
  29.             if(a[x + 1][y] != 9)
  30.             {
  31.                 a[x + 1][y]++;
  32.             }
  33.             if(a[x + 1][y - 1] != 9)
  34.             {
  35.                 a[x + 1][y - 1]++;
  36.             }
  37.             if(a[x][y + 1] != 9)
  38.             {
  39.                 a[x][y + 1]++;
  40.             }
  41.             if(a[x][y - 1] != 9)
  42.             {
  43.                 a[x][y - 1]++;
  44.             }
  45.             if(a[x - 1][y + 1] != 9)
  46.             {
  47.                 a[x - 1][y + 1]++;
  48.             }
  49.             if(a[x - 1][y] != 9)
  50.             {
  51.                 a[x - 1][y]++;
  52.             }
  53.             if(a[x - 1][y - 1] != 9)
  54.             {
  55.                 a[x - 1][y - 1]++;
  56.             }
  57.         }
  58.     }
  59.     //...



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.

vielen dank für eure Hilfe =)

Anzeigen

Hallo,

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.

Antworten Marfir

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.

Grüße

Antworten illuminatus
- 0 +

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
Antworten 7oby

@ 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.

Was sagt denn die Exception?

Aetius

Antworten Aetius
Tom's Hardware > Foren > Eigene Website, Hosting, Webdesign, Programmieren > Javascript 2D array
Zu:

Es gibt 43 identifizierte und nicht identifizierte User. Zur Ansicht der Liste identifizierter User, Hier klicken.

Wichtiger Hinweis

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.

Antwort hinzufügen Abbrechen
Google Anzeigen
  • Die Community jetzt fragen
  • Veröffentlichen
Anzeige
Die folgenden Community-Mitglieder erhielten Auszeichnungen!
Wir gratulieren:
  • 23:37 fffcmad hat das Abzeichen Windows erhalten
  • 01:00 peterm852 hat das Abzeichen Leser erhalten
  • 01:00 Kopernikus_71 hat das Abzeichen Leser erhalten
  • 19:29 Marcel_H hat das Abzeichen Kolumnist erhalten
  • 01:00 freumich hat das Abzeichen Leser erhalten
  • 01:00 Fina hat das Abzeichen Leser erhalten
  • 17:18 bensen hat das Abzeichen Kolumnist erhalten
  • 14:43 fffcmad hat das Abzeichen Audio erhalten
  • 01:00 frankyn hat das Abzeichen Niedergelassen erhalten
  • 01:00 thelittle hat das Abzeichen Niedergelassen erhalten
Anzeigen