Mein Code is unübersichtlich - besseren Stil

SoulRaiZor

Neues Mitglied
Hallo!
Erstmal ein herzliches Hallo von mir, denn ich bin neu ;)
Ich habe mich nun mithilfe einer Youtube Videoreihe in 2 Tagen so fit in Java gemacht, dass ich einfache Sachen bereits programmieren kann.
Ich habe auch bereits ein funktionierendes Tic Tac Toe Spiel entwickelt, jedoch sieht mein Code absolut schlecht aus.
Vermutlich gibt es auch bessere Lösungsmöglichkeiten für manche Probleme?

Ich habe das Spielfeld in einen Array verfrachtet und gebe es per Konsole aus.

Ich wollte nun fragen, was ich verbessern kann, um nicht wieder so einen unübersichtlichen Haufen zu bekommen.

Wenn jemand einmal drüberschauen könnte wäre ich sehr dankbar!

Java:
import java.util.Scanner;
public class Hauptmenu {
	public static void main(String[] args)
	{
		
		//Initialisierung
		Scanner scanner = new Scanner(System.in);
		int spielfeld[] = new int[10];
		
		//Begruessung und Seitenwahl
		System.out.println("Herzlich willkommen beim TicTacToe Spiel von Klaus Trautner!");
		System.out.println("Im Folgendem koennen Sie sich mit einem Mitspieler messen!");
		System.out.println("Spieler 1, Waehlen Sie nun bitte Ihre Seite:");
		System.out.println("1 - X");
		System.out.println("2 - O");
		
		
		int auswahl;
		int spieler =1;
		auswahl = scanner.nextInt();
		String wahl="0";
		if (auswahl == 1){System.out.println("Ausgezeichnet, Spieler 1, Sie spielen mit X!");wahl = "X";System.out.println("Spieler 2 mit O!");}
		if (auswahl == 2){System.out.println("Ausgezeichnet, Spieler 1, Sie spielen mit O!");wahl = "O";System.out.println("Spieler 2 mit X!");}
		
		

		//Starte Zug
		//Ab hier wiederholen
		while(true)
		{
			System.out.println("");
			
				if (spieler == 1){System.out.println("Spieler 1, Sie sind nun an der Reihe!");}
					else if (spieler == 2){System.out.println("Spieler 2, Sie sind nun an der Reihe!");}
			System.out.println("");
			
			// Berechne Spielfeld
			System.out.println("   A  B  C");
			System.out.print("1  ");
				for (int i = 6; i <9; i++)
				{
					if (spielfeld[i] == 0){System.out.print(".  ");}
					if (spielfeld[i] == 1){System.out.print("X  ");}
					if (spielfeld[i] == 2){System.out.print("O  ");}
				}
			System.out.println("");
			System.out.print("2  ");
				for (int i = 3; i <6; i++)
				{
					if (spielfeld[i] == 0){System.out.print(".  ");}
					if (spielfeld[i] == 1){System.out.print("X  ");}
					if (spielfeld[i] == 2){System.out.print("O  ");}
				}
			System.out.println("");
			System.out.print("3  ");
				for (int i = 0; i <3; i++)
				{
					if (spielfeld[i] == 0){System.out.print(".  ");}
					if (spielfeld[i] == 1){System.out.print("X  ");}
					if (spielfeld[i] == 2){System.out.print("O  ");}
				}
			

		
			
			//Frage nach Platzieren
			System.out.println("");
			System.out.println("");
			System.out.println("Wohin moechten Sie Ihr " + wahl + " setzen?");
			System.out.println("1 - A3     2 - B3     3 - C3");
			System.out.println("4 - A2     5 - B2     6 - C2");
			System.out.println("7 - A1     8 - B1     9 - C1");
			
			
			
			//Scanne Antwort fuer zu platzierenden Stein und schreibe in steinwahlArray
			int steinwahl;
			steinwahl = scanner.nextInt()-1;
			spielfeld[steinwahl] = auswahl;
			
			System.out.println("");
			System.out.println("----------------------------------------------------------");
			System.out.println("----------------------------------------------------------");
			System.out.println("----------------------------------------------------------");
			System.out.println("");
			
			
		//Gewinner ermitteln
		int reih1=0,reih2=0,reih3=0;
		int reiha=0,reihb=0,reihc=0;
		int reihka=0,reihkb=0;
			
			//Reih1...
				for (int i =0; i<3;i++){
					if (spielfeld[i] == auswahl){reih1 =reih1 + 1;}}
			
				for (int i =3; i<6;i++){
					if (spielfeld[i] == auswahl){reih2 =reih2 + 1;}}
			
				for (int i =6; i<9;i++){
					if (spielfeld[i] == auswahl){reih3 =reih3 + 1;}}
			
			//Reiha...
			for (int i =0; i<7;i=i+3){
				if (spielfeld[i] == auswahl){reiha =reiha + 1;}}
			for (int i =1; i<8;i=i+3){
				if (spielfeld[i] == auswahl){reihb =reihb + 1;}}
			for (int i =2; i<9;i=i+3){
				if (spielfeld[i] == auswahl){reihc =reihc + 1;}}
			
			
			//Reihka...
			for (int i =2; i<7;i=i+2){
				if (spielfeld[i] == auswahl){reihka =reihka + 1;}}
			for (int i =0; i<9;i=i+4){
				if (spielfeld[i] == auswahl){reihkb =reihkb + 1;}}
			
			
			if (reih1 == 3 || reih2 == 3 || reih3 == 3 || reiha == 3 || reihb == 3 || reihc ==3 || reihka ==3 || reihkb ==3){
				System.out.println("Spieler " + spieler + ", Sie sind der Gewinner!");
				
									//Zeige das Gewinnfeld nochmal
									System.out.println("");
									System.out.println("");
									System.out.println("");
									System.out.println("Gewinnfeld:");
									System.out.println("   A  B  C");
									System.out.print("1  ");
									for (int i = 6; i <9; i++)
									{
										if (spielfeld[i] == 0){System.out.print(".  ");}
										if (spielfeld[i] == 1){System.out.print("X  ");}
										if (spielfeld[i] == 2){System.out.print("O  ");}
									}
									System.out.println("");
									System.out.print("2  ");
									for (int i = 3; i <6; i++)
									{
										if (spielfeld[i] == 0){System.out.print(".  ");}
										if (spielfeld[i] == 1){System.out.print("X  ");}
										if (spielfeld[i] == 2){System.out.print("O  ");}
									}
									System.out.println("");
									System.out.print("3  ");
									for (int i = 0; i <3; i++)
									{
										if (spielfeld[i] == 0){System.out.print(".  ");}
										if (spielfeld[i] == 1){System.out.print("X  ");}
										if (spielfeld[i] == 2){System.out.print("O  ");}
									}
									break;
			}
			
			//Wechsle Spieler und Stein
			if (auswahl == 1){auswahl = 2;}
			else if (auswahl == 2){auswahl = 1;}
			if (spieler == 1){spieler = 2;}
			else if (spieler == 2){spieler = 1;}
			
			
}
}
}

mfg Klaus
 

Camill

Bekanntes Mitglied
Schau dir mal an was "Methoden" sind und versuche Programmteile deines bisherigen Code auszulagern, dadurch kannst du sicherlich einiges vereinfachen.
 

BRoll

Bekanntes Mitglied
Du könntest es in mehrere Klassen aufteilen ,
zb. Spiefeld, Eingabe, Spielstein, Spieler ....
also eben mit OOP aufbauen, ist zwar nicht so sinnvoll
bei einem kleinen Projekt, aber gut zur Übung.

Und in den einzelnen Klassen halt die Methoden die diese brauchen/haben sollen.

Dann wird sich der Inhalt der main() ganz schnell verdünnisieren :)
 
F

Firephoenix

Gast
Als Ergänzung:
Wenn du fit in OOP bist (und das musst du irgendwann sein für größere Sachen), versuch den Code so fein aufzuteilen, das eine Methode nur genau eine Aufgabe hat die du in einem Satz beschreiben kannst.
Ebenso gehst du mit Klassen vor, eine Klasse sollte nach Möglichkeit nur einen Grund haben sich zu ändern, wobei Grund eine Prozessänderung ist (angenommen du änderst dein Koordinatensystem, dann hat das nichts damit zu tun welcher Spieler für welches Symbol steht).

Gruß
 

Templarthelast

Bekanntes Mitglied
Für deinen Kenntnissstand ist deine Lösung natürlich Top. Java ist allerdings eine sehr Objektorientierte Sprache, was du dann auch in einer neuen Version deines Spieles umsetzen könntest.
 

Landei

Top Contributor
Mal eine vorsichtig überarbeitete Version. Ich selbst hätte es etwas anders geschrieben, aber ich wollte zeigen, in welche Richtung man deine Variante verbessern kann.

Java:
import java.util.Scanner;

import static java.lang.System.out;

public class MainMenu {

    private Scanner scanner = new Scanner(System.in);
    private int board[] = new int[9];
    private int side = 0;
    private int player = 1;

    public void run() {

        greeting();
        chooseSide();

        while (true) {
            showNextPlayer();
            showBoard();
            showLines();

            choosePlacement();
            if (isWinner()) {
                showWinner();
                break;
            }
            switchSides();
        }
    }

    private void showNextPlayer() {
        out.println();
        out.println("Spieler " + player + ", Sie sind nun an der Reihe!");
        out.println();
    }

    private void showLines() {
        out.println();
        for (int i = 0; i < 3; i++) {
            out.println("----------------------------------------------------------");
        }
        out.println();
    }

    private void switchSides() {
        side = 3 - side;
        player = 3 - player;
    }

    private void showWinner() {
        out.println("Spieler " + player + ", Sie sind der Gewinner!");
        out.print("\n\n\n");
        out.println("Gewinnfeld:");
        showBoard();
    }

    private void greeting() {
        out.println("Herzlich willkommen beim TicTacToe Spiel von Klaus Trautner!");
        out.println("Im Folgendem koennen Sie sich mit einem Mitspieler messen!");
    }

    private void chooseSide() {
        side = 0;
        while (side != 1 && side != 2) {
            out.println("Spieler 1, Waehlen Sie nun bitte Ihre Seite:");
            out.println("1 - X");
            out.println("2 - O");
            side = scanner.nextInt();
        }
        out.println("Ausgezeichnet, Spieler 1, Sie spielen mit " + (side == 1 ? 'X' : 'O') + "!");
        out.println("Spieler 2 mit " + (side == 1 ? 'O' : 'X') + "!");
    }

    private void showBoard() {
        out.println("   A  B  C");
        for (int row = 0; row < 3; row++) {
            out.print((row+1) + "  ");
            for (int col = 0; col < 3; col++) {
                out.print(fieldToString(board[3 * row + col]));
            }
            out.println();
        }
    }

    private String fieldToString(int n) {
        switch (n) {
            case 0:
                return ".  ";
            case 1:
                return "X  ";
            case 2:
                return "O  ";
            default:
                throw new AssertionError();
        }
    }

    private void choosePlacement() {
        int choice = -1;

        while (choice < 0 || choice > 8 || board[choice] != 0) {
            out.println();
            out.println();
            out.println("Wohin moechten Sie Ihr " + (side == 1 ? 'X' : 'O') + " setzen?");
            out.println("1 - A1     2 - B1     3 - C1");
            out.println("4 - A2     5 - B2     6 - C2");
            out.println("7 - A3     8 - B3     9 - C3");


            //Scanne Antwort fuer zu platzierenden Stein und schreibe in steinwahlArray
            choice = scanner.nextInt() - 1;
        }
        board[choice] = side;
    }

    private boolean isWinner() {
        return checkFields(0,1) || checkFields(3,1) || checkFields(6,1) //rows
          || checkFields(0,3) || checkFields(1,3) || checkFields(2,3) //columns
          || checkFields(2,2) || checkFields(0,4); //diagonals
    }

    private boolean checkFields(int startField, int delta) {
        boolean result = true;
        int i = startField;
        for (int k = 0; k < 3; k++) {
            if (board[i] != side) {
                result = false;
            }
            i += delta;
        }
        return result;
    }


    public static void main(String[] args) {
        new MainMenu().run();
    }
}

Ich finde es übrigens gut, dass du dich nicht damit zufrieden gibst, dass dein Code läuft. Vielleicht wäre das Buch "Clean Code" etwas für dich, auch wenn es momentan vielleicht noch etwas zu schwierig ist.
 
Zuletzt bearbeitet:

SoulRaiZor

Neues Mitglied
Hallo!

Vielen Dank, für die Antworten von allen.
Ganz besonders von Landei, du hast dir sehr viel Mühe gemacht.
Dein Code hilft mir extrem weiter. Er enthält viel für mich Neues, was ich mir auch aneignen werde :)
Dankend,
Klaus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Größter gemeinsamer Teiler: mein Code Java Basics - Anfänger-Themen 6
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
S Brauche hilfe in Java [Fehler in mein Code]? Java Basics - Anfänger-Themen 2
A Eine Krone in der Textausgabe - Mein Code Java Basics - Anfänger-Themen 11
stylegangsta Input/Output Hat eclipse eine Macke oder mein Code Array Datei einlesen Java Basics - Anfänger-Themen 5
J Erste Schritte Zweithöchster Wert eines Arrays herausfinden - warum klappt mein Code nicht? Java Basics - Anfänger-Themen 3
E Mein erstes Java Projekt - Sauberer code? Java Basics - Anfänger-Themen 28
S wieso ist mein Code falsch? Java Basics - Anfänger-Themen 2
G Buffered REader, String, ist mein code korrekt? Java Basics - Anfänger-Themen 4
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
dennis_lnz Klassen Wie kann ich mein Java Textadventure verbessern, um ein Klassendiagramm zu erstellen? Java Basics - Anfänger-Themen 9
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
J Mein Java Programm lässt sich nicht mehr bearbeiten Java Basics - Anfänger-Themen 2
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
M Mein quellcode wird nicht in der Konsole ausgegeben Java Basics - Anfänger-Themen 3
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
W Wie ziehe ich von einer bestimmten Zahl, Zahlen ab, bis mein Ergebnis null beträgt? Java Basics - Anfänger-Themen 10
J Kann ich mein Programm so schreiben? Java Basics - Anfänger-Themen 4
S Mein erstes eigenes Projekt - Aufbau und Strukturierung Java Basics - Anfänger-Themen 6
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
T Mein Programm hat Fehler Java Basics - Anfänger-Themen 4
S Wie ende ich mein Pogrammierung? [Hilfe] Java Basics - Anfänger-Themen 1
R Mein Plugin funktioniert nicht? Java Basics - Anfänger-Themen 10
J Mein Programm beendet sich ohne mein Zutun Java Basics - Anfänger-Themen 9
M Warum berechnet mein Primzahlenprog zu hohe Zahlen nicht? Java Basics - Anfänger-Themen 20
M OOP Mein erstes Textadventure... Java Basics - Anfänger-Themen 3
G Mein Java Projekt funktioniert nicht Java Basics - Anfänger-Themen 5
W Wieso funktioniert mein Switch Case nicht ?! Java Basics - Anfänger-Themen 9
L Mein Taschenrechner lässt sich plötzlich nicht mehr öffnen Java Basics - Anfänger-Themen 5
x-tshainge Mein Programm lässt sich nicht Starten Java Basics - Anfänger-Themen 8
W Warum läuft mein Programm nicht? Java Basics - Anfänger-Themen 14
W Warum funktioniert mein Programm nicht ? Java Basics - Anfänger-Themen 12
W Warum funktioniert mein Programm nicht ? Java Basics - Anfänger-Themen 6
W Ist mein Struktogram richtig erstellt worden? Java Basics - Anfänger-Themen 4
W Erste Schritte Warum funktioniert mein Programm nicht ? ~if Anweisung~ Java Basics - Anfänger-Themen 4
A Erste Schritte Mein Programm erkennt die variable EinAus.readInt nicht Java Basics - Anfänger-Themen 15
N Warum terminiert mein Programm nicht? Java Basics - Anfänger-Themen 13
G Wie kann ich mein Quellcode als Programm vom desktop starten? Java Basics - Anfänger-Themen 1
P Wie kann ich mein Programm zu einer App umwandeln? Java Basics - Anfänger-Themen 4
M Mein erstes Programm Java Basics - Anfänger-Themen 3
A Mein 1x1 Programm funktioniert nicht? Java Basics - Anfänger-Themen 2
G Input/Output Wo liegt mein Fehler? Java Basics - Anfänger-Themen 4
G Variablen Was ist mein Fehler? Java Basics - Anfänger-Themen 2
C Warum funktioniert mein If Statement nicht richtig? Java Basics - Anfänger-Themen 18
B Drucken: Default Paper von Drucker? Mein Drucker druckt falsch Java Basics - Anfänger-Themen 3
W Compiler-Fehler Fehler - <identifier> expected, wo liegt mein Fehler? Java Basics - Anfänger-Themen 4
M Mein erstes Java Programm Java Basics - Anfänger-Themen 5
S Wieso wird mein JFrame transparent dargestellt? Java Basics - Anfänger-Themen 5
N mein RegEx Java Basics - Anfänger-Themen 2
N Mein Bubblesort sortiert mein Array nicht Java Basics - Anfänger-Themen 2
W Wie hat mein Lehrer das gemacht. Java Basics - Anfänger-Themen 2
Z Klassen Warum wird mein Objekt nicht erkannt? Java Basics - Anfänger-Themen 2
A Wie kann ich mein Programm noch effizienter machen? Java Basics - Anfänger-Themen 1
C Mein Video zu Java Grundlagen Java Basics - Anfänger-Themen 8
T Eclipse kennt mein Button nicht... Java Basics - Anfänger-Themen 5
J Wo liegt nur an dieser einfachen Bedingung mein Fehler? Java Basics - Anfänger-Themen 8
E Mein eigener Listener (Hilfe gesucht) Java Basics - Anfänger-Themen 2
D Brauche Hilfe für mein übungsprogramm Java Basics - Anfänger-Themen 16
T Mein String in ein JLabel stecken Java Basics - Anfänger-Themen 2
T mein erstes Java projekt Java Basics - Anfänger-Themen 8
H Kann ich mein Programm vereinfachen? Java Basics - Anfänger-Themen 3
J Methoden Wo ist mein Fehler ?! Java Basics - Anfänger-Themen 9
1 Mein erstes Programm, HELP!! Java Basics - Anfänger-Themen 2
R .txt in mein Javaprogramm hineinschmelzen Java Basics - Anfänger-Themen 6
T OOP Mein erstes Java-Spiel - Schiffe versenken! Java Basics - Anfänger-Themen 2
D Mein erstes Programm flackert Java Basics - Anfänger-Themen 5
H Ich kann mein Java Programm Test.class nicht ausführen Java Basics - Anfänger-Themen 6
H Probleme mein Ausführen der .class (Ubuntu JDK6) Java Basics - Anfänger-Themen 2
M Mein TableEvent problem Java Basics - Anfänger-Themen 3
C Boolsche Ausdrücke - Wo ist mein Fehler? Java Basics - Anfänger-Themen 14
propra Wie mache ich einem JPanel mein bereits instanziertes Model bekannt Java Basics - Anfänger-Themen 9
M Warum wird mein Icon bei den JTree Nodes nicht angezeigt? Java Basics - Anfänger-Themen 7
K Mein Programm... Heute: Settings-Datei in .jar speichern und auslesen Java Basics - Anfänger-Themen 9
M Kann mein Java Programm nicht starten Java Basics - Anfänger-Themen 6
V Mein erster Konstruktor Java Basics - Anfänger-Themen 3
S GaussJordan in Java, wo liegt mein Fehler? Java Basics - Anfänger-Themen 4
B Methoden Mein erstes Programm - und gleich Probleme Java Basics - Anfänger-Themen 6
O Warum terminiert mein Programm nicht!? Java Basics - Anfänger-Themen 15
U2nt Mein Chat Java Basics - Anfänger-Themen 10
S Wo ist mein Fehler? Java Basics - Anfänger-Themen 2
M Sammlung von Anfängerfragen für mein erstes Programm Java Basics - Anfänger-Themen 15
I OOP This-Referenzs > wo liegt mein Denkfehler? Java Basics - Anfänger-Themen 24
L Hashtable nicht wirklich geeignet für mein Vorhaben? Java Basics - Anfänger-Themen 3
W ArrayListe , Wo ist mein Fehler? Java Basics - Anfänger-Themen 6
H wie bekomm ich ein Foto in mein Programm rein? Java Basics - Anfänger-Themen 8
M Mein Externes Programm startet nicht Java Basics - Anfänger-Themen 13
M Timer unterbrechen? Wo ist mein Thread? Java Basics - Anfänger-Themen 2
S Mein Computer kennt "javac" und "java" nicht mehr! Java Basics - Anfänger-Themen 6
B XML? Für Uhrzeit und Datum für mein HP? Java Basics - Anfänger-Themen 6
JeromeM90 Mein Java Applet zeitverzögern ? Java Basics - Anfänger-Themen 2
Developer_X Mein erster Internet Explorer Java Basics - Anfänger-Themen 14
B könnte nochmal jemand über mein Projekt schauen? Java Basics - Anfänger-Themen 4
J Mein Objekt will nicht! Java Basics - Anfänger-Themen 2
Screen Scanner Arrays wo liegt mein Fehler? Java Basics - Anfänger-Themen 11
F.S.WhiTeY Java RegEx Will nicht so wie ich will. Wo ist mein fehler ? Java Basics - Anfänger-Themen 3
GambaJo Brauche Bewertung + Tipps für mein kleines Projekt Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben