Methoden Zweidimensionaler Array mit Setter Methode ändern

Michael P.

Mitglied
Hallo Zusammen,

ich bin ein Neuling in Java und bin gerade dabei einen Konsolenwanderer zu programmieren.
ich suche vergeblich nach einer Lösung, jedoch spezifisch in Bezug auf mein Problem habe ich Nichts gefunden. Ich würde mich freuen, wenn ich hier eine Hilfestellung bekommen würde.

Das Feld habe ich in der Klasse "Field" als private String[][] Array (Feldgröße 10x10) und mit geschachtelter for-Schleife erstellt.

Das Programm lautet in der Field Klasse:

___________________________________________________________________________________________________________________________
public class Field {

private String[][] field = {{"#", "#", "#", "#", "#", "#", "#", "#", "#", "#"},
{"#", " ", " ", " ", " ", " ", " ", " ", " ", "#"},
{"#", " ", " ", " ", " ", " ", " ", " ", " ", "#"},
{"#", " ", " ", " ", " ", " ", " ", " ", " ", "#"},
{"#", " ", " ", " ", " ", " ", " ", " ", " ", "#"},
{"#", " ", " ", " ", " ", " ", " ", " ", " ", "#"},
{"#", " ", " ", " ", " ", " ", " ", " ", " ", "#"},
{"#", " ", " ", " ", " ", " ", " ", " ", " ", "#"},
{"#", " ", " ", " ", " ", " ", " ", " ", " ", "#"},
{"#", "#", "#", "#", "#", "#", "#", "#", "#", "#"}};

public void fieldShow() {

for(int i = 0; i < field.length; i++) {
for(int j = 0; j < field.length; j++) {
System.out.print(field[j]);
}
System.out.println();
}
}

public String[][] getField() {
return field;
}

public void setField(String[][] field) {
this.field = field;
}
___________________________________________________________________________________________________________________________

und jetzt möchte ich das 2-dimensionale Array verändern, indem ich nur an einer bestimmte Stelle von String Array das Zeichen ändere.
Ich habe auch eine Klasse namens "Player" erstellt und speicherte die Strings Variablen mit Pfeilen ab, worauf ich dann im Folgenden auf das Spielfeld zugreifen kann.

___________________________________________________________________________________________________________________________
public class Player {

private String oben = "^";
private String unten = "v";
private String rechts = ">";
private String links = "<";

Player() {

}

public String getOben() {
return oben;
}

public String getUnten() {
return unten;
}

public String getRechts() {
return rechts;
}

public String getLinks() {
return links;
}
}
___________________________________________________________________________________________________________________________

ich würde gerne wissen, wie ich in der Main Methode das Feld als 2-dimensionaler Array beliebig ändern kann.
Ich hätte an so etwas gedacht:

___________________________________________________________________________________________________________________________

public class Program {

public static void main(String[] args) {

Field fieldGame = new Field();
fieldGame.fieldShow();

Field fieldHigh = new Field();
fieldHigh.getField();

fieldHigh.setField(field[4][4] = "v");
// Ich möchte in der 5. Zeile und in der 5. Spalte dieses Zeichen "^" einfügen.
// Oder in der bestimmten Zeile den String in der "Player" Klasse einfügen.


System.out.println();

}
}
___________________________________________________________________________________________________________________________

Ich habe es auf viele verschiedenen Methoden probiert, jedoch bekomme ich es einfach nicht hin. Zwar habe ich auch die ganze Lösung wie man den Konsolenwanderer programmiert, aber ich möchte das Lösungsvideo nicht anschauen, weil ich es selber ausprobieren möchte =)

Ich hoffe ich habe meine Problematik richtig erklärt und hoffe auf eine Antwort.

Freundliche Grüße

Michael P.
 
fieldHigh.setField(field[4][4] = "v");
Hah, du bist so nahe d'ran an der Loesung...

Java:
public void setField(int x, int y, String value) {
    field[x][y] = value;
}

Oder alternativ, da Arrays alle als Referenzen herumgereicht werden:"

Java:
field.getField()[4][4] = "v"

Wobei erste Variante vermutlich besser waere.
 
Ich würde vorschlagen, den Stil noch einmal zu überdenken.

Gerade solche einfachen Aufgaben helfen, sich in die Gedankenwelt der OOP reinzudenken. Und dies macht das Programmieren nachher bei größeren Projekten leichter.

Ich nehme mal an, das Ziel des Programmes it: Führe einen Wanderer über ein Spielfeld und er soll nur dahin einen Schritt gehen, wohin er blickt.

Wenn ich das analysiere, hast du ein Feld, einen Wanderer und einen Player.

Ich würde jetzt z.B. schreiben:

Java:
public class Wanderer{
    
    public static main() {
        Field playground= new Field();
        Walker man = new Walker(5,5,"<");
        playground.showGround(man);
    }
}

Ich kann also schreiben:
Java:
public class Walker{

 private int xpos;
 private int ypos;
 private String direction;
    
    public Walker(int x, inty, int d){
        xpos=x;
        ypos=y;
        direction=d; //stimmt nicht hundertprozentig, weil es ein String ist       
    }
    
    public readX(){
        return xpos;
    }
    
    public readY(){
        return ypos;
    }
    
    public readDirection(){
        return direction;
    }

//   public void gotoWest(){


}

Der Sinn hier ist, dass ich alle "Setter" weggemacht habe. Wieso? Es gibt im Spielverlauf nicht eine Situation, in der ich einen der drei Wert direkt eingeben muss. Entweder es gibt den Befehl: "Drehe dich um 90 Grad", oder "Gehe in die Richtung". Ich habe auch "Getter" vermieden, weil die meist nicht das Richtige aussagen.

Nun zum Feld:


Java:
public class Payground{
    
    public void showGround(Walker w){
    
        int i;
        int j;
        int height=w.readX();
        int weight=w.readY();
        for (i=0;i<10;i++){
            for(i=0;i<10;i++){
                if(i==height)&&(j==weight)
                    print(w.readDirection();
                else         
                    print ".";
            }
            println();
        }
    }
}

Hier ist es so, dass sich das Feld selbst darstellt, und dazu auch weiß, wo der Wanderer(Walker) steht, und auch diesen darstellt. Es ist im Weiteren hilfreich, wenn man die Darstellung des Wanderers auch so umbaut, dass der Wanderer die Richtung als "north, south, east und west " übergeben bekommt, aber in der Klasse Wanderer in einer Funktion das Symbol zurückgegeben wird, das die Richtung ausdrückt.

Dann wären eben alle Sachen, die den Wanderer angehen, auch in der Klasse Wanderer zusammengefaßt.
 
Vielen lieben Dank für eure Hilfe =)

Adressiert an Robert Zenz

public void setField(int x, int y, String value) {
field[x][y] = value;
}

Die Methode, die du mir empfohlen hast, habe ich in der Feld Klasse eingetippt und in der Main Methode...

fieldHigh.setField(4, 4, "v");

System.out.println();

... die beiden Integer (für die Stelle) und für den String die Bezeichnung "v" angewendet. Es kam auch keine Fehlermeldung, jedoch wollte ich es auf der Konsole abspielen lassen, aber der Wanderer im Feld war nicht zu sehen.

Muss ich auf etwas achten, wenn ich das bearbeitete Feld (durch Setter) auf der Konsole ausgeben möchte?



Adressiert an AndiE

Vielen Dank für den Stil der Programmierung, die du mir anschaulich gezeigt hast. Ich müsste es mir noch genauer anschauen. Aber so wie du es programmiert hast, habe ich es mir auch vorgenommen zu programmieren.
Aber das ist gerade das Schwierige bei der Programmierung für mich, mich mit den ganzen Informationen die man lernt auseinanderzusetzen und diese Informationen dann wiederrum umzusetzen.
 

Neue Themen


Zurück
Oben