Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Spielfeld in einem Array zeichnen
MisterXY
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

Spielfeld in einem Array zeichnen

beantworten | zitieren | melden

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);
private Nachricht | Beiträge des Benutzers
progger
myCSharp.de - Member

Avatar #avatar-2094.gif


Dabei seit:
Beiträge: 1.271
Herkunft: Nähe von München

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
MisterXY
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

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);
			
		}


private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo MisterXY,

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

herbivore
private Nachricht | Beiträge des Benutzers
progger
myCSharp.de - Member

Avatar #avatar-2094.gif


Dabei seit:
Beiträge: 1.271
Herkunft: Nähe von München

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers
MisterXY
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

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,..
private Nachricht | Beiträge des Benutzers
progger
myCSharp.de - Member

Avatar #avatar-2094.gif


Dabei seit:
Beiträge: 1.271
Herkunft: Nähe von München

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo MisterXY,

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

herbivore
private Nachricht | Beiträge des Benutzers
MisterXY
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

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 ;-)!!!!
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
MisterXY
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
progger
myCSharp.de - Member

Avatar #avatar-2094.gif


Dabei seit:
Beiträge: 1.271
Herkunft: Nähe von München

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers