• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Mehrdimensionale Arrays - Problem - JS

Mineroboter

New member
Ich habe in meinem kleinen Spiel welches ich dort programmieren will ein mehrdimensionales Array um Daten von Blöcke zu speichern.

Zuerst wird ein Raum erstellt und korrekt aufgerufen.
Dann definiere ich das mehrdimensionale Array und weise allen Elementen eine 0 zu:
Code:
this.blocka = new Array();
this.blocka[0] = new Array(0,0,0,0);
this.blocka[1] = new Array(0,0,0,0);
this.blocka[2] = new Array(0,0,0,0);
this.blocka[3] = new Array(0,0,0,0);
this.blocka[4] = new Array(0,0,0,0);
this.blocka[5] = new Array(0,0,0,0);

Code:
var iron_ore_random = 15;
this.random(iron_ore_random, 100, 100, iron_ore);
this.random(iron_ore_random, 100, 200, iron_ore);
this.random(iron_ore_random, 100, 300, iron_ore);
this.random(iron_ore_random, 100, 400, iron_ore);
this.random(iron_ore_random, 200, 100, iron_ore);
this.random(iron_ore_random, 200, 200, iron_ore);
this.random(iron_ore_random, 200, 300, iron_ore);
this.random(iron_ore_random, 200, 400, iron_ore);
//......
Code:
Room.prototype.random = function(randomx, bx, by, block)
{
var b = 0
if (block == iron_ore)
	b = 1
var rdm = Math.round(Math.random() * 100)
brx = (bx / 100) -1;
bry = (by / 100) -1;
if (rdm <= randomx)
	if (this.blocka[brx][bry]==0)
		block_ctx.drawImage(block, bx, by);
		this.blocka[brx][bry] = b;
}
Das Problem ist, dass wenn ich
Code:
alert(blocka);
eingebe, spuckt er mir folgendes aus: 1,1,1,1,1,1,1,1,1,1,1,1.....
Eigentlich sollte er z.B. das ausspucken: 0,0,0,0,1,0,1,1,0,0,0,1,0,0,0 oder 1,0,1,0,0,0,1,0,0,1,0,0,0
Was mache ich falsch
Die Images zeigt er korrekt an....

Hinweis: block_ctx ist ein Canvas-Objekt auf dem die Bilder gezeichnet werden...
 
Zuletzt bearbeitet:
Hi,

es sieht so aus, als wären entweder die beiden if-Bedingungen (if (rdm <= randomx) und if (this.blocka[brx][bry]==0)) immer erfüllt oder der Fall if (block == iron_ore). Es ist also zum einen interessant zu wissen, welchen Wert randomx besitzt (evtl. immer grösser 100?). Zum anderen, ob block immer gleich iron_ore ist.

Ciao
Quaese
 
Zuletzt bearbeitet:
randomx ist eine variable die einen Prozentsatz entspricht... Möchte ich also dass das Bild mit einer 15 % Chance angezeigt werden soll, übermittle ich der function random() die Zahl in dem Fall eine vorher definierte variable die 15 beträgt... Er soll also wenn die random generierte Zahl gleich kleiner ist als 15 dann die das Bild anzeigen an der Postion...
auch wenn if (block == iron_ore) immer true ergibt muss er doch bei if (rdm <=randomx) hängen bleiben oder nicht?

Und ja block ist im meinem Beispiel bisher immer iron_ore welche ich durch weitere sachen so ergänzen wollte:
Code:
if (block == richtig_geiler_block)
        b = 2;
 
Zuletzt bearbeitet:
Hi,

ist es dir möglich, eine auf das Wesentliche beschränkte lauffähige Version (ohne Canvas, nur Logik) zu posten, so dass es lokal nachgestellt werden kann? So ist es doch relativ schwierig, Hilfe zu leisten.

Ciao
Quaese
 
Wie jetzt? nur logik?

- - - Aktualisiert - - -

Das ist doch ******** jetzt hab ich mal alles was dafür wichtig ist ohne die canvas function zusammengetragen und jetzt macht er es richtig aber ich weiß nicht was in der normalen game.js falsch ist...

- - - Aktualisiert - - -

Soll ich dir mal die ganze game.js und index.html schicken?
 
Hi,

sorry, hatte gestern keine Zeit mehr.

Ich habe deinen Code nochmal angesehen. Dabei ist mir aufgefallen, dass es wohl an der Klammerung der if-Anweisungen liegen könnte.

Gibt es keine Klammerung, wird nur die erste folgende Anweisung ausgeführt. In der if-Anweisung if (rdm <= randomx) wird somit lediglich die folgende if-Anweisung
Code:
if (this.blocka[brx][bry]==0)
		block_ctx.drawImage(block, bx, by);
ausgeführt. Die anschliessend folgende Zeile wird in jedem Fall ausgeführt und somit der Wert immer auf 1 gesetzt.

Neben dem Klammern der if-Rümpfe solltest du dir angewöhnen, Anweisungen mit einem Semikolon abzuschliessen.

Versuch mal, ob dir nachstehender Codeblock hilft:
Code:
Room.prototype.random = function(randomx, bx, by, block) {
    var b = 0;

    if (block == iron_ore) {
        b = 1;
    }

    var rdm = Math.round(Math.random() * 100),
        brx = (bx / 100) - 1,
        bry = (by / 100) - 1;

    if (rdm <= randomx) {
        if (this.blocka[brx][bry] == 0) {
            block_ctx.drawImage(block, bx, by);
        }

       this.blocka[brx][bry] = b;
    }
}
Ciao
Quaese
 
Zurück
Oben