Ich habe ein Array erstellt das aus den Objekten meiner Klasse “Figur” bestehen soll.
private Figur[] figuren = new Figur[16];
Dann habe ich das Array mit Objekten vom Typ Figur gefüllt und auch über Methoden getestet ob das Array auch wircklich gefüllt ist. Bis jetzt keine Probleme.
Da ich gelesen habe, dass man möglichst Variablen usw. private halten soll, wollte ich den Zugriff auf bestimmte Elemente des Array so gestalten:
public class Spiel extends Actor
{
public Figur getFigur(int position){
return figuren[position];
}
}```
Wenn ich die Methode jetzt aber aufrufen will (Ich programmiere übrigens noch mit Greenfoot falls das wichtig ist) kommt folgender fehler:
cannot find symbol - method getFigur(int)
Ich rufe die Methode so auf:
```public class Spielfeld extends World
{
public void vorbereiten(){
...
addObject(getFigur(2), 0,0);
}```
Kann mir jemand sagen wo mein Fehler liegt? Vielen Dank im voraus!
Der Fehler liegt darin, dass du eine Methode der Klasse Spiel nicht einfach in einer anderen Klasse SpielFeld aufrufen kannst. Wenn du in SpielFeld eine Variable vom Typ Spiel hast, könntest du meineSpielVariable.getFigur(2) schreiben.
Ist ja auch logisch: Jedes Spiel hat sein eigenes Array, woher sollte SpielFeld “wissen”, welches von denen (potentiell unendlich vielen) gemeint ist?
Hallo, ich habe erneut ein Problem. Ich schreibe es einfach mal hier rein da der Post noch ziemlich weit oben steht vom letzten mal.
Ich möchte ein Brettspiel programmieren und habe dazu auch eine Methode die automatisch die richtige Figur der Computerspieler auswählen soll.
Dazu habe ich unter anderem eine for-Schleife benutzt:
//Figuren dürfen nicht am Start oder im Ziel stehen um bewegt zu werden
if(feld.getFigur(x+i).istAmStart() && feld.getFigur(x+i).istAmZiel() == false){
Greenfoot.delay(4);
System.out.println("X:"+x+" i:"+i+" x+i:"+x+i+""); //Nur zu testzwecken
curFig = feld.getFigur(x+i);
Greenfoot.delay(4);
break;
}
}```
Die Schleife soll verschiedene Figuren aus einem Array überprüfen und wenn die Bedingung erfüllt ist soll sie diese Figur zur aktuellen Figur machen. Die Variable x wird vorher festgelegt.
Allerdings wird im Spiel immer die falsche Figur bewegt, nämlich die, die im Array auf dem nächsten Platz steht.
Eigentlich hatte ich gedacht, dass eine for-Schleife immer erst nach einem Durchlauf den Variablenwert erhöht, aber die Konsolenausgabe zeigt mir etwas anderes:
X:12 i:1 x+i:121 //Hier hatte ich i = 0 gesetzt. Obwohl die Bedingungen aber erfüllt worden sind ist i=1
X:12 i:-1 x+i:12-1 //Hier hatte ich i = -1 gesetzt. Auch hier sind die Bedingungen erfüllt aber jetzt ist i = -1 geblieben und hat sich nicht erhöht
X:4 i:1 x+i:41 // Wieder auf 0 gesetzt und das gleiche Spiel wie am anfang
Die X-Werte sind immer korrekt
Ich komme mir gerade total dämlich vor, dass ich bei so einer einfachen SChleife versage. Wäre nett wenn mir jemand helfen könnte.
Natürlich erhöht sich die Zählervariable erst NACH einem Durchlauf.
Die Konsolenausgabe sagt auch nichts über i aus, da du nicht jeden Wert von i ausgibst. In deinem Beispiel wird die Bedingung für i = 0 einfach nicht erfüllt, daher bekommst du auch keine Ausgabe.
Aber ich weiß, dass die Bedingung direkt beim ersten mal erfüllt wird, ich sehe ja auch wenn istAmStart() und istAmZiel() falsch sind. Daher verstehe ich nicht warum ich zu zwei verschiedenen Ergebnissen komme wenn ich i unterschiedlich setze.
Edit: vllt gucke ich mir die Bedingungsmethoden nochmal an.
Setz doch nochmal ein zusätzliches Sysout in die Schleife, die dir in jedem Durchlauf i ausgibt. Dann solltest du ja sehen wann die Bedingungen zutreffen und wann nicht.
Ich habs jetzt.
Habe genau das gemacht und genau wie du gesagt hast ist die Schleife zwei mal durchgelaufen.
Die if-Bedingung hätte statt “if(feld.getFigur(x+i).istAmStart() && feld.getFigur(x+i).istAmZiel() == false)” so sein müssen: if((feld.getFigur(x+i).istAmStart() == false) && (feld.getFigur(x+i).istAmZiel() == false))
Ich hab gedacht, dass das false am Ende für beide Bedingungen gilt (wie peinlich). Naja, danke für die Hinweise!
Da habe ich ja eine ganz schöne Diskussion losgetreten. Schlussendlich wollte ich nur noch sagen, dass ich jetzt nahezu fertig bin mit meinem Projekt (auch wenn es mit Greenfoot gemacht wurde ;)). Danke für die ganze Hilfe.
Freut uns natürlich.
Dennoch solltest du versuchen zu verstehen warum solche "ide"s einfach nicht gut sind, und dein verständniss negativ beeinträchtigen…