Ich möchte die Daten aus meiner 2D Array Schleife auslesen ist das möglich und wie?
char hSymbol = '#';
int[,] array = new int[119, 29];
Random Rnd = new Random();
int hz = 0;
do
{
int i = Rnd.Next(119);
int j = Rnd.Next(29);
Console.SetCursorPosition(i, j);
Console.Write(hSymbol);
hz++;
} while (hz < 10);
Hier brauche ich praktisch die 10 Random generierten Arrays
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.
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.
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 ^^
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.
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
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)
}
//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
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;
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
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
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.
Die Sprache ist C# und das new int [119, 29] ist ein Consolen Feld von der größe 119 29 .
Ich hoffe das hilft
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])
Naja das Feld funktioniert ja aber ich möchte die 10 Random generierten ,,Koordinaten'' auslesen lassen
Das habe ich auch schon gefunden aber ich kann daraus nicht entnehmen wie ich die 10 Werte unterschiedlich abspeichern kann