Java [JAVA] Mein Latein ist am Ende.

Status
Für weitere Antworten geschlossen.

GTA 3

Lt. Junior Grade
Registriert
Nov. 2010
Beiträge
374
Hi,
bin grad dabei Tic Tac Toe zu programmieren aber ich hab jetzt eines der Mommente wo ich nicht weiß wie ich weiter machen soll.

Hier erstmal der Code:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Oberflaeche extends JFrame {
private Steuerung dieSteuerung = new Steuerung();
public Oberflaeche() {
getContentPane().add(new Inhalt(dieSteuerung));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
Oberflaeche dieOberflaeche = new Oberflaeche();
dieOberflaeche.setTitle("Tic-Tac-Toe 1.0");
dieOberflaeche.setResizable(false);
dieOberflaeche.setVisible(true);
dieOberflaeche.setSize(600+dieOberflaeche.getInsets().left+dieOberflaeche.getInsets().right,600+dieOberflaeche.getInsets().top+dieOberflaeche.getInsets().bottom);
}
}

class Inhalt extends JPanel {
private Steuerung dieSteuerung;
public Inhalt(Steuerung steu) {
dieSteuerung = steu;
setLayout(null);
JButton starteSpiel = new JButton("Spiel starten");
final Icon player0 = new ImageIcon("./player0.gif");
final Icon player1 = new ImageIcon("./player1.gif");
final JLabel button[] = new JLabel[9];
int firstStart = 0;
JLabel spielstand[] = new JLabel[2];
final int buttonPressed[] = {0,0,0,0,0,0,0,0,0};
final int currentPlayer = 0;
if(firstStart == 0) {
NewGame.main(steu);
firstStart = 1;
}
// Spielbuttons
button[0] = new JLabel();
button[0].setBackground(new java.awt.Color(2,64,1));
button[0].setBounds(115,115,120,120);
add(button[0]);

button[1] = new JLabel();
button[1].setBounds(240,115,120,120);
button[1].setBackground(new Color(2,64,1));
add(button[1]);

button[2] = new JLabel();
button[2].setBounds(365,115,121,121);
button[2].setBackground(new Color(2,64,1));
add(button[2]);

button[3] = new JLabel();
button[3].setBounds(115,240,120,120);
button[3].setBackground(new Color(2,64,1));
add(button[3]);

button[4] = new JLabel();
button[4].setBounds(240,240,120,120);
button[4].setBackground(new Color(2,64,1));
add(button[4]);

button[5] = new JLabel();
button[5].setBounds(365,240,120,120);
button[5].setBackground(new Color(2,64,1));
add(button[5]);

button[6] = new JLabel();
button[6].setBounds(115,365,120,120);
button[6].setBackground(new Color(2,64,1));
add(button[6]);

button[7] = new JLabel();
button[7].setBounds(240,365,120,120);
button[7].setBackground(new Color(2,64,1));
add(button[7]);

button[8] = new JLabel();
button[8].setBounds(365,365,120,120);
button[8].setBackground(new Color(2,64,1));
add(button[8]);

spielstand[0] = new JLabel("0");
spielstand[0].setBounds(239,527,49,61);
spielstand[0].setHorizontalAlignment(SwingConstants.CENTER);
spielstand[0].setFont(spielstand[0].getFont().deriveFont(32f));
spielstand[0].setForeground(Color.white);
add(spielstand[0]);

JLabel trenner = new JLabel(":");
trenner.setBounds(288,527,25,61);
trenner.setHorizontalAlignment(SwingConstants.CENTER);
trenner.setFont(trenner.getFont().deriveFont(32f));
trenner.setForeground(Color.white);
add(trenner);

spielstand[1] = new JLabel("0");
spielstand[1].setBounds(313,527,49,61);
spielstand[1].setHorizontalAlignment(SwingConstants.CENTER);
spielstand[1].setFont(spielstand[1].getFont().deriveFont(32f));
spielstand[1].setForeground(Color.white);
add(spielstand[1]);

JLabel vslayer = new JLabel((String)(NewGameGUI.namePlayer1.getText())+" VS "+(String)(NewGameGUI.namePlayer2.getText()));
vslayer.setHorizontalAlignment(SwingConstants.CENTER);
vslayer.setBounds(250,15,300,20);
add(vslayer);

//starteSpielButton
add(starteSpiel);
starteSpiel.setBounds(10,10,200,40);
starteSpiel.setBackground(new Color(122,139,139));
starteSpiel.setForeground(new Color(250,200,0));

starteSpiel.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
for(int i = 0; i<=8; i++) {
button.setIcon(null);
buttonPressed = 0;
}
}
});

button[0].addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
if(buttonPressed[0] == 0) {
if(dieSteuerung.getPlayer() == 0) {
button[0].setIcon(player0);
dieSteuerung.changePlayer();
} else {
button[0].setIcon(player1);
dieSteuerung.changePlayer();
}
// dieSteuerung.setPoint(1);
buttonPressed[0] = 1;
}
}
});

button[1].addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
if(buttonPressed[1] == 0) {
if(dieSteuerung.getPlayer() == 0) {
button[1].setIcon(player0);
dieSteuerung.changePlayer();
} else {
button[1].setIcon(player1);
dieSteuerung.changePlayer();
}
// dieSteuerung.setPoint(1);
buttonPressed[1] = 1;
}
}
});

button[2].addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
if(buttonPressed[2] == 0) {
if(dieSteuerung.getPlayer() == 0) {
button[2].setIcon(player0);
dieSteuerung.changePlayer();
} else {
button[2].setIcon(player1);
dieSteuerung.changePlayer();
}
// dieSteuerung.setPoint(2);
buttonPressed[2] = 1;
}
}
});

button[3].addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
if(buttonPressed[3] == 0) {
if(dieSteuerung.getPlayer() == 0) {
button[3].setIcon(player0);
dieSteuerung.changePlayer();
} else {
button[3].setIcon(player1);
dieSteuerung.changePlayer();
}
// dieSteuerung.setPoint(3);
buttonPressed[3] = 1;
}
}
});

button[4].addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
if(buttonPressed[4] == 0) {
if(dieSteuerung.getPlayer() == 0) {
button[4].setIcon(player0);
dieSteuerung.changePlayer();
} else {
button[4].setIcon(player1);
dieSteuerung.changePlayer();
}
// dieSteuerung.setPoint(4);
buttonPressed[4] = 1;
}
}
});

button[5].addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
if(buttonPressed[5] == 0) {
if(dieSteuerung.getPlayer() == 0) {
button[5].setIcon(player0);
dieSteuerung.changePlayer();
} else {
button[5].setIcon(player1);
dieSteuerung.changePlayer();
}
// dieSteuerung.setPoint(5);
buttonPressed[5] = 1;
}
}
});

button[6].addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
if(buttonPressed[6] == 0) {
if(dieSteuerung.getPlayer() == 0) {
button[6].setIcon(player0);
dieSteuerung.changePlayer();
} else {
button[6].setIcon(player1);
dieSteuerung.changePlayer();
}
// dieSteuerung.setPoint(6);
buttonPressed[6] = 1;
}
}
});

button[7].addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
if(buttonPressed[7] == 0) {
if(dieSteuerung.getPlayer() == 0) {
button[7].setIcon(player0);
dieSteuerung.changePlayer();
} else {
button[7].setIcon(player1);
dieSteuerung.changePlayer();
}
// dieSteuerung.setPoint(7);
buttonPressed[7] = 1;
}
}
});

button[8].addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
if(buttonPressed[8] == 0) {
if(dieSteuerung.getPlayer() == 0) {
button[8].setIcon(player0);
dieSteuerung.changePlayer();
} else {
button[8].setIcon(player1);
dieSteuerung.changePlayer();
}
// dieSteuerung.setPoint(8);
buttonPressed[8] = 1;
}
}
});

}

