# Verschönerung



## Nicer (26. Nov 2009)

Hallo 

da ich in meinen Hausaufgaben immer alles sehr schön und vorallem ausgeklügelt und spektakulär machen will frage ich nun mal noch euch ob euch vllt noch was einfällt was man verschönern könnte. Das programm funkt so einwandfrei , die ausgabenstellung ist auch erfüllt  ... und Ja , wir arbeiten grade mit dem Hamstersimulator


```
void LaufBisMauer() {
while(vornFrei()) {
vor();
}
}

void rechtsUm() {
for(int umdrehungen=3; umdrehungen>=1; umdrehungen --) {
linksUm();
}
}

void FrissAlles(){
while(kornDa()){
nimm();
}
}

void LaufeBisZumErstenKorn(){
LaufBisMauer(); 
rechtsUm();
FrissAlles();
vor();
rechtsUm();
}

void main() {
LaufeBisZumErstenKorn();
while(vornFrei()){
if(vornFrei()){
vor();
}
FrissAlles();
linksUm();
if(vornFrei()){
vor();
}
rechtsUm();
}
}
```

Freue mich auf euere Vorschläge


----------



## SlaterB (26. Nov 2009)

- Formatierung, Einrückung?
- ersten Buchstaben von Methoden klein schreiben

- wieso steht bei LaufeBisZumErstenKorn nur einmal FrissAlles(); und zwar genau nach der einen Rechtsdrehung, 
ist denn gesichtert dass an dieser Stelle irgendwas liegt?, soll nicht eher überall alles abgesucht werden?
wieso danach noch Bewegung und am Ende eine Drehung?

- wieso steht in der main
> while(vornFrei()){
> if(vornFrei()){
> vor();
> }
erstens gibts schon extra ne Methode die das machen kann, zweitens ist die auch besser implementiert, 
das if innerhalb der while ist nämlich überflüssig

- Zeile 33 bis 38 sind auch fraglich


----------



## Nicer (26. Nov 2009)

Ya es ist gesichert das da was liegt , es gibt ein Vorgegebenes Territorium 

und die If in der While ist dafür da dass er noch einmal vor dem vor(); prüft ob frei is , den ansonsten rennt er unten bei ungeraden quadratgrößen also 11x11 odda so an die mauer. Die Funktion gibts , aber wir haben die nochnet durchgenommen und wir dürfen nur sachen benutzen die wir bisher gelernt hatten 

MfG Nicer


----------



## SlaterB (26. Nov 2009)

aber die while-Bedingung stellt doch schon sicher, dass es frei ist,
wenn dem nicht so wäre, müsstest du ja in

```
void LaufBisMauer() {
  while(vornFrei()) {
    vor();
  }
}
```
auch das if einbauen, entweder oder, zwei unterschiedliche Version ist das schlechtest-mögliche,
zwei gleiche Versionen sind auch noch eher schlecht,
am besten nur eine Version und von der main-Methode die andere Methode aufrufen statt den Code zu wiederholen

------

> Ya es ist gesichert das da was liegt , es gibt ein Vorgegebenes Territorium

kann man so lassen, aber du weißt eigentlich zu Beginn der Untermethode gar nicht, wo sich der Hamster befindet,
darf nur von einer bestimmten Menge Positionen aus aufgerufen werden, unschön


----------



## Nicer (26. Nov 2009)

Ja aber das problem liegt ja dass er :

checkt ob frei is
alle anweisungen macht

checkt ob frei is
alle anweisungen macht
 usw...

er soll aber vorm vorgehen nochmal schauen dasses frei is denn ansonsten läuft er wiegesagt bei ungeraden Quadratgrößen wie 11x11 gegen die mauer.

edit :

ich lasse dem hamster erst nach oben laufen , ich bin grade dran ihn nach oben links laufen zu lassen dass er auf jeden fall im linken oberen eck steht.


----------



## SlaterB (26. Nov 2009)

gut dass du nochmal dasselbe wiederholt hast,
ich kann dir nur versichern, dass das so falsch ist, alles weitere musst du selber entscheiden, wenigstens ausprobieren (ob es z.B. je zu diesem Problem kommt)


----------



## Nicer (26. Nov 2009)

"falsch" ist es sicher nicht denn es funktioniert so zu 100% ... aber naja danke für deine Hinweise , ich setz mich heute nochmal dran mal schauen was da bei rauskommt


----------



## SlaterB (26. Nov 2009)

stimmt, falsch im Sinne von unnötig, Schaden macht es nicht


----------



## Nicer (26. Nov 2009)

so ich hab das mal so gemacht wie dus geschrieben hast also ohne die if in der while und das kommt dabei raus :








```
void main() { // Hauptprozedur
 laufeBisZumErstenKorn();
  while(vornFrei()){ // While Schleife die alles einsammelt
    vor();         
   
  frissAlles();
  linksUm();
    vor();         
  rechtsUm();
 }
}
```

so habbichs gemacht , habbich nu was falsch gemacht ? wenn das hier das ist wie du meinst dann funtzt das nich ...

edit : 
das problem ist dass ich 2x vor in der while mache und dasser vor dem 2ten vor nicht schaut ob vorn frei ist. das erste mal könnte ich es weglassen aber vorm 2ten mal MUSS ich es machen ansonsten rennt er mir gegen die mauer


----------



## SlaterB (26. Nov 2009)

beim zweiten Mal gerne, hatte die while-Schleife zusammen mit dem ersten vor() als eine Einheit gesehen,
so ist auch mein Punkt 'wieso nicht LaufBisMauer() aufrufen?' Geschichte, durch den längeren while-Block ist das ja eine neue struktor


----------



## Nicer (26. Nov 2009)

Yop , ich hab nu die erste if rausgenommen, weil ja direkt vor dem vor gecheckt wird ob vorne frei ist , aber vorm 2ten mussichs lassen 

aber vielen dank für deine Hilfe ^^

edit : 

mein fertiger code sieht nun so aus :


```
/*
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* XXXXXX XXXXXX schrieb diese Datei. Solange Sie diesen Vermerk nicht entfernen,
* können Sie mit der Datei machen, was Sie möchten. Wenn wir uns eines Tages treffen
* und Sie denken, die Datei ist es wert, können Sie mir dafür ein Bier ausgeben. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*/



private void laufBisMauer() { // Prozedur zum Laufen bis zur nächsten Mauer
 while(vornFrei()) {
  vor();
 }
}

private void rechtsUm() { // Prozedur um den Hamster nach Rechts zu drehen
 for(int linksdrehung=3; linksdrehung>=1;linksdrehung --) {
  linksUm();
 }
}

private void frissAlles() { // Prozedur um alle Körner zu fressen
 while(kornDa()){
  nimm();
 }
}

private void umdrehen() { // Prozedur um den Hamster umzudrehen
 for(int umdrehungen=2; umdrehungen>=1; umdrehungen --) {
  linksUm();
 }
}

private void laufeBisZumErstenKorn() { // Prozedur zum Laufen bis zum ersten Korn ( zur verschönerung der void main )
 laufBisMauer(); // Sicherstellen dass der
 linksUm();      // Hamster oben links
 laufBisMauer(); // Steht
 umdrehen();
 frissAlles();
 vor();
 rechtsUm();
}

void main() { // Hauptprozedur
 laufeBisZumErstenKorn();
  while(vornFrei()){ // While Schleife die alles einsammelt
   vor();
   frissAlles();
   linksUm();
    if(vornFrei()){ // Check dass der Hamster bei ungeraden Territorium Längen und Breiten ( z.B. 11x11 ) 
     vor();          // nicht gegen die wand rennt
    }
   rechtsUm();
  }
}
```


----------

