# JavaKara Pyramide



## lily (10. Nov 2012)

hallo 

ich habe mit javakara angefangen und versuche gerade eine pyramide zu erstellen, ich finde leider 
nicht den fehler den ich gemacht habe, kara legt zwar mit blättern eine pyramide, aber sie lässt immer
zwischen zwei blätter ein feld frei und ich finde einfach nicht den fehler, ich möchte das kara
eine komplette pyramide legt und keine freiräume lässt.
hoffe ihr könnt helfen, werd langsam schon ganz kirre :autsch:...


public class Pyramide extends JavaKaraProgram 
{
    public void legeBlaetter(int anz)  
    {
       for(int i=0; i<anz; i++)
       {
       if(!kara.onLeaf())
       {
            kara.move();
            kara.putLeaf();
            kara.move();
       }
       }
    }
    public void pyramide(int zeilen)
    {
      for(int i=0; i<zeilen; i++)   
      {
            legeBlaetter(zeilen-i);
      if(i%2==0)
      {
            kara.turnLeft();
            kara.move();
            kara.turnLeft();
            kara.move();
      }
      else
      {
            kara.turnRight();
            kara.move();
            kara.turnRight();
            kara.move();
      }
      }
    }
    public void myProgram() 
    {
            world.clearAll();
            world.setSize(25,15);          
            kara.setPosition(1,14);
            pyramide(11); 
    }
}


lg lily


----------



## Camill (10. Nov 2012)

Ich weiß zwar nicht was die einzelnen Methoden machen aber für mich sieht folgendes "verdächtig" aus:

```
kara.move();
kara.putLeaf();
kara.move();
```

Einer der beiden [c]move()[/c] Aufrufe scheint überflüssig zu sein. Fall dies nicht der Fall ist wäre es sinnvoll weitere beteiligte Klassen zu posten.


----------



## Kevin94 (10. Nov 2012)

Der Hinweis ist doch eigentlich groß genug:
Java™ Quelltext ist bitte in 
	
	
	
	





```
-Tags zu schreiben[/SIZE][/COLOR]

Ansonsten glaube ich kaum, dass deine legeBlätter Methode richtig ist. Du machst es dir mit dem Ansatz das ganze zeilenweise zu legen schwieriger als es ist. Ich hoffe ich hab dich richtig verstanden, das du mit einer Pyramide so was meinst:
[CODE]XXXXXXXXX
X       X
X XXXXX X
X X   X X
X X X X X
X X   X X
X XXXXX X
X       X
XXXXXXXXX
```
Dann würde ich dir empfehlen das ganze in Kreisen abzulaufen. Erst der Äusere kreis, dann nach innen laufen, nächster Kreis, solange bis der Kreis nur noch 1 bis 4 Blätter groß ist.


----------



## lily (10. Nov 2012)

also so sieht meine pyramide aus







so sieht die pyramide oder eher tannenbaum  aus wenn das "move" unten stehen bleibt







und wenn das "move" oben stehen bleibt, ist keine pyramide zu erkennen :noe:


was meinst du genau mit klassen?


----------



## lily (10. Nov 2012)

sorry

```
public class pyramide extends JavaKaraProgram 
{
    public void legeBlaetter(int anz)  
    {
       for(int i=0; i<anz; i++)
       {
       if(!kara.onLeaf())
       {
            kara.move();
            kara.putLeaf();
            kara.move();
       }
       }
    }
    public void pyramide(int zeilen)
    {
      for(int i=0; i<zeilen; i++)   
      {
            legeBlaetter(zeilen-i);
      if(i%2==0)
      {
            kara.turnLeft();
            kara.move();
            kara.turnLeft();
            kara.move();
      }
      else
      {
            kara.turnRight();
            kara.move();
            kara.turnRight();
            kara.move();
      }
      }
    }
    public void myProgram() 
    {
            world.clearAll();
            world.setSize(25,15);          
            kara.setPosition(1,14);
            pyramide(11); 
    }
}
```


nee ich muss eine pyramide erstellen die von vorne zusehen ist,keine vogelperspektive


----------



## lily (10. Nov 2012)

leider hab ich den blöden fehler immer noch nicht entdeckt ;( ???:L


----------



## timbeau (10. Nov 2012)

Dir ist aber schon klar, dass du keine symmetrische Pyramide hinkriegst, wenn du pro Zeile nur 1 Blatt weniger zeichnest?


----------



## lily (10. Nov 2012)

und hast du zufällig einen vorschlag wie ich eine symetrische pyramide machen kann?


----------



## timbeau (10. Nov 2012)

immer 2 weniger Zeichnen.

11 -> 9 ->... ->1


----------



## hüteüberhüte (10. Nov 2012)

lily hat gesagt.:


> also so sieht meine pyramide aus



Sieht doch hübsch aus.:


```
for (int i = 0; i < 10; i++) {
  for (int j = 0; j < i * 2 + 1; j++) { // 1x, 3x, 5, 7 usw.
    legeBlatt();
    geheVor();
  }
  geheInDieNächsteReiheZumAnfang();
}
```


----------



## lily (10. Nov 2012)

und kannst du mir das bitte etwas genauer erklären, bin tiefster anfänger , wo genau und was genau muss ich jetzt einsetzen oder korrigieren...???:L

ok ich war zu voreilig sorry


----------



## Volvagia (10. Nov 2012)

Also willst du einfach nur die Zwischenräume entfernen? Versuch mal das. Kara ist bei mir nicht angesprungen, deshalb hab ich mir einfach etwas eigenes mit gleichsignaturigen Methoden geschrieben. Allerdings kenn ich dir keine Garantie geben, dass ich es richtig implementiert habe und es so auch bei dir läuft.


```
import java.awt.EventQueue;

public class Pyramide extends MyKaraLikeImpl {
	private void legeBlaetter(int anz) {
		for(int i = 0; i < anz; i++) {
			if(!onLeaf()) {
				putLeaf();
				
				if(i != anz - 1) { //Am letzten Blatt nicht noch mal ziehen.
					move();
				}
			}
		}
	}
	private void buildPyramide(int zeilen) {
		for(int i = 0, zeilenAnzahl = ((zeilen - 1) * 2) + 1; i < zeilen; i++, zeilenAnzahl-= 2) {
			legeBlaetter(zeilenAnzahl);
			if(i%2 == 0) {
				turnLeft();
				move();
				
				if(i != zeilen - 1) { //In der letzten Zeile darf er nicht 1 Feld weiter ziehen
					turnLeft();
					move();
				}
			} else {
				turnRight();
				move();
				
				if(i != zeilen - 1) { //Dito
					turnRight();
					move();
				}
			}
		}
    }
	protected void myProgram() {
		clear();
		setWorldSize(25, 25);
		setPosition(1,14);
		buildPyramide(3);
	}
	public static void main(String[] args) {
		final Pyramide program = new Pyramide();
		
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				program.startup();				
			}
		});
	}
}
```

Hier meine Superklasse, falls du sie willst


```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.util.LinkedList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyKaraLikeImpl {
	private static enum ViewDirectory {
		NORTH {
			public void move(Point d) {
				d.y--;
			}
			public ViewDirectory turnLeft() {
				return WEST;
			}
			public ViewDirectory turnRight() {
				return EAST;
			}
		},
		SOUTH {
			public void move(Point d) {
				d.y++;
			}
			public ViewDirectory turnLeft() {
				return EAST;
			}
			public ViewDirectory turnRight() {
				return WEST;
			}
		},
		WEST {
			public void move(Point d) {
				d.x--;
			}
			public ViewDirectory turnLeft() {
				return SOUTH;
			}
			public ViewDirectory turnRight() {
				return NORTH;
			}
		},
		EAST {
			public void move(Point d) {
				d.x++;
			}
			public ViewDirectory turnLeft() {
				return NORTH;
			}
			public ViewDirectory turnRight() {
				return WEST;
			}
		};
		
		
		/**
		 * Verändert Eigenschaften des Parameters!!!
		 * @param d
		 * @return
		 */
		public abstract void move(Point d);
		public abstract ViewDirectory turnLeft();
		public abstract ViewDirectory turnRight();
	};
	
	private static final int OBJECT_SIZE = 20;
	
	private Point location;
	private Dimension worldSize;
	private ViewDirectory viewDirectory;
	private List<Leaf> leafs;
	
	public MyKaraLikeImpl() {
		location = new Point(0, 0);
		viewDirectory = ViewDirectory.EAST;
		leafs = new LinkedList<Leaf>();
		worldSize = new Dimension(0, 0);
	}
	protected boolean onLeaf() {
		for(Leaf leaf:leafs) {
			if(leaf.getX() == location.x && leaf.getY() == location.y) {
				return(true);
			}
		}
		return(false);
	}
	protected void putLeaf() {
		leafs.add(new Leaf(location));
	}
	protected void move() {
		viewDirectory.move(location);
	}
	protected void turnLeft() {
		viewDirectory = viewDirectory.turnLeft();
	}
	protected void turnRight() {
		viewDirectory = viewDirectory.turnRight();
	}
	protected void clear() {
		leafs.clear();
	}
	protected void setPosition(int x, int y) {
		location.x = x;
		location.y = y;
	}
	protected void setWorldSize(int w, int h) {
		worldSize.width = w;
		worldSize.height = h;
	}
	protected void startup() {
		myProgram();
		
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JPanel drawPanel = new JPanel() {
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				
				g.setColor(Color.RED);
				for(Leaf leaf:leafs) {
					g.drawOval(leaf.getX() * OBJECT_SIZE, leaf.getY() * OBJECT_SIZE, OBJECT_SIZE, OBJECT_SIZE);
				}
				
				g.setColor(Color.RED);
				g.drawRect(location.x * OBJECT_SIZE, location.y * OBJECT_SIZE, OBJECT_SIZE, OBJECT_SIZE);
			}
		};
		frame.add(drawPanel);
		
		frame.setSize(worldSize.width * OBJECT_SIZE, worldSize.height * OBJECT_SIZE);
		frame.setVisible(true);
	}
	
	protected void myProgram() {}

	private final static class Leaf {
		private final int x;
		private final int y;
		
		public Leaf(Point p) {
			this(p.x, p.y);
		}
		public Leaf(int x, int y) {
			this.x = x;
			this.y = y;
		}
		
		public int getX() {
			return x;
		}
		public int getY() {
			return y;
		}
	}
}
```


----------



## hüteüberhüte (10. Nov 2012)

lily hat gesagt.:


> und kannst du mir das bitte etwas genauer erklären, bin tiefster anfänger , wo genau und was genau muss ich jetzt einsetzen oder korrigieren...???:L
> 
> ok ich war zu voreilig sorry



Also 1 und 1 zusammenzählen kannst du doch wohl noch... Die Methoden mit ähnlichen Bezeichnern wie in meinem Beispiel sind entweder bereits vorgegeben oder können direkt ihren Bezeichnern nach implementiert werden. Oder anders gesagt antworte ich ohne ein Danke auch nicht mehr.


----------



## Pentalon (10. Nov 2012)

Schaut aus wie Logo mit einem Marienkäfer 

Pentalon


----------



## lily (10. Nov 2012)

jetzt sei nicht so, von mir kriegen alle n dankeschön, muss mich doch auch erst auf der seite zurechtfinden und schaun wie das hier so läuft...

bin für jede hilfe dankbar


----------



## lily (10. Nov 2012)

> ```
> geheInDieNächsteReiheZumAnfang();
> ```




ich habs versucht aber bei dem satz: cannot find symbol...???:L


----------



## lily (10. Nov 2012)

hab das programm ausprobiert, leider funktioniert es nicht :noe:,
ich danke dir trotzdem.


----------



## hüteüberhüte (10. Nov 2012)

lily hat gesagt.:


> ich habs versucht aber bei dem satz: cannot find symbol...???:L




```
kara.move
if (i % 2 == 0) {
  kara.turnRigt
  kara.move
  kara.turnRigt
} else {
  kara.turnLevt
  // etc.
}
```

Lg

Gesendet mit Tapatalk 2


----------