//* public void win(int buttonPressed){
//if(buttonPressed[0]==1&&buttonPressed[1]==1&&buttonPressed[2]==1){
// System.out.println("You Win!");
//}
//}

public void paintComponent(Graphics g) {
g.drawImage(getToolkit().getImage("./background.jpg"),0,0,null);
}
}

class NewGame extends JFrame {
public NewGame(Steuerung steu) {
getContentPane().add(new NewGameGUI(steu,this));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(Steuerung steu) {
NewGame dieOberflaeche = new NewGame(steu);
dieOberflaeche.setTitle("Willkommen!");
dieOberflaeche.setResizable(false);
dieOberflaeche.setAlwaysOnTop(true);
dieOberflaeche.setVisible(true);
dieOberflaeche.setSize(500+dieOberflaeche.getInsets().left+dieOberflaeche.getInsets().right,150+dieOberflaeche.getInsets().top+dieOberflaeche.getInsets().bottom);
}
}

class NewGameGUI extends JPanel {
static JTextField namePlayer1 = new JTextField(20);
static JTextField namePlayer2 = new JTextField(20);
static JFrame frame;
public NewGameGUI(Steuerung steu,JFrame frame) {
setLayout(null);
this.frame = frame;
namePlayer1.setBounds(100,70,350,20);
add(namePlayer1);

namePlayer2.setBounds(100,90,350,20);
add(namePlayer2);

JLabel willkommen = new JLabel("Willkommen!");
willkommen.setHorizontalAlignment(SwingConstants.CENTER);
willkommen.setBounds(0,0,500,40);
add(willkommen);

JLabel willkommenText = new JLabel("Bitte gebt nachfolgend eure Namen ein, um ein neues Spiel zu beginnen.");
willkommenText.setHorizontalAlignment(SwingConstants.CENTER);
willkommenText.setBounds(0,30,500,40);
add(willkommenText);

JLabel player1 = new JLabel("Player 1:");
player1.setHorizontalAlignment(SwingConstants.CENTER);
player1.setBounds(0,70,100,20);
add(player1);

JLabel player2 = new JLabel("Player 2:");
player2.setHorizontalAlignment(SwingConstants.CENTER);
player2.setBounds(0,90,100,20);
add(player2);

JTextField namePlayer1 = new JTextField(20);
namePlayer1.setBounds(100,70,350,20);
add(namePlayer1);

JTextField namePlayer2 = new JTextField(20);
namePlayer2.setBounds(100,90,350,20);
add(namePlayer2);

JButton ok = new JButton("OK");
ok.setBounds(200,120,100,20);
add(ok);
ok.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e){
NewGameGUI.frame.dispose();
}
});
}
public String namePlayer1getText(){
return namePlayer1.getText();
}
public String namePlayer2getText(){
return namePlayer2.getText();
}
}


Und zwar will ich jetzt einbauen das das Spiel jetzt erkennen soll, wer gewonnen hat und wer nicht
Nur leider weiß ich hier jetzt nicht weiter.... Hoffe ihr könnt mir helfen.

Hier sind noch die anderen Klassen.
public class Steuerung {
private int currentPlayer = 0;

public int getPlayer() {
return currentPlayer;
}

public void changePlayer() {
if(currentPlayer == 0) {
currentPlayer = 1;
} else {
currentPlayer = 0;
}
}
}

public class Daten extends Steuerung {
private String spieler;
private int spielpunkte;
private int spielzug = 0;
private int[] punktespieler = new int[9];

public Daten (String spieler) {
this.spieler = spieler;
spielpunkte = 0;
}

public void setPoint(int feld) {
punktespieler[spielzug] = feld;
spielzug++;
}
}

Ich weiß, mit ner normalen If-SChleife aber wenn ich button[0] z.B. schreib, bekomm ich immer einen Compilerfehler, wie würdet ihr das machen ?


Gruß
 
Zuletzt bearbeitet von einem Moderator:
Ich bin zwar kein Javakenner aber meine Idee wäre es die 9 Felder des TicTacToe
für jeden Spieler einzeln zu überprüfen. Hat ein Spieler
an einer Stelle ein Kreuz bzw Kreis. Entspricht dies einer logischen 1.

Würde dann das in ein Bitarray aus 9 Elementen eintragen und mit einem
boolschen Ausdruck auf Sieg überprüfen.
Den boolschen Ausdruck bekommst du am besten über eine Wahrheitstablle.
Das ganze läßt sich mit einem KV-Diagramm dann auf ein mindestmaß an Termen reduzieren.

evtl hilft dir daß weiter ?
 
also ich hab das mal aus spass im c++ unterricht geschrieben, da hatte ich das problem auch.

am ende war es dann so, das bei jeder auswahl die 9 felder geprüft werden. sprich 1+2+3, 4+5+6, 7+8+9, 1+4+7, 2+5+8, 3+6+9, 1+5+9, 3+5+9. wenn davon eines zutraf, hat halt X oder O gewonnen, je nach wert im feld.

lg
fire
 
Du könntest erst einmal jeweils eine collection für beide spieler erstellen, beim button event rufst du dann eine methode auf und übergibst buttonzahl und spieler als parameter. Die methode überprüft, ob die zahl in der collection des spielers vorhanden ist, wenn nicht, fügt er sie hinzu und testet danach mit if-containsAll statements, ob die möglichen siegkombinationen (siehe firexs) vorhanden sind.
 
Ich würde vermutlich einfach vom zuletzt gesetzten Stein/Zeichen aus in alle relevanten Richtungen prüfen (z.B. rekursiv - passender Stein gefunden, direkt in der gleichen Richtung noch mal schauen - wobei du dabei natürlich immer die array bounds beachten musst). D.h. es gibt ein Spielfeld Objekt/byte[][] welches pro Feld die Zustände frei (0),p1(1), p2(2) haben kann.
Bei einem so kleinen Feld brauchst du dir um Performance ja nicht mal Gedanken machen, obwohl der Ansatz auch einem größeren Feld wie z.B. 4-Gewinnt gut funktioniert.

Es gibt auf jeden Fall noch enorm viel Verbesserungspotenzial bei deinem Aufbau. Du hast ja sehr aufgeblähten und redundanten Code durch die ganzen Buttons. Das muss nicht sein. ;)
 
Ich habs somit probiert:

public void win(int buttonPressed){
if(buttonPressed[0]==1&&buttonPressed[1]==1&&buttonPressed[2]==1){
System.out.println("You Win!");
}
}

Aber der Compiler meckert:

array required but int found

@Tumbleweed, ich weiß aber das verbessern mach ich nacher, erst soll es mal laufen..
 
klar meckert er, die funktion kriegt einen integer als parameter übergeben, und du erwartest ein array aus integern? irgendwas passt da nicht :)
 
Timmey92 schrieb:
klar meckert er, die funktion kriegt einen integer als parameter übergeben, und du erwartest ein array aus integern? irgendwas passt da nicht :)

Und wie soll der If nun aussehen ? Ich hab kein Plan.. :freak:
 
keine Ahnung, zumindest kannst du nicht mit einem Array arbeiten, wenn du kein Array hast? xD
 
Na ein int Array als Funktionsparameter nehmen statt einem int. Du nutzt in der if Bedingung ein Array, buttonPressed wird aber als int übgergeben.
 
also normal hast du ein
2 Dimensionales Array mit 3 auf 3 elementen
Eine Eingabe beispiel die mitte wär dann X=1 Y=1
3 Funktionen
ProofVertikal(int x, int y)
ProofHorizontal(int x, int y)
ProofDiagonal(int x, int y)


nach jeder eingabe einfach die x/y werte übergen und fertig
Ergänzung ()

Ok gerade mal über den code drübergeflogen was hälst du davon das tictactoe feld dynamisch zu erzeugen ?
usw?
ist ca 200x weniger schreibarbeit und erweiterbar
2 werte ändern und es funktioniert für ein 5x5 tic tac toe feld ;P oder 10x10 ?
würd ich dir extrem empfehlen
da dein code so wie er ist nur unübersichtlich ist
und du zuviele sachen zu beachten hast
 
Dynamisch ? Wie meinst du das ?
 
Zuletzt bearbeitet:
Also wenn du das ganze erstmal gescheit mit OOP aufbaust, würde das ganze deutlich einfacher von der Hand gehen!
 
yap da stimm ich fonce zu
am besten einfach mal neues projekt anlegen und anders probiern
 
uiui das ist jetzt mir viel zu umständlich xD

Btw. Ich arbeite mit BlueJ.
 
Ich will jetzt nicht meckern, aber:
Lösch' den Quelltext nochmal komplett und schreib alles nochmal ordentlich und sauber. Die ganzen Dopplungen da drinnen sind ja katastrophal.

Merk dir einfach in einem Array, welcher Spieler welche Felder belegt hat - für jeden Spieler EIN Array.
Es reicht ein 1-Dimensionales Array mit 9 Feldern, in welches du Bool-Werte ablegst. Nach jedem Klick überprüfen, ob drei Felder in Reihe eines Spielers vorliegen. So schwer ist das doch nicht - oder?
 
@voodoo44
sehr sinnvoll für jeden spieler ein array -.-
schonmal was von enums gehört?
der spiegelt 3 zuständer wieder frei spieler1 spieler2 dann brauchst du nur 1 array und hast nur den halben verwaltungsaufwand -.-

@GTA 3
es mag dir jetzt umständlich erscheinen und so
aba glaub mir danach wirds dir um einiges verständlicher erscheinen ;P
ich weis selbst noch als ich porgrammieren gelernt hab ;P
um so öfter du nen code neu schreibst um so besser wird er
 
Xetoxyc schrieb:
@voodoo44
sehr sinnvoll für jeden spieler ein array -.-
schonmal was von enums gehört?
der spiegelt 3 zuständer wieder frei spieler1 spieler2 dann brauchst du nur 1 array und hast nur den halben verwaltungsaufwand -.-
So würde ich das auch machen. Das erschließt sich(für mich zumindest) schon alleine daraus, das das beide Spieler auf dem gleichen Spielfeld zusammen spielen und nicht jeder für sich.
Der enum, kann man dann auch noch so erweitern, das dort die Icons, für die entsprechenden Zustände hinterlegt sind. Der enum Zustand kommt zusammen mit dem Spielfeld(Ich würde es als 3x3 Matrix anlegen), einer Varaiblen welcher Spieler am Zug ist und einem Array der Klasse Spieler mit der Größe 2, in eine Klasse(nennen wir sie mal Spiel).
Dann braucht man halt eine Klasse Spieler, in dem der Name, Anzahl Züge und Gewonne Runden gespeichert wird.
Die Labels der Spielfläche kann man in eine Klasse zusammen fassen. Man gibt allen eine definierte Größe und kann die so später einfach in ein JPanel packen welches ein Gridlayout hat. Der Kontruktor hat dann als Parameter die Koordinaten welche die das Label auf der Spielfläche einnimmt und die Klasse Spiel.

Im groben wären das die Klassen die ich für das Spiel benötigen würde(Achja und natürlich eine für den JFrame usw. )
 
@Xetoxyc:
Bin auch Neuling, kenne enum nicht wirklich.
Du willst ein enum Zustand mit den Werten "Spieler1", "Spieler2" und "frei" erstellen, dazu ein Array, welches aus den Buttons besteht?
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben