Java-Datei refaktorieren

actlyc

Mitglied
Hallo java-forum,

ich würde gerne meinen Quellcode in verschieden Klassen refaktorieren, sprich aufräumen. Komme jedoch nicht wirklich weiter. Der Code soll aus drei Teilen bestehen.

1.Sokoban
In diesem Part möchte ich die main-Methode einbringen. Dieser soll auf 2.Player und 3.Level zugreifen können.
2.Player
Hier möchte ich mit einer move-Methode alle auf den Spieler bezogenen Informationen unterbringen.
3.Level
Hier soll das Level (.txt Datei) geladen werden.

Mein Ansatz:
Ich habe den Quellcode mit den jeweils relevanten Bereichen in eigene Klassen geteilt, ohne was am Quellcode zu verändern. Habe es aber nicht geschafft, dass die main-Methode auf die anderen Klassen zugreifen kann.

Würde mich über jeden Ansatz freuen.
MfG


Quellcode:
Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;

/**
* This class is the second part for the Sokoban game
*
* @author Jane Doe 1234567 Group 42h
* @author John Doe 1234567 Group 42h
*/
class Sokoban {

    private final static int X = 0;
    private final static int Y = 1;

    private final static char WALL = '#';
    private final static char PLAYER = '@';
    private final static char BOX = '$';
    private final static char GOAL = '.';
    private final static char PLAYER_ON_GOAL = '+';
    private final static char BOX_ON_GOAL = '*';
    private final static char FREE = ' ';

    private final static int[] UP = {0, -1};
    private final static int[] DOWN = {0, 1};
    private final static int[] LEFT = {-1, 0};
    private final static int[] RIGHT = {1, 0};

    private static char[][] room;
    private static int freeBox;
    private static int emptyGoal;

    private static int[] size = {-1, 0};
    private static int[] player;

    /**
     * Loads the level from the "file" and validate it
     *
     * @param file path to the file
     * @return false iff an error occurs or the level is invalid, true otherwise
     */
    private static boolean loadLevel(String file) {
        BufferedReader bufferedReader;
        try {
            bufferedReader = Files.newBufferedReader(Paths.get(file));
            bufferedReader.mark(100 * 100);
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                size[Y]++;
                if (size[X] > -1 && size[X] != line.length()) {
                    return false;
                } else {
                    size[X] = line.length();
                }
            }

            bufferedReader.reset();
            room = new char[size[Y]][];

            int i = 0;
            while ((line = bufferedReader.readLine()) != null) {
                room[i] = new char[line.length()];
                for (int j = 0; j < line.length(); j++) {
                    room[i][j] = line.charAt(j);
                }
                i++;
                // oder room[i++] = line.toCharArray();
            }
            bufferedReader.close();
        } catch (IOException e) {
            return false;
        }

        for (int i = 0; i < room.length; i++) {
            for (int j = 0; j < room[i].length; j++) {
                switch (room[i][j]) {
                    case FREE:
                    case BOX_ON_GOAL:
                    case WALL:
                        break;
                    case PLAYER_ON_GOAL:
                        emptyGoal++;
                    case PLAYER:
                        if (player != null) {
                            return false;
                        } else {
                            player = new int[]{j, i};
                        }
                        break;
                    case BOX:
                        freeBox++;
                        break;
                    case GOAL:
                        emptyGoal++;
                        break;
                    default:
                        return false;
                }
            }
        }
        return !(player == null || emptyGoal != freeBox);
    }

    /**
     * Prints the level to the output stream
     */
    private static void printLevel() {
        for (char[] row : room) {
            System.out.println(row);
        }
    }

    /**
     * Function for vector addition
     *
     * @param first  first vector
     * @param second second vector
     * @return new vector = first + second
     */
    private static int[] add(int[] first, int[] second) {
        return new int[]{first[X] + second[X], first[Y] + second[Y]};
    }

    /**
     * Game logic for Sokoban
     *
     * @return true if the level was solved, otherwise false
     */
    private static boolean game() {
        // create new Scanner that reads from console
        Scanner input = new Scanner(System.in);

        // flag if we quit the program
        boolean run = true;
        int[] direction;
        do {
            printLevel();
            System.out.println("Do you want to go up, down, left, right or exit the program?");

            // check which command was chosen and execute it
            switch (input.next()) {
                case "w":
                case "up":
                    direction = UP;
                    break;
                case "s":
                case "down":
                    direction = DOWN;
                    break;
                case "a":
                case "left":
                    direction = LEFT;
                    break;
                case "d":
                case "right":
                    direction = RIGHT;
                    break;
                case "exit":
                    run = false;
                    continue;
                default: // if the user input is not one of our commands print help
                    System.out.println("Command unknown! Please type up, down, left or right to move or exit to quit this program");
                    continue;
            }

            if (!move(direction)) {
                System.out.println("You can not go there!");
            }
        } while (run && emptyGoal != 0 && freeBox != 0);
        return run;
    }

    /**
     * Makes a move
     *
     * @param direction as a vector
     * @return true iff it was successful, otherwise false
     */
    private static boolean move(int[] direction) {
        int[] next = add(player, direction);

        switch (room[next[Y]][next[X]]) {
            case BOX_ON_GOAL:
            case BOX:
                int[] behind = add(next, direction);
                if (!(room[behind[Y]][behind[X]] == FREE || room[behind[Y]][behind[X]] == GOAL)) {
                    return false;
                }

                if (room[next[Y]][next[X]] == BOX_ON_GOAL) {
                    emptyGoal++;
                    freeBox++;
                }

                if (room[behind[Y]][behind[X]] == GOAL) {
                    room[behind[Y]][behind[X]] = BOX_ON_GOAL;
                    emptyGoal--;
                    freeBox--;
                } else {
                    room[behind[Y]][behind[X]] = BOX;
                }

                if (room[next[Y]][next[X]] == BOX_ON_GOAL) {
                    room[next[Y]][next[X]] = GOAL;
                } else {
                    room[next[Y]][next[X]] = FREE;
                }
            case GOAL:
            case FREE:
                if (room[player[Y]][player[X]] == PLAYER_ON_GOAL) {
                    room[player[Y]][player[X]] = GOAL;
                } else {
                    room[player[Y]][player[X]] = FREE;
                }

                player = next;

                if (room[player[Y]][player[X]] == FREE) {
                    room[player[Y]][player[X]] = PLAYER;
                } else {
                    room[player[Y]][player[X]] = PLAYER_ON_GOAL;
                }
                return true;
            default:
                return false;
        }
    }

    /**
     * The Main method for the Sokoban game with contains all of the game logic
     *
     * @param args args[0] the path to the level
     */
    public static void main(String[] args) {
        String file = "sokoban.txt";
        if (args.length > 0) {
            file = args[0];
        }
        if (!loadLevel(file)) {
            System.err.println("Level has an invalid format");
            return;
        }
        if (game()) {
            System.out.println("Yeah you have solved the level :)");
        } else {
            System.out.println("You have not solved the level :(");
        }
        printLevel();
        System.out.println("Goodbye");
    }
}
 

VfL_Freak

Top Contributor
Moin,

habe den Code nur flüchtig gelesen, denn ich verstehe Deine Frage nicht! :eek:

Möchtest Du jetzt auch der einen geposteten Klasse drei Klassen machen??
Funktioniert denn der geposte Code??

Gruß Klaus
 

actlyc

Mitglied
Ja genau :)
Der gepostete Code funktioniert einwandfrei und ist ne Musterlösung. Möchte hier einen Ansatz und das später auf meinen eigenen Code anwenden :)
 

AndiE

Top Contributor
Wenn du mit mehreren Objekten arbeitest, dann:

1. musst du die Objekte aus Klassen mit der new-Anweisung erzeugen, und kannst danach auf die darin liegenden Methoden zugreifen.
2. sollte die main()-Nethode die einzige Methode mit "static" sein, weil sie der Einstiegspunkt in das Programm ist. In ihr werden üblicherweise auch die Objekte erzeugt. Und der Programmablauf gestartet.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
B von Java/Eclipse verwendete Datei existiert gar nicht? Java Basics - Anfänger-Themen 6
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
S In Datei schreiben in Java? Java Basics - Anfänger-Themen 1
A Verarbeiten einer Excel Datei durch das java-Programm Java Basics - Anfänger-Themen 3
nbergmann Installation unter jdk.java.net: Keine ZIP-Datei zum entpacken Java Basics - Anfänger-Themen 2
Kotelettklopfer Sqlite DB aus Java Datei ansprechen. Java Basics - Anfänger-Themen 147
L Java erstellt leere Datei Java Basics - Anfänger-Themen 8
W Java in Exe Datei umgewandelt, Ressourcen fehlen (Bilder und Audiodateien) Java Basics - Anfänger-Themen 1
N Java CSV Datei auslesen Java Basics - Anfänger-Themen 6
S Verbindung von einer Excel Datei zu Java-- Java Basics - Anfänger-Themen 4
M Java: BufferedReader liest nur die Hälfte der Text-Datei. Java Basics - Anfänger-Themen 4
J Java Datei als exe weitergeben Java Basics - Anfänger-Themen 3
A .txt-Datei mit Java speichern Java Basics - Anfänger-Themen 2
M Java Mysql ausführbare datei Java Basics - Anfänger-Themen 7
alkaA Intellij Java Datei aus nicht Projekt ausführen? Java Basics - Anfänger-Themen 2
L Wie kann man fehlerfrei im Java Code auf die fxml Datei zugreifen? Java Basics - Anfänger-Themen 26
K Schlüsselworte Nach Java update findet mdb Datei nicht Java Basics - Anfänger-Themen 6
diqqerrr Java Datei als .exe ausführen Java Basics - Anfänger-Themen 8
T class Datei auslesen Java Java Basics - Anfänger-Themen 5
M Java Programm über Batch-Datei ausführen Java Basics - Anfänger-Themen 1
M In einer Datei schreiben - Java Java Basics - Anfänger-Themen 3
O Javac findet die .java datei nicht Java Basics - Anfänger-Themen 2
F PDF Datei in Java einbinden Java Basics - Anfänger-Themen 22
S .java Datei in java Datei ausführen Java Basics - Anfänger-Themen 9
J Java Datei lässt sich nicht kompilieren Java Basics - Anfänger-Themen 3
J Java - Abspielen einer wav Datei Java Basics - Anfänger-Themen 2
L Java Text datei nur bis zu einem Punkt auslesen? Java Basics - Anfänger-Themen 3
I Klassen Mehrere Java Klassen in einer .java Datei Java Basics - Anfänger-Themen 7
1 Im Java Projekt eine txt datei einbinden? Java Basics - Anfänger-Themen 8
J Eingabeaufforderung stürzt ab (beim Ausführen einer Java-Datei) Java Basics - Anfänger-Themen 3
D Lesen aus Datei (java.util.NoSuchElementException) Java Basics - Anfänger-Themen 22
G Input/Output CSV-Datei über Java-Programm erstellen, Zeichensalat Java Basics - Anfänger-Themen 3
Z Java txt Datei erstellen lassen Java Basics - Anfänger-Themen 6
0 Über CMD die JAVA Datei ausführen? möglich? Java Basics - Anfänger-Themen 8
M Java Datei soll sich selbst löschen Java Basics - Anfänger-Themen 8
M Datei starten mit Java Java Basics - Anfänger-Themen 3
B Datei in Java einlesen Java Basics - Anfänger-Themen 13
D java Datei ausführen? Java Basics - Anfänger-Themen 4
Fab1 alte Java Datei wird ausgeführt (trotz Änderung) Java Basics - Anfänger-Themen 4
M Java-Datei in Ordner Kopieren Java Basics - Anfänger-Themen 12
S .jar/java Datei ausführen Windows 7 64bit?! Java Basics - Anfänger-Themen 7
E Java Datei erstellen? :) Java Basics - Anfänger-Themen 3
U Java datei ausführen[Fehler] Java Basics - Anfänger-Themen 5
M Datei in java Öffnen Java Basics - Anfänger-Themen 9
P .class Datei direkt starten (optional Java Datei direkt starten) Java Basics - Anfänger-Themen 13
P Java Datei ohne Netbeans ausführen Java Basics - Anfänger-Themen 7
U neue Java-Datei öffnen Java Basics - Anfänger-Themen 10
S JTabbedPane jeder Tab in einer eigenen java Datei? Java Basics - Anfänger-Themen 3
A CMD findet die java.class Datei nicht Java Basics - Anfänger-Themen 46
Maxim6394 Java Datei ausführen Java Basics - Anfänger-Themen 9
D Input/Output Zeilen aus txt-datei in Java-Liste einfügen Java Basics - Anfänger-Themen 9
H java datei ausführen funktioniert nicht Java Basics - Anfänger-Themen 7
P Java Object das eine HTML Datei repräsentiert Java Basics - Anfänger-Themen 19
E PHP Datei mittels Java aufrufen? Java Basics - Anfänger-Themen 3
L Input/Output Datei in Java einlesen Java Basics - Anfänger-Themen 9
K Klasse in eingener *.java-Datei Java Basics - Anfänger-Themen 5
A Wie mit Java eine .vbs Datei starten lassen? Java Basics - Anfänger-Themen 4
D Java Applet in einer .jar datei Java Basics - Anfänger-Themen 2
U Java .txt datei öffnen Java Basics - Anfänger-Themen 3
achillesat aus .java in ascii datei Java Basics - Anfänger-Themen 12
H java programm per batch datei öffnen Java Basics - Anfänger-Themen 4
K OOP Macro (.vba-Datei) aus Java Java Basics - Anfänger-Themen 2
C Datei kopieren - Erweiterung java.io.File Java Basics - Anfänger-Themen 2
A Java Datei in Applet umwandeln Java Basics - Anfänger-Themen 4
C *.java Datei nach Doppelklick mit VM ausführen Java Basics - Anfänger-Themen 29
Jats Java-Datei mit unbestimmten Variablen Java Basics - Anfänger-Themen 29
3 Eine HTML Datei in eine Java Datei umschreiben Java Basics - Anfänger-Themen 23
W [Java Archive (JAR) Datei erstellen] Lässt sich nicht ausfürhren Java Basics - Anfänger-Themen 7
M java neue datei erstellen Java Basics - Anfänger-Themen 6
P mit java text-datei auslesen und weiter bearbeiten Java Basics - Anfänger-Themen 3
Developer_X Datei downloaden mit Java (.zip) Java Basics - Anfänger-Themen 19
M lokale exe-Datei über Java-Applet starten Java Basics - Anfänger-Themen 4
L Datei aus Java in anderem Programm öffnen Java Basics - Anfänger-Themen 23
N Java Programm soll Datei in eigene jar schreiben Java Basics - Anfänger-Themen 13
X Java txt datei auslesen Java Basics - Anfänger-Themen 10
T Java Webstart soll eine Datei speichern Java Basics - Anfänger-Themen 2
Knizz Java-Datei über cmd öffnen Java Basics - Anfänger-Themen 29
M Datei mit Java für Programm öffnen Java Basics - Anfänger-Themen 10
B Java Datei unter Solaris kompilieren Java Basics - Anfänger-Themen 2
Developer_X Java File listet den Ordner, in dem sich die Datei befindet Java Basics - Anfänger-Themen 7
Developer_X HTML Datei nicht von Java Lesbar Java Basics - Anfänger-Themen 8
H Große Projekte mit Java - Ausführbare Datei Java Basics - Anfänger-Themen 2
M Delphi-Record mit Java aus Datei lesen Java Basics - Anfänger-Themen 11
E Habe java. Datei wie ausführen ? Java Basics - Anfänger-Themen 9
2 Mit Java in eine WORD-Datei schreiben Java Basics - Anfänger-Themen 18
M .java als ausführende Datei Java Basics - Anfänger-Themen 2
Q java.util.loggging neue datei erstellen Java Basics - Anfänger-Themen 3
G *.java Datei mit Editor starten und testen Java Basics - Anfänger-Themen 6
K Java Application mit Batch-datei starten Java Basics - Anfänger-Themen 9
O Text von Homepage via Java auslesen und in Text Datei speich Java Basics - Anfänger-Themen 1
G Datei mit Java anlegen Java Basics - Anfänger-Themen 9
J Ein Java-Programm in eine *.exe Datei 'packen' Java Basics - Anfänger-Themen 20
S Datei mit Java-Applikation an Web-Formular schicken Java Basics - Anfänger-Themen 9
G Datei in Java umbenennen Java Basics - Anfänger-Themen 4
K Wieviele Befehle pro .java Datei Java Basics - Anfänger-Themen 4
K aus Java Programme Jar.datei erstellen (eclipse) Java Basics - Anfänger-Themen 15
H csv datei mit java auslesen und in konsole wiedergeben Java Basics - Anfänger-Themen 22

Ähnliche Java Themen

Neue Themen


Oben