Laden...

Spielfeld in einem Array zeichnen

Erstellt von MisterXY vor 18 Jahren Letzter Beitrag vor 18 Jahren 7.591 Views
M
MisterXY Themenstarter:in
77 Beiträge seit 2005
vor 18 Jahren
Spielfeld in einem Array zeichnen

Hi,

ich versuche ein Spielfeld zu zeichnen, das bis zu einer bestimmten Reihe jeweils um
ein Feld zunimmt und ab der Mitte jeweil wieder um ein Feld abnimmt.

Nun möchte ich nicht jede Reihe per Hand definieren sondern überlege an irgendeiner
cleveren Schleife. Hat jemand ne Idee??

So würde es gehen ist aber wenig effektiev


//1. Reihe
for (int i = 1; i < 6; i++) {
      g.drawOval(369,55,40,40);

...

//2.Reihe
for(int i = 1; i < 7; i++){
	g.fillOval(329,95,40,40);

1.271 Beiträge seit 2005
vor 18 Jahren

Pseudocode-Beispiel:


Schleife: Alle Reihen durchgehen
  Wenn aktuelle Reihe vor Mitte
    Feldanzahl um eins erhöhen
  Oder nach Mitte
    Feldanzahl um eins verringern
  Ende Wenn
  Schleife: Alle Felder durchgehen
    Irgendwas mit den Feldern machen
  Ende Schleife
Ende Schleife

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

M
MisterXY Themenstarter:in
77 Beiträge seit 2005
vor 18 Jahren

Danke, vom Prinzip ist es mir jetzt klar, aber irgendwie komme ich nicht drauf,...

Vielleicht kannst du mir mit ein wenig Code weiterhelfen. Danke!


                //1. Reihe
		for (int i = 1; i < 6; i++) {
			
			g.setColor(dunkelrot);
			int temp = (350+(abstand_x*i));
			g.fillOval(temp,55,40,40);
			g.setColor(Color.white);
			g.setStroke(new BasicStroke(2.0F));
			g.drawOval((temp-x),(55),40,40);
			
		}
                //2.Reihe
		for (int i = 1; i < 7; i++){
			g.setColor(dunkelrot);
			int temp = (329+(abstand_x*i));
			g.fillOval(temp,95,40,40);
			g.setColor(Color.white);
			g.setStroke(new BasicStroke(2.0F));
			g.drawOval((temp-x),(95),40,40);
			
		}



49.485 Beiträge seit 2005
vor 18 Jahren

Hallo MisterXY,

nimm einfach zwei ineinander geschachtelte Schleifen. That's all.

herbivore

1.271 Beiträge seit 2005
vor 18 Jahren

Original von herbivore
nimm einfach zwei ineinander geschachtelte Schleifen. That's all.

So hatte ich das auch gemeint gehabt.
Äußere Schleife: Reihen durchgehen.
Innere Schleife: Einzelne Felder durchgehen.

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

M
MisterXY Themenstarter:in
77 Beiträge seit 2005
vor 18 Jahren

Ein zweidimensionaler Array funktioniert reicht simpel, wenn Reihen und Spalten übereinstimmen. Aber doch nicht mit unterschiedlicher Anzahl Spalten je Reihen,...

Oder???

Also wüßte jetzt nicht wie,..

1.271 Beiträge seit 2005
vor 18 Jahren

Du kannst statt einem 2dimesnionalen Array auch ein "Array im Array" erstellen:

string[][] test = new string[2][];
test[0] = new string[3];
test[1] = new string[10];

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo MisterXY,

nur mal so: fürs Zeichnen brauchst du kein Array.

herbivore

M
MisterXY Themenstarter:in
77 Beiträge seit 2005
vor 18 Jahren

Das Problem ist das ich in der ersten Zeile im Array 5, in der zweiten Zeile 6 Felder, usw.. benötige, bis zur 5 Zeile, dann sollen die Feler wieder weniger werden,...

Wie soll das denn gehen???

Ich weiß ich keinen Array zum Zeichnen benötige, aber wie soll ich denn sonst 60 Kreise zeichnen bei denen sich die Koordinaten in jeder Zeile und Spalte ändert?

Aber an dieser Stelle möchte ich mich erstmal für eure Hilfe bedanken 😉!!!!

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo MisterXY,

erstens könntest du ein Array benutzen, das so breit ist, wie die breiteste Zeile und die Felder, die du nicht brauchst, einfach leer lassen.

Zweitens hat ja progger schon geschrieben wie du Arrays baust, die in jeder Zeile genau so lang sind, wie du sie brauchst.

Und drittens brauchst du kein Array nur um die Koordinaten zu bestimmen, an die die Kreise gezeichnet werden. Sondern das kriegst du einfach über Koordinatenbrechnung mit Hilfe der Laufvariablen hin. So zeichnet der folgende Code 6 Kreise nebeneinander. Analog geht das mit einer äußeren Schleife für y.


for (int x = 0; x < 6; x++) {
      g.drawOval(369+x*40,55,40,40);
}

herbivore

M
MisterXY Themenstarter:in
77 Beiträge seit 2005
vor 18 Jahren

Es kann sein, dass ich mich vielleicht gerade etwas doof anstelle oder so,...
Aber eure Bemühungen helfen mir bis jetzt noch nicht auf den Sprung. Für die erste Reihe die Kreise zu zeichnen ist ja auch kein Problem und für die zweite Reihe auch noch net, aber dann wirds schwierig.

Vielleicht könnte sich jemand dafür nochmal die Mühe machen und mir den Code für die ersten drei Reihen schreiben,...

So solls mal werden:
http://www.coolmen.ch/abalone/abalone.htm

Danke!

1.271 Beiträge seit 2005
vor 18 Jahren

Wenn die Felder versetzt sind, ist das natürlich was anderes. Ich würds wahrscheinlich so machen:


float aktuellesY=irgendwas;
// Die Anzahl der Felder in der aktuellen Reihe:
int feldAnzahl=5;
// Reihen druchgehen:
for (int i=0; i<9; i++){
    // An welchem x man sich gerade befindet. Anfangs die Stelle, an welcher diese Reihe anfängt:
    float aktuellesX=mitteSpielfeld-feldAnzahl/2.0F*feldBreite;
    // Felder durchgehen:
    for (int j=0;j<feldAnzahl;j++){
        // Feld zeichnen an (aktuellesX|aktuellesY).
        // ...
        aktuellesX+=feldbreite;
    }
    if (i<4){
        feldAnzahl++;
    } else {
        feldAnzahl--;
    }
    aktuellesY+=feldHöhe;
}

Ich hoffe du verstehst, wie das laufen soll. Ich garantiere auch nicht, dass es läuft, ich habs nicht getestet! Bei Problemen sags einfach.
Vielleicht hat auch wer anders ne bessere Idee 😉

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo MisterXY,

diese Frage verleitet mich zu dem wohlmeinenden Ratschlag: Schnapp dir ein Buch und arbeite dich erstmal in (geschachtelte) Schleifen ein.

Ich denke mal die kürzeste und geschlossenste Lösung wäre:


for (int y = 0; y < 9; ++y) {
   for int x = 0; x < 9 - Math.Abs (y - 4); ++x) {
   }
}

herbivore