Ich möchte die Daten aus meiner 2D Array Schleife auslesen ist das möglich und wie?

3 Antworten

Wenn du der englischen Sprache mächtig bist: https://stackoverflow.com/questions/2893297/iterate-multi-dimensional-array-with-nested-foreach-statement

Dort sind Beispiele mit sowohl einer for-Schleife als auch mit einer foreach-Schleife.

OnlybeAwesome 
Fragesteller
 17.11.2017, 15:16

Das habe ich auch schon gefunden aber ich kann daraus nicht entnehmen wie ich die 10 Werte unterschiedlich abspeichern kann

0
Crysali  17.11.2017, 19:52
@OnlybeAwesome

Du hast an verschiedenen Stellen hier von "auslesen" gesprochen. Wenn du einen 2D Array hast, greifst du beispielsweise auf die Koordinate (9,18) so zu:

// Eine "Karte" mit 100x100 Feldern
var meineKoordinaten = new int[100,100];

// Das Element an der Stelle (9,18)
koordinate = meineKoordinaten[9,18];

Was du dann mit abspeichern meinst, ist mir nicht klar.

0
OnlybeAwesome 
Fragesteller
 17.11.2017, 20:36
@Crysali

also mit dem Code erzeuge ich ja 10 Elemente an verschiedenen Stellen und ich brauche die Koordinaten dieser Random ermittelten Stellen um damit ich eine kollision schreiben kann. Die Elemente sollen als Hindernisse dienen.  Mein Problem ist das ich nicht weis wie ich die Random Stellen auslesen kann ^^ 

0
Crysali  18.11.2017, 11:11
@OnlybeAwesome

Du erzeugst die Koordinaten mit:

int i = Rnd.Next(119);
int j = Rnd.Next(29);

Jetzt musst du diese Koordinaten noch in deinem Array abspeichern, falls der Array diese Kollisionen enthalten soll. Wenn dem so wäre, verstehe ich nicht so ganz, warum du einen int[,] benutzt, da die Informationen über Kollision ganz einfach mit bool[,] dargestellt werden kann, mit true = da ist eine Kollision. Dann kannst du das Ganze so schreiben:

bool[,] kollisionen = new bool[119,29];
int hz = 0;

do

{
int i = Rnd.Next(119);
int j = Rnd.Next(29);
bool[119,29] = true;
Console.SetCursorPosition(i, j);
Console.Write(hSymbol);
hz++
;
} while (hz < 10);


Ich weiß immer noch nicht, was du mit Auslesen meinst.

0
OnlybeAwesome 
Fragesteller
 18.11.2017, 12:35
@Crysali

Also die erzeugten Koordinaten sollen Hindernisse sein. Ich muss nämlich noch ein Stern erzeugen der durch dieses Feld 119 29 fliegt und dieser Stern muss an diesen erzeugten Hindernissen abprallen 

0
Crysali  18.11.2017, 15:29
@OnlybeAwesome

Das hängt dann davon ab, wie der Stern fliegt, aber du kannst, wenn du bool[,] als Karte mit Koordinaten benutzt, einfach folgendes machen ( Pseudo-Code):

if(array[x,y]){
// Bei (x,y) ist ein Hindernis, Stern prallt ab
}else{
// Platz frei, Stern kann weiterfliegen zu (x,y)
}
1
OnlybeAwesome 
Fragesteller
 18.11.2017, 17:02
@Crysali

//Optische Erscheinungsbilder der Elemente
char sternSymbol = '*';
char leerSymbol = ' ';
char hSymbol = '#';

bool[,] kollisionen = new bool[119, 29];
Random Rnd = new Random();
int hz = 0;
do
{
int i = Rnd.Next(119);
int j = Rnd.Next(29);
bool[119, 29] = true;
Console.SetCursorPosition(i, j);
Console.Write(hSymbol);
hz++;
} while (hz < 10);

//Spielraum da Win 8 80,25 aber Win 10 120,30
int maxX = 119;
int maxY = 29;
Console.CursorVisible = false;

double zuegeProSekunde = 10;

//Konfiguration des Sterns/Startpostition
int sternX = 2;
int sternY = 2;

//Richtungsangabe des Sterns
/****************************************
* sternDX = -1 --> links, +1 -->rechts *
* sternDY = -1 --> oben, +1 -->unten *
****************************************/
int sternDx = -1;
int sternDy = 1;

while (true)
{

// Abprall von den Wänden links rechts
if ((sternX == 0 && sternDx == -1) ||
(sternX == maxX && sternDx == 1))
{

sternDx = sternDx * -1;
}
// Abprall von den Wänden oben unten
if ((sternY == 0 && sternDy == -1) ||
(sternY == maxY && sternDy == 1))
{

sternDy = sternDy * -1;
}
// Setze Curserposition und schreibe Symbol
Console.SetCursorPosition(sternX, sternY);
Console.Write(sternSymbol);

//Setze Position auf 0,0 um Formatierungsfehler zu vermeiden
Console.SetCursorPosition(0, 0);

// Warte auf nächsten Zug
System.Threading.Thread.Sleep((int)(1000 / zuegeProSekunde));

//Überschreibung des Sterns durch Leersymbol
Console.SetCursorPosition(sternX, sternY);
Console.Write(leerSymbol);

//Berechne neue Position
sternX = sternX + sternDx;
sternY = sternY + sternDy;

}

Console.ReadKey();
}

Ich wüsste nicht wie ich das drin einbinden sollte da mir da egal wie ich es versuche ein error ausgegeben wird 

0
Crysali  18.11.2017, 21:55
@OnlybeAwesome

Du kannst das bei dem Abprall mit den Wänden einbinden:

// Abprall von den Wänden und Hindernissen links rechts
if ((sternX == 0 && sternDx == -1) ||
(sternX == maxX && sternDx == 1)) ||
( kollisionen[sternX,sternY+1] && sternDy == 1) ||
( kollisionen[sternX,SternY-1] && sternDy == -1)
{
    sternDx = sternDx * -1;
}

und entsprechend für die Wände oben und unten. Ich habe jetzt nicht im Detail überlegt, ob das da oben korrekt ist, aber so in der Richtung sieht das aus.

Man könnte vermuten, dass du nun IndexOutOfRangeExceptions bekommen würdest, das sollte aber nicht der Fall sein, da du vorher schon überprüfst, ob du vor einer Wand bist.

int i = Rnd.Next(119); 
int j = Rnd.Next(29);
bool[119, 29] = true;

Da stimmt noch was nicht. Du erzeugst zufällige Koordinaten i und j, nutzt die aber gar nicht, um an den entsprechenden Koordinaten ein Hindernis zu setzen. Da bekommst du vermutlich eine IndexOutOfRangeException, weil die Größe eines Arrays nullbasiert ist und das Element bool[119,29] damit schon außerhalb liegt. Richtig so:

int i = Rnd.Next(119); 
int j = Rnd.Next(29);
bool[i, j] = true;

0
OnlybeAwesome 
Fragesteller
 19.11.2017, 14:12
@Crysali

Wenn ich das so eintrage

int i = Rnd.Next(119);
int j = Rnd.Next(29);
bool[i, j] = true;

funktioniert es die Array größe kann nicht angegeben werden

und ich bekomme 

IndexOutOfRangeExceptions 
wenn ich das 

bool[i, j] = true;
ausklammere 

0
OnlybeAwesome 
Fragesteller
 19.11.2017, 14:24
@OnlybeAwesome

ich hab das oben unverständlich ausgedrückt 

Wenn ich das so eintrage

int i = Rnd.Next(119); 
int j = Rnd.Next(29); 
bool[i, j] = true;

kann ich das Programm nicht ausführen

0

Du solltest vielleicht noch verraten, um welche Sprache es sich handelt, damit wir einschätzen können, was new int[119, 29] sein soll… es könnte auch ein absteigendes eindimensionales Array sein, oder eines, das mit den zwei Zahlen 119 und 29 gefüllt ist.

OnlybeAwesome 
Fragesteller
 17.11.2017, 14:02

und ich erzeuge Hindernisse in dieses Feld 

0

Die Sprache ist C# und das new int [119, 29] ist ein Consolen Feld von der größe 119 29 .

Ich hoffe das hilft

Gastnr007  17.11.2017, 14:09

array[1, 2] sollte funktionieren, wenn nicht, dann array[1][2]

(habe C und C++ programmiert, C# noch nicht | in C und C++ geht array[1][2])

0
OnlybeAwesome 
Fragesteller
 17.11.2017, 15:17
@Gastnr007

Naja das Feld funktioniert ja aber ich möchte die 10 Random generierten ,,Koordinaten'' auslesen lassen

0