Mein erstes TicTacToe :-)

Mikeee

Neues Mitglied
Hallo :)

Ich bin noch Anfänger also bitte nicht lachen oder beleidigen.
Heute habe ich mal versucht ein TicTacToe Spiel zu schreiben.
Da ich leider keinen Lehrer habe mit dem ich mich darüber unterhalten kann, wollte
ich euch mal fragen:
Wie findet ihr es ?
Was sollte ich anders machen ?
Worauf sollte ich unbedingt achten ?
Sind da zuviele For-Schleifen ?

Kleine Fehler habe ich gefunden aber wollte es euch einfach mal so zeigen. :)

Main.java
Java:
package at.rmr.main;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Main extends JFrame implements ActionListener {

	private Container cp;
	
	private JPanel btnPanel = new JPanel(new FlowLayout());
	private JButton start = new JButton("New Game");
	private JButton restart = new JButton("Reset");
	private JButton exit = new JButton("Exit");
	
	private JPanel gamePanel = new JPanel(new GridLayout(3, 3));
	private JButton[] cellBtn;
	
	private JPanel gameState = new JPanel(new FlowLayout());
	private JLabel stateLabel = new JLabel("");
	
	private boolean started;
	private char playSym;
	private char cpuSym;
	
	private boolean playerMove;
	private int numMoves;
	public Main(){
		GUI_Builder();
	}
	public static void main(String[] args) {
		new Main();
	}
	
	public void GUI_Builder(){
		btnPanel.add(start);
		start.setPreferredSize(new Dimension(140,45));
		start.addActionListener(this);
		btnPanel.add(restart);
		restart.setPreferredSize(new Dimension(140,45));
		restart.addActionListener(this);
		btnPanel.add(exit);
		exit.setPreferredSize(new Dimension(140,45));
		exit.addActionListener(this);
		btnPanel.setPreferredSize(new Dimension(150,55));
		
		gameState.add(stateLabel);
		
		cellBtn = new JButton[9];
		for(int i = 0;i < 9;i++){
			cellBtn[i] = new JButton("-");
			cellBtn[i].setPreferredSize(new Dimension(150,150));
			cellBtn[i].addActionListener(this);
			cellBtn[i].setEnabled(false);
			gamePanel.add(cellBtn[i]);
		}
		
		cp = getContentPane();
		cp.add(btnPanel,BorderLayout.SOUTH);
		cp.add(gamePanel,BorderLayout.CENTER);
		cp.add(gameState,BorderLayout.NORTH);
		pack();
		
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setResizable(false);
		requestFocus();
	}
	public void start(){
		int selPlay = JOptionPane.showOptionDialog(null, "Select player:","Start new Game",
				JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.WARNING_MESSAGE, null,
				new String[]{"X","0"},null);
		if(selPlay != -1){
			if(selPlay == 0){initStart('X','0');}//X
			else if(selPlay == 1){initStart('0','X');}//0
		}
	}
	public void reset(){
		for(int i = 0;i < 9;i++){
			cellBtn[i].setEnabled(false);
			cellBtn[i].setText("-");
			cellBtn[i].setBackground(null);
			started = false;
			numMoves = 0;
			stateLabel.setText("");
		}
	}
	public void initStart(char p,char c){
		started = true;playSym = p;cpuSym = c;numMoves = 0;
		for(int i = 0;i < 9;i++){cellBtn[i].setEnabled(true);cellBtn[i].setText("");cellBtn[i].setBackground(null);}
		if(p == 'X'){playerMove = true;}
		else{playerMove = false;cpuPlayer();}
		updateLabel();
	}
	public void actionPerformed(ActionEvent e) {
		Object currBtn = e.getSource();
		if(currBtn == start){start();}
		else if(currBtn == restart){reset();}
		else if(currBtn == exit){System.exit(EXIT_ON_CLOSE);}
		else{if(started){manPlayer(currBtn);}}
		requestFocus();
	}
	public void manPlayer(Object e){
		for(int i = 0;i < 9;i++){
			if(e == cellBtn[i]){
				cellBtn[i].setText(String.valueOf(playSym));
				cellBtn[i].setEnabled(false);
				playerMove = false;
				numMoves++;
				cpuPlayer();
			}
		}
		checkWin();
	}
	public void cpuPlayer(){
		// very very stupid cpu ;-)
		if(!playerMove && started){
			Random r = new Random();
			int R = r.nextInt(9);
			if(cellBtn[R].isEnabled()){
				cellBtn[R].setText(String.valueOf(cpuSym));
				cellBtn[R].setEnabled(false);
				playerMove = true;
				numMoves++;
			}else{
				if(numMoves < 9){
				cpuPlayer();
				}
			}
		}
		checkWin();
	}
	public void updateLabel(){
		String tx = "Current Player: " + String.valueOf(playSym) + " Turn: " + numMoves;
		stateLabel.setText(tx);
	}
	public void checkWin(){
		//0 1 2
		//3 4 5
		//6 7 8
		
		// hori
		updateLabel();
		if(cellBtn[0].getText() != "" && cellBtn[0].getText().equals(cellBtn[1].getText()) && cellBtn[1].getText().equals(cellBtn[2].getText())){
			isWin(0,1,2);
		}
		else if(cellBtn[3].getText() != "" && cellBtn[3].getText().equals(cellBtn[4].getText()) && cellBtn[4].getText().equals(cellBtn[5].getText())){
			isWin(3,4,5);
		}
		else if(cellBtn[6].getText() != "" && cellBtn[6].getText().equals(cellBtn[7].getText()) && cellBtn[7].getText().equals(cellBtn[8].getText())){
			isWin(6,7,8);
		}
		// vert
		else if(cellBtn[0].getText() != "" && cellBtn[0].getText().equals(cellBtn[3].getText()) && cellBtn[3].getText().equals(cellBtn[6].getText())){
			isWin(0,3,6);
		}
		else if(cellBtn[1].getText() != "" && cellBtn[1].getText().equals(cellBtn[4].getText()) && cellBtn[4].getText().equals(cellBtn[7].getText())){
			isWin(1,4,7);
		}
		else if(cellBtn[2].getText() != "" && cellBtn[2].getText().equals(cellBtn[5].getText()) && cellBtn[5].getText().equals(cellBtn[8].getText())){
			isWin(2,5,8);
		}
		// cro
		else if(cellBtn[0].getText() != "" && cellBtn[0].getText().equals(cellBtn[4].getText()) && cellBtn[4].getText().equals(cellBtn[8].getText())){
			isWin(0,4,8);
		}
		else if(cellBtn[2].getText() != "" && cellBtn[2].getText().equals(cellBtn[4].getText()) && cellBtn[4].getText().equals(cellBtn[6].getText())){
			isWin(2,4,6);
		}
		else{
			if(numMoves == 9){
				started = false;
				numMoves = 0;
				for(int i = 0;i < 9;i++){
				cellBtn[i].setBackground(Color.RED);
				}
			}
		}	
	}
	public void isWin(int a,int b,int c){
		for(int i = 0;i < 9;i++){
			cellBtn[i].setBackground(Color.RED);
		}
		cellBtn[a].setBackground(Color.GREEN);
		cellBtn[b].setBackground(Color.GREEN);
		cellBtn[c].setBackground(Color.GREEN);
		stateLabel.setText("Player " + cellBtn[a].getText() + " won! ;-)");
		started = false;
		numMoves = 0;
	}

}
 

njans

Top Contributor
Java:
cellBtn[2].getText() != ""
Strings vergleicht man mit equals().

Generell hast du da viele Attribute in deiner Klasse, die du eigentlich gar nicht wieder brauchst. z.B. :
Java:
private JButton exit = new JButton("Exit");
dem musst du doch nur nen Listener mitgeben und dann brauchst du ihn nie wieder.

Die Methode checkWin kann man auch schöner mit Schleifen schreiben ;)

Generell klebst du alles in eine Klasse, anstatt es aufzuteilen. Hier kriegst du z.B. schnell ein Problem, wenn du mal grafisch mehr machen möchtest oder das ganze Programm erweiterst/verändern willst.

Das ist so das, was mir aufgefallen ist.
 

Joose

Top Contributor
Java:
public class Main extends JFrame implements ActionListener {

Von der Klasse JFrame sollte man nur ableiten wenn man die Klasse wirklich erweitern will nicht, wenn man sie nur verwenden will um ein JFrame anzuzeigen.

Java:
public void GUI_Builder(){

Vermeide "_" als Bezeichner für Methoden, Klassen usw.

Java:
	if(selPlay != -1){
		if(selPlay == 0){initStart('X','0');}//X
		else if(selPlay == 1){initStart('0','X');}//0
	}
......
......
	for(int i = 0;i < 9;i++){cellBtn[i].setEnabled(true);cellBtn[i].setText("");cellBtn[i].setBackground(null);}
	if(p == 'X'){playerMove = true;}
	else{playerMove = false;cpuPlayer();}
......
......
	if(currBtn == start){start();}
	else if(currBtn == restart){reset();}
	else if(currBtn == exit){System.exit(EXIT_ON_CLOSE);}
	else{if(started){manPlayer(currBtn);}}
:autsch:
Gewöhne dir an die einzelnen Befehle nicht alle in eine Zeile zu quetschen, spart vielleicht Codezeilen, aber dadurch lässt sich der Code schwieriger lesen!
Schön für jeden Befehl eine eigene Zeile. Das macht das spätere editieren auch einfacher wenn man mal schnelle eine einzelne Zeile auskommentieren will.


Ansonsten wie njans schon gesagt hat, Strings mit equals statt == vergleichen.
 

Mikeee

Neues Mitglied
Hey

Danke für die Antworten :)

Also einen schöneren Quellcode zuschreiben muss ich mir unbedingt angewöhnen. :oops:
Die Antworten leuchten mir alle ein. Ich schreibe gerade ein neues und werde eure Vorschläge berücksichtigen. Danke

Ich kann den Quellcode vom neuen ja dann später hir/oder auf Pastebin posten wenn es einer von euch sehen will.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Queenman Interface Mein Microsoft Visual Studio Code zeigt komische Dinge & Menüs an Allgemeine Java-Themen 9
B Wie kann ich mein 8 Klassen Gebilde objektorientierter schreiben? Allgemeine Java-Themen 114
Tiago1234 Warum hängt sich mein Programm auf? Allgemeine Java-Themen 22
J Mein Frame friert ein beim Uploaden Allgemeine Java-Themen 4
Drachenbauer Wie sorge ich dafür, dass mein Spiel die ini-Datei in der Resourcen-ordner des Projektes schreibt? Allgemeine Java-Themen 5
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
M Brainstorming für mein Projekt Allgemeine Java-Themen 30
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
T log4j2 Wo liegt mein Logfile? Allgemeine Java-Themen 3
Thallius Warum läst mein replace die Klammern drin? Allgemeine Java-Themen 10
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
C Durch klicken von Button in GUI wird leeres Fenster geöffnet und nicht mein Spiel "Memory" Allgemeine Java-Themen 13
G Mein PDF Projekt mit iText Allgemeine Java-Themen 2
K Was ist mein Fehler? Allgemeine Java-Themen 2
itwestnet Mein Java-Programm läuft nicht in China Allgemeine Java-Themen 4
Thallius App-Sprache in der App ändern. Wo ist mein Denkfehler? Allgemeine Java-Themen 6
A Applet Mein Applet verursacht Browserabsturz Allgemeine Java-Themen 8
Ollek MVC - Anwendung auf mein Projekt Allgemeine Java-Themen 18
K Wo ist mein Fehler? Allgemeine Java-Themen 21
J Mein eigener Messenger und dessen Probleme Allgemeine Java-Themen 48
C Hilfe! Mein Java mag nich mehr ganz... Allgemeine Java-Themen 11
F VideoIntro für mein Programm Allgemeine Java-Themen 2
A Wie lasse ich mein Programm als Daemon laufen? Allgemeine Java-Themen 4
A Wie liefere ich mein Java-Programm richtig aus? Allgemeine Java-Themen 10
G Entscheidungsproblem für mein Vorhaben, zwischen Java und C# Allgemeine Java-Themen 35
G Wie kann ich in mein Programm eine Updatefunktion einbauen Allgemeine Java-Themen 3
E Wie bekomme ich mein Image in das Fenster Allgemeine Java-Themen 2
V Beratung zum Bestimmen der "Mittel"(Java,Sql) mein Allgemeine Java-Themen 3
S mit welchem befehl kann ich mein programm autom. schließen Allgemeine Java-Themen 3
R Mein Applet läuft in der IDE aber nicht. Allgemeine Java-Themen 2
M Bitte Testen: Mein Multi-File Editor Allgemeine Java-Themen 30
B Fehler:Mein Applet kann nicht auf zwei txt-Dateien zugreifen Allgemeine Java-Themen 2
C Warum wartet mein thread nicht? Allgemeine Java-Themen 2
F Datei auslesen - wo ist mein Fehler? Allgemeine Java-Themen 9
T läuft mein Programm schon? - wie feststellen Allgemeine Java-Themen 6
T Warum mein such-tool schneller als Windows such-tool? Allgemeine Java-Themen 5
A Wie mach ich, das mein Button schneller reagiert. Allgemeine Java-Themen 13
A mein Frame wird nicht schnell genung aktualisiert Allgemeine Java-Themen 7
G JFrame nimmt mein Image nicht Allgemeine Java-Themen 2
D Mein Bäumchen Allgemeine Java-Themen 6
markuskat Erste Schritte JavaEE WebApplication - Erstes Projekt Allgemeine Java-Themen 16
S Erstes größeres Java Projekt: Etiketten Allgemeine Java-Themen 3
S Erstes Öffnen einer Datei Allgemeine Java-Themen 7
A Erstes Zeichen im String "toUpperCase"n Allgemeine Java-Themen 11
M Erstes eigenes Projekt Allgemeine Java-Themen 5
S Erstes Enum bekommen? Allgemeine Java-Themen 2
J Erstes Programm bei Sourceforge: Was muss ich beachten? Allgemeine Java-Themen 18
M Erstes Element einer Enumeration ermitteln Allgemeine Java-Themen 6
M TicTacToe Sound nach jedem Zug Allgemeine Java-Themen 21
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
D TicTacToe-KI Allgemeine Java-Themen 3
A TicTacToe-ÜBerprüfung in Java Allgemeine Java-Themen 4
P KI für TicTacToe programmieren > Probleme Allgemeine Java-Themen 2
K GUI-Button Inhalte vergleich - TicTacToe Grundriss Allgemeine Java-Themen 11
S TicTacToe KI-Player mit Heuristik Allgemeine Java-Themen 3
S KI für TicTacToe spiel Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben