diff --git a/Semesterprojekt/.classpath b/Semesterprojekt/.classpath new file mode 100644 index 0000000..20a8b72 --- /dev/null +++ b/Semesterprojekt/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/Semesterprojekt/.gitignore b/Semesterprojekt/.gitignore new file mode 100644 index 0000000..ae3c172 --- /dev/null +++ b/Semesterprojekt/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/Semesterprojekt/.project b/Semesterprojekt/.project new file mode 100644 index 0000000..72d5182 --- /dev/null +++ b/Semesterprojekt/.project @@ -0,0 +1,17 @@ + + + Semesterprojekt + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/Semesterprojekt/.settings/org.eclipse.core.resources.prefs b/Semesterprojekt/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/Semesterprojekt/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/Semesterprojekt/.settings/org.eclipse.jdt.core.prefs b/Semesterprojekt/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..679432a --- /dev/null +++ b/Semesterprojekt/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=22 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=22 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=22 diff --git a/Semesterprojekt/src/Anzeige/GUI.java b/Semesterprojekt/src/Anzeige/GUI.java new file mode 100644 index 0000000..ac6c318 --- /dev/null +++ b/Semesterprojekt/src/Anzeige/GUI.java @@ -0,0 +1,183 @@ +package Anzeige; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import java.util.ArrayList; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +import Logik.TicTacToe; + +public class GUI extends JFrame{ + + private TicTacToe ttt; + private ArrayList buttons = new ArrayList<>(); + private JButton neuesSpiel = new JButton(); + private JButton konsole = new JButton(); + private boolean spielEnde = false; + + public GUI(TicTacToe ttt) { + + this.ttt = ttt; + + this.setTitle("TicTacToe"); + this.setSize(500,600); + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setLocationRelativeTo(null); + this.setLayout(new BorderLayout()); + + fuelleArrayList(); + + JPanel jp2 = new JPanel(); + jp2.setLayout(new BorderLayout()); + jp2.setPreferredSize(new Dimension(500,150)); + + neuesSpiel.setFocusPainted(false); + neuesSpiel.setFont(new Font("Arial",Font.PLAIN, 30)); + neuesSpiel.setBackground(new Color(65,65,65)); + neuesSpiel.setForeground(Color.WHITE); + neuesSpiel.setText("Neues Spiel beginnnen?"); + neuesSpiel.setPreferredSize(new Dimension(500,75)); + neuesSpiel.setBorderPainted(false); + neuesSpiel.addActionListener(new ActionListener() { + + + @Override + public void actionPerformed(ActionEvent e) { + + ttt.setCounter(0); + ttt.setAktuellerSpieler('X'); + spielEnde = false; + ttt.fuelleTreeMap(); + + + for(JButton b: buttons) { + + b.setForeground(Color.WHITE); + b.setText(""); + + } + + revalidate(); + repaint(); + } + }); + + jp2.add(neuesSpiel, BorderLayout.NORTH); + + konsole.setFocusPainted(false); + konsole.setFont(new Font("Arial",Font.PLAIN, 30)); + konsole.setBackground(new Color(90,90,90)); + konsole.setForeground(Color.WHITE); + konsole.setText("Zurück zur Konsole?"); + konsole.setPreferredSize(new Dimension(500,75)); + konsole.setBorderPainted(false); + konsole.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + + try { + + dispose(); + ttt.ermittleEingabeAnfang(); + + } catch (Exception e1) { + + System.out.println("Eingabe von GUI zur Konsole konnte nicht aufgerufen werden"); + } + } + + }); + + jp2.add(konsole, BorderLayout.SOUTH); + + + this.add(jp2, BorderLayout.SOUTH); + this.setVisible(true); + + } + + private void fuelleArrayList() { + + JPanel jp = new JPanel(new GridLayout(3,3)); + + for(int i = 0; i < 9; i++) { + + JButton b = new JButton(); + + //System.out.println("Button "+i+" wurde erstellt."); + + b.setFocusPainted(false); + b.setFont(new Font("Arial",Font.PLAIN, 70)); + + if(i%2 == 0) { + b.setBackground(new Color(90,90,90)); + + }else { + b.setBackground(new Color(65,65,65)); + } + + b.setForeground(Color.WHITE); + b.setBorderPainted(false); + + b.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + SwingUtilities.invokeLater(() -> { + + actionListenerInhalt(b); + + }); + } + }); + + + b.setVisible(true); + + + buttons.add(b); + jp.add(b); + this.add(jp); + } + } + + private void actionListenerInhalt(JButton b) { + + int index = buttons.indexOf(b); + if (!ttt.pruefeBelegtesFeld(index) && !spielEnde) { + ttt.belegteFelder.put(index, ttt.getAktuellerSpieler()); + b.setText("" + ttt.getAktuellerSpieler()); + + if (ttt.getCounter() >= 4 && ttt.pruefeSieg()) { + spielEnde = true; + int[] gewinnerIndexe = ttt.getGewinnerIndexe(); + + for (int i = 0; i < 3; i++) { + buttons.get(gewinnerIndexe[i]).setForeground(Color.RED); + buttons.get(gewinnerIndexe[i]).setText("" + ttt.getAktuellerSpieler()); + } + } + + ttt.setCounter(ttt.getCounter() + 1); + + if (ttt.getAktuellerSpieler() == 'X') { + ttt.setAktuellerSpieler('O'); + } else { + ttt.setAktuellerSpieler('X'); + } + + repaint(); + } + } +} diff --git a/Semesterprojekt/src/Logik/TicTacToe.java b/Semesterprojekt/src/Logik/TicTacToe.java new file mode 100644 index 0000000..f84d5e3 --- /dev/null +++ b/Semesterprojekt/src/Logik/TicTacToe.java @@ -0,0 +1,192 @@ +package Logik; + +import java.util.Scanner; +import java.util.TreeMap; + +import Anzeige.GUI; + +public class TicTacToe { + + public TreeMap belegteFelder = new TreeMap<>(); + + private int counter; + private GUI gui; + private char aktuellerSpieler; + private int ausgewaehltesFeld; + private int[] gewinnerIndexe = new int[3]; + + public TicTacToe() throws Exception { + + ermittleEingabeAnfang(); + + } + + public void ermittleEingabeAnfang() throws Exception { + + //setzt praktisch werte zurück + fuelleTreeMap(); + aktuellerSpieler = 'X'; + counter = 0; + + Scanner s = new Scanner(System.in); + System.out.println("\nWollen Sie mit einer GUI('gui' eingeben) oder mit der Konsole('konsole' eingeben) spielen?"); + String befehl = s.nextLine(); + + if (befehl.equalsIgnoreCase("gui")) { + + System.out.println("Um ein Feld für ein Zug auszuwählen muss dieses Feld angeklickt werden..."); + + gui = new GUI(this); + + } else if (befehl.equalsIgnoreCase("konsole")) { + + gibAktuellenStandAus(); + + System.out.println("Die Felder sind von 0 bis 8 durchnummerriert.\nUm ein Feld für ein Zug auszuwählen muss die Zahl des Feldes eingegeben werden..."); + + for (int i = 0; i < 9; i++) { + + erfasseEingabe(); + gibAktuellenStandAus(); + + if (i >= 4 && pruefeSieg()) break; + + if (aktuellerSpieler == 'X')aktuellerSpieler = 'O'; + else aktuellerSpieler = 'X'; + + } + + ermittleEingabeAnfang(); + + }else if(befehl.equalsIgnoreCase("ende")) { + System.out.println("Spiel wird beendet."); + System.exit(0); + }else { + System.out.println("Eingabe ungültig!\nVersuchen Sie es erneut."); + ermittleEingabeAnfang(); + } + } + + public void fuelleTreeMap() { + for (int i = 0; i < 9; i++) { + belegteFelder.put(i, (char) (48 + i)); + } + } + + private void gibAktuellenStandAus() { + + System.out.println("\n-------------"); + for (int i = 0; i < 9; i+=3) { + System.out.printf("|%2s |%2s |%2s |", belegteFelder.get(i), belegteFelder.get(i+1), belegteFelder.get(i+2)); + System.out.println("\n-------------"); + } + System.out.println(); + } + + private void erfasseEingabe() throws Exception { + + Scanner s = new Scanner(System.in); + + System.out.print("\nSpieler " + aktuellerSpieler + " ist am Zug!\nGeben Sie eine Feldnummer ein:\n>>"); + + try { + ausgewaehltesFeld = s.nextInt(); + System.out.println("Die Eingabe: " + ausgewaehltesFeld); + if(pruefeBelegtesFeld(ausgewaehltesFeld)) throw new Exception(); + } catch (Exception e) { + System.out.println("Es wurde keine passende Eingabe getätigt,\nversuchen Sie es erneut..."); + erfasseEingabe(); + } + } + + public synchronized boolean pruefeBelegtesFeld(int index) { + + System.out.println("Zu pruefender Index: "+index); + if (belegteFelder.get(index) == 'X' || belegteFelder.get(index) == 'O') { + System.out.println("Feld " + index + " schon belegt, machen Sie eine erneute Eingabe..."); + return true; + } + + belegteFelder.put(index, aktuellerSpieler); + return false; + + } + + public boolean pruefeSieg() { + + if ((belegteFelder.get(0) == aktuellerSpieler) && (belegteFelder.get(1) == aktuellerSpieler) && (belegteFelder.get(2) == aktuellerSpieler)) { + System.out.println("Spieler " + aktuellerSpieler + " hat drei '" + aktuellerSpieler+ "' in der ersten Waagerechte und hat somit gewonnen!"); + gewinnerIndexe[0] = 0; + gewinnerIndexe[1] = 1; + gewinnerIndexe[2] = 2; + return true; + } else if ((belegteFelder.get(3) == aktuellerSpieler) && (belegteFelder.get(4) == aktuellerSpieler) && (belegteFelder.get(5) == aktuellerSpieler)) { + System.out.println("Spieler " + aktuellerSpieler + " hat drei '" + aktuellerSpieler+ "' in der zweiten Waagerechte und hat somit gewonnen!"); + gewinnerIndexe[0] = 3; + gewinnerIndexe[1] = 4; + gewinnerIndexe[2] = 5; + return true; + } else if ((belegteFelder.get(6) == aktuellerSpieler) && (belegteFelder.get(7) == aktuellerSpieler) && (belegteFelder.get(8) == aktuellerSpieler)) { + System.out.println("Spieler " + aktuellerSpieler + " hat drei '" + aktuellerSpieler+ "' in der dritten Waagerechte und hat somit gewonnen!"); + gewinnerIndexe[0] = 6; + gewinnerIndexe[1] = 7; + gewinnerIndexe[2] = 8; + return true; + } else if ((belegteFelder.get(0) == aktuellerSpieler) && (belegteFelder.get(3) == aktuellerSpieler) && (belegteFelder.get(6) == aktuellerSpieler)) { + System.out.println("Spieler " + aktuellerSpieler + " hat drei '" + aktuellerSpieler+ "' in der ersten Senkrechte und hat somit gewonnen!"); + gewinnerIndexe[0] = 0; + gewinnerIndexe[1] = 3; + gewinnerIndexe[2] = 6; + return true; + } else if ((belegteFelder.get(1) == aktuellerSpieler) && (belegteFelder.get(4) == aktuellerSpieler) && (belegteFelder.get(7) == aktuellerSpieler)) { + System.out.println("Spieler " + aktuellerSpieler + " hat drei '" + aktuellerSpieler+ "' in der zweiten Senkrechte und hat somit gewonnen!"); + gewinnerIndexe[0] = 1; + gewinnerIndexe[1] = 4; + gewinnerIndexe[2] = 7; + return true; + } else if ((belegteFelder.get(2) == aktuellerSpieler) && (belegteFelder.get(5) == aktuellerSpieler) && (belegteFelder.get(8) == aktuellerSpieler)) { + System.out.println("Spieler " + aktuellerSpieler + " hat drei '" + aktuellerSpieler+ "' in der dritten Senkrechte und hat somit gewonnen!"); + gewinnerIndexe[0] = 2; + gewinnerIndexe[1] = 5; + gewinnerIndexe[2] = 8; + return true; + } else if ((belegteFelder.get(0) == aktuellerSpieler) && (belegteFelder.get(4) == aktuellerSpieler) && (belegteFelder.get(8) == aktuellerSpieler)) { + System.out.println("Spieler " + aktuellerSpieler + " hat drei '" + aktuellerSpieler+ "' in der ersten Diagonale und hat somit gewonnen!"); + gewinnerIndexe[0] = 0; + gewinnerIndexe[1] = 4; + gewinnerIndexe[2] = 8; + return true; + } else if ((belegteFelder.get(2) == aktuellerSpieler) && (belegteFelder.get(4) == aktuellerSpieler) && (belegteFelder.get(6) == aktuellerSpieler)) { + System.out.println("Spieler " + aktuellerSpieler + " hat drei '" + aktuellerSpieler+ "' in der zweiten Diagonale und hat somit gewonnen!"); + gewinnerIndexe[0] = 2; + gewinnerIndexe[1] = 4; + gewinnerIndexe[2] = 6; + return true; + } + return false; + } + + public void setAktuellerSpieler(char aktuellerSpieler) { + this.aktuellerSpieler = aktuellerSpieler; + } + + public char getAktuellerSpieler() { + return aktuellerSpieler; + } + + public TreeMap getBelegteFelder() { + return belegteFelder; + } + + public int[] getGewinnerIndexe() { + return gewinnerIndexe; + } + + public int getCounter() { + return counter; + } + + public void setCounter(int counter) { + this.counter = counter; + } +} diff --git a/Semesterprojekt/src/Logik/main.java b/Semesterprojekt/src/Logik/main.java new file mode 100644 index 0000000..019736a --- /dev/null +++ b/Semesterprojekt/src/Logik/main.java @@ -0,0 +1,14 @@ +package Logik; + +public class main { + + public static void main(String[] args) { + + try { + TicTacToe ttt = new TicTacToe(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +}