From 659bfd3fa8991685fda842d25bab52718cb2164c Mon Sep 17 00:00:00 2001 From: Marc Michalsky Date: Fri, 24 Apr 2020 23:14:34 +0200 Subject: [PATCH] Initial Commit --- .gitignore | 93 ++++++++++ .idea/artifacts/tictactoe_jar.xml | 8 + .idea/inspectionProfiles/Project_Default.xml | 10 ++ .idea/misc.xml | 9 + .idea/modules.xml | 8 + .idea/tictactoe.iml | 11 ++ .idea/vcs.xml | 6 + README.md | 2 + img/TicTacToe.png | Bin 0 -> 14531 bytes out/artifacts/tictactoe_jar/tictactoe.jar | Bin 0 -> 19740 bytes src/META-INF/MANIFEST.MF | 3 + src/gfn/marc/CSVDatei.java | 75 ++++++++ src/gfn/marc/Feld.java | 87 ++++++++++ src/gfn/marc/Form.java | 64 +++++++ src/gfn/marc/Gewinner.java | 111 ++++++++++++ src/gfn/marc/Kreis.java | 22 +++ src/gfn/marc/Kreuz.java | 24 +++ src/gfn/marc/Rechteck.java | 44 +++++ src/gfn/marc/Speicher.java | 53 ++++++ src/gfn/marc/Spiel.java | 170 +++++++++++++++++++ src/gfn/marc/Spieler.java | 52 ++++++ src/gfn/marc/Spielfeld.java | 69 ++++++++ src/gfn/marc/TicTacToe.java | 116 +++++++++++++ src/gfn/marc/Zug.java | 136 +++++++++++++++ 24 files changed, 1173 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/artifacts/tictactoe_jar.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/tictactoe.iml create mode 100644 .idea/vcs.xml create mode 100644 README.md create mode 100644 img/TicTacToe.png create mode 100644 out/artifacts/tictactoe_jar/tictactoe.jar create mode 100644 src/META-INF/MANIFEST.MF create mode 100644 src/gfn/marc/CSVDatei.java create mode 100644 src/gfn/marc/Feld.java create mode 100644 src/gfn/marc/Form.java create mode 100644 src/gfn/marc/Gewinner.java create mode 100644 src/gfn/marc/Kreis.java create mode 100644 src/gfn/marc/Kreuz.java create mode 100644 src/gfn/marc/Rechteck.java create mode 100644 src/gfn/marc/Speicher.java create mode 100644 src/gfn/marc/Spiel.java create mode 100644 src/gfn/marc/Spieler.java create mode 100644 src/gfn/marc/Spielfeld.java create mode 100644 src/gfn/marc/TicTacToe.java create mode 100644 src/gfn/marc/Zug.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eec0749 --- /dev/null +++ b/.gitignore @@ -0,0 +1,93 @@ + +# Created by https://www.gitignore.io/api/intellij +# Edit at https://www.gitignore.io/?templates=intellij + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/**/sonarlint/ + +# SonarQube Plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator/ + +# End of https://www.gitignore.io/api/intellij diff --git a/.idea/artifacts/tictactoe_jar.xml b/.idea/artifacts/tictactoe_jar.xml new file mode 100644 index 0000000..e4c3a6e --- /dev/null +++ b/.idea/artifacts/tictactoe_jar.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/out/artifacts/tictactoe_jar + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..146ab09 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e65fee6 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b85d8e1 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/tictactoe.iml b/.idea/tictactoe.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/.idea/tictactoe.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9d17d96 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Tic Tac Toe +![Beispielbild](img/TicTacToe.png) \ No newline at end of file diff --git a/img/TicTacToe.png b/img/TicTacToe.png new file mode 100644 index 0000000000000000000000000000000000000000..9da8c593d3abd27139d059107ba44b721dc15cf2 GIT binary patch literal 14531 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 spieler) throws IOException { + String pfadname = this.pfad + this.dateiname; + File csvDatei = new File(pfadname); + File verzeichnis = csvDatei.getParentFile(); + if (verzeichnis != null) { + if (!verzeichnis.exists()) { + verzeichnis.mkdirs(); + } + } + + FileWriter csvSchreiben = new FileWriter(csvDatei); + + // schreibe Zeile + for (Spieler s : spieler) { + csvSchreiben.append(s.getName()).append(";").append(String.valueOf(s.getPunktestand())).append("\n"); + } + csvSchreiben.flush(); + csvSchreiben.close(); + } + + // Methode: lese() + public ArrayList lese() throws FileNotFoundException { + String pfadname = this.pfad + this.dateiname; + File csvDatei; + + // neues FileObjekt erstellen + csvDatei = new File(pfadname); + + if (csvDatei.exists()) { + Scanner eingabe; + + // neues Scanner-Objekt erstellen + eingabe = new Scanner(csvDatei); + + + // Auslesen der Daten in einer Schleife und Ablegen in einer ArrayList + ArrayList ausgabe = new ArrayList<>(); + int i = 0; + while(eingabe.hasNextLine()){ + String zeile = eingabe.nextLine(); + ausgabe.add(zeile); + i++; + } + + // Verbindung schliessen und ArrayList zurückgeben + eingabe.close(); + return ausgabe; + } + return null; + } + +} diff --git a/src/gfn/marc/Feld.java b/src/gfn/marc/Feld.java new file mode 100644 index 0000000..2be9960 --- /dev/null +++ b/src/gfn/marc/Feld.java @@ -0,0 +1,87 @@ +package gfn.marc; + +import javax.swing.*; + +public class Feld { + private static int feldAnzahl = 0; + private int feldId; + private Rechteck rechteck; + private JLabel label = new JLabel(); + private boolean gesetzt; + private Kreuz kreuz; + private Kreis kreis; + + static { + + } + + // Konstruktor + public Feld(Rechteck rechteck) { + if (feldAnzahl == 9) { + Feld.feldAnzahl = 0; + } + this.rechteck = rechteck; + Feld.feldAnzahl++; + this.feldId = Feld.feldAnzahl; + + // Label Position und Größe des Rechtecks zuweisen + this.label.setBounds((this.rechteck.getPara1() - Spielfeld.KORREKTUR_X), (this.rechteck.getPara2() - + Spielfeld.KORREKTUR_Y), this.rechteck.getPara3(), this.rechteck.getPara4()); + this.label.setVisible(true); + + kreuz = new Kreuz((int) (rechteck.getPara1() + (rechteck.getPara3() * 0.1)), + ((int) (rechteck.getPara2() + (rechteck.getPara4() * 0.1))), + ((int) (rechteck.getPara1() + (rechteck.getPara3() * 0.9))), + ((int) (rechteck.getPara2() + (rechteck.getPara4() * 0.9)))); + + kreis = new Kreis((int) (rechteck.getPara1() + (0.1 * rechteck.getPara3())), + (int) (rechteck.getPara2() + (0.1 * rechteck.getPara4())), + ((int) (rechteck.getPara3() * 0.8)), + ((int) (rechteck.getPara4() * 0.8))); + + } + + public void setZeichen(Form form) { + if (form.getClass() == kreuz.getClass()) { + kreuz.setSichtbar(true); + kreis.setSichtbar(false); + } else { + kreis.setSichtbar(true); + kreuz.setSichtbar(false); + } + gesetzt = true; + + } + + public JLabel getLabel() { + return label; + } + + public Rechteck getRechteck() { + return rechteck; + } + + public Kreuz getKreuz() { + return kreuz; + } + + public void setKreuz(Kreuz kreuz) { + this.kreuz = kreuz; + } + + public Kreis getKreis() { + return kreis; + } + + public void setKreis(Kreis kreis) { + this.kreis = kreis; + } + + public int getFeldId() { + return feldId; + } + + public boolean isGesetzt() { + return gesetzt; + } +} diff --git a/src/gfn/marc/Form.java b/src/gfn/marc/Form.java new file mode 100644 index 0000000..20833b3 --- /dev/null +++ b/src/gfn/marc/Form.java @@ -0,0 +1,64 @@ +package gfn.marc; + +import java.awt.*; + +public abstract class Form { + private int para1; + private int para2; + private int para3; + private int para4; + private boolean sichtbar; + + public Form() { + } + + public Form(int para1, int para2, int para3, int para4) { + this.para1 = para1; + this.para2 = para2; + this.para3 = para3; + this.para4 = para4; + } + + public abstract void paintMe(Graphics2D g); + + public int getPara1() { + return para1; + } + + public int getPara2() { + return para2; + } + + public int getPara3() { + return para3; + } + + public int getPara4() { + return para4; + } + + public boolean isSichtbar() { + return sichtbar; + } + + public void setPara1(int para1) { + this.para1 = para1; + } + + public void setPara2(int para2) { + this.para2 = para2; + } + + public void setPara3(int para3) { + this.para3 = para3; + } + + public void setPara4(int para4) { + this.para4 = para4; + } + + public void setSichtbar(boolean sichtbar) { + this.sichtbar = sichtbar; + } + +} diff --git a/src/gfn/marc/Gewinner.java b/src/gfn/marc/Gewinner.java new file mode 100644 index 0000000..39eb0d4 --- /dev/null +++ b/src/gfn/marc/Gewinner.java @@ -0,0 +1,111 @@ +package gfn.marc; + +public class Gewinner { + private static Spieler spieler; + + public static Spieler ermittleGewinner(Spiel spiel) { + + // Prüfe Horizontale + for (int i = 0; i <= 8; i += 3) { + + if (spiel.getSpielfeld().getFelder()[i].getKreuz().isSichtbar() && + spiel.getSpielfeld().getFelder()[i + 1].getKreuz().isSichtbar() && + spiel.getSpielfeld().getFelder()[i + 2].getKreuz().isSichtbar()) { + Gewinner.spieler = spiel.getSpieler1(); + spiel.getSpieler1().setPunktestand(); + spiel.getSpielfeld().getFelder()[i].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[i + 1].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[i + 2].getRechteck().setGewinnerFeld(true); + break; + } + + if (spiel.getSpielfeld().getFelder()[i].getKreis().isSichtbar() && + spiel.getSpielfeld().getFelder()[i + 1].getKreis().isSichtbar() && + spiel.getSpielfeld().getFelder()[i + 2].getKreis().isSichtbar()) { + Gewinner.spieler = spiel.getSpieler2(); + spiel.getSpieler2().setPunktestand(); + spiel.getSpielfeld().getFelder()[i].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[i + 1].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[i + 2].getRechteck().setGewinnerFeld(true); + } + } + + // Prüfe Vertikale + for (int i = 0; i < 3; i++) { + if (spiel.getSpielfeld().getFelder()[i].getKreuz().isSichtbar() && + spiel.getSpielfeld().getFelder()[i + 3].getKreuz().isSichtbar() && + spiel.getSpielfeld().getFelder()[i + 6].getKreuz().isSichtbar()) { + Gewinner.spieler = spiel.getSpieler1(); + spiel.getSpieler1().setPunktestand(); + spiel.getSpielfeld().getFelder()[i].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[i + 3].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[i + 6].getRechteck().setGewinnerFeld(true); + break; + } + + + if (spiel.getSpielfeld().getFelder()[i].getKreis().isSichtbar() && + spiel.getSpielfeld().getFelder()[i + 3].getKreis().isSichtbar() && + spiel.getSpielfeld().getFelder()[i + 6].getKreis().isSichtbar()) { + Gewinner.spieler = spiel.getSpieler2(); + spiel.getSpieler2().setPunktestand(); + spiel.getSpielfeld().getFelder()[i].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[i + 3].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[i + 6].getRechteck().setGewinnerFeld(true); + } + + } + + // Prüfe Diagonale + if (spiel.getSpielfeld().getFelder()[0].getKreuz().isSichtbar() && + spiel.getSpielfeld().getFelder()[4].getKreuz().isSichtbar() && + spiel.getSpielfeld().getFelder()[8].getKreuz().isSichtbar()) { + Gewinner.spieler = spiel.getSpieler1(); + spiel.getSpieler1().setPunktestand(); + spiel.getSpielfeld().getFelder()[0].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[4].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[8].getRechteck().setGewinnerFeld(true); + } + + if (spiel.getSpielfeld().getFelder()[0].getKreis().isSichtbar() && + spiel.getSpielfeld().getFelder()[4].getKreis().isSichtbar() && + spiel.getSpielfeld().getFelder()[8].getKreis().isSichtbar()) { + Gewinner.spieler = spiel.getSpieler2(); + spiel.getSpieler2().setPunktestand(); + spiel.getSpielfeld().getFelder()[0].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[4].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[8].getRechteck().setGewinnerFeld(true); + } + + if (spiel.getSpielfeld().getFelder()[2].getKreuz().isSichtbar() && + spiel.getSpielfeld().getFelder()[4].getKreuz().isSichtbar() && + spiel.getSpielfeld().getFelder()[6].getKreuz().isSichtbar()) { + Gewinner.spieler = spiel.getSpieler1(); + spiel.getSpieler1().setPunktestand(); + spiel.getSpielfeld().getFelder()[2].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[4].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[6].getRechteck().setGewinnerFeld(true); + } + + if (spiel.getSpielfeld().getFelder()[2].getKreis().isSichtbar() && + spiel.getSpielfeld().getFelder()[4].getKreis().isSichtbar() && + spiel.getSpielfeld().getFelder()[6].getKreis().isSichtbar()) { + Gewinner.spieler = spiel.getSpieler2(); + spiel.getSpieler2().setPunktestand(); + spiel.getSpielfeld().getFelder()[2].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[4].getRechteck().setGewinnerFeld(true); + spiel.getSpielfeld().getFelder()[6].getRechteck().setGewinnerFeld(true); + } + + return Gewinner.spieler; + + } + + public static Spieler getSpieler() { + return spieler; + } + + public static void setSpieler(Spieler spieler) { + Gewinner.spieler = spieler; + } +} diff --git a/src/gfn/marc/Kreis.java b/src/gfn/marc/Kreis.java new file mode 100644 index 0000000..6865d67 --- /dev/null +++ b/src/gfn/marc/Kreis.java @@ -0,0 +1,22 @@ +package gfn.marc; + +import java.awt.*; + +public class Kreis extends Form { + + public Kreis() { + } + + public Kreis(int para1, int para2, int para3, int para4) { + super(para1, para2, para3, para4); + } + + @Override + public void paintMe(Graphics2D g) { + if (this.isSichtbar()) { + g.setColor(Color.red); + g.setStroke(new BasicStroke(10)); + g.drawOval(this.getPara1(), this.getPara2(), this.getPara3(), this.getPara4()); + } + } +} diff --git a/src/gfn/marc/Kreuz.java b/src/gfn/marc/Kreuz.java new file mode 100644 index 0000000..4865aca --- /dev/null +++ b/src/gfn/marc/Kreuz.java @@ -0,0 +1,24 @@ +package gfn.marc; + +import java.awt.*; + +public class Kreuz extends Form { + + public Kreuz() { + } + + public Kreuz(int para1, int para2, int para3, int para4) { + super(para1, para2, para3, para4); + } + + @Override + public void paintMe(Graphics2D g) { + if (this.isSichtbar()) { + g.setColor(Color.blue); + g.setStroke(new BasicStroke(10)); + g.drawLine(this.getPara1(), this.getPara2(), this.getPara3(), this.getPara4()); + g.drawLine(this.getPara3(), this.getPara2(), this.getPara1(), this.getPara4()); + } + } + +} diff --git a/src/gfn/marc/Rechteck.java b/src/gfn/marc/Rechteck.java new file mode 100644 index 0000000..559d033 --- /dev/null +++ b/src/gfn/marc/Rechteck.java @@ -0,0 +1,44 @@ +package gfn.marc; + +import java.awt.*; + +public class Rechteck extends Form { + private boolean gewinnerFeld = false; + public Rechteck(int para1, int para2, int para3, int para4) { + super(para1, para2, para3, para4); + } + + @Override + public void paintMe(Graphics2D g) { + if (this.isSichtbar()) { + g.setColor(Color.black); + g.setStroke(new BasicStroke(5)); + g.drawRect(this.getPara1(), this.getPara2(), this.getPara3(), this.getPara4()); + } + } + + public void faerbeGruen(Graphics2D g) { + if (this.isGewinnerFeld()) { + g.setColor(Color.green); + g.fillRect(this.getPara1(), this.getPara2(), this.getPara3(), this.getPara4()); + g.setColor(Color.black); + g.setStroke(new BasicStroke(5)); + g.drawRect(this.getPara1(), this.getPara2(), this.getPara3(), this.getPara4()); + } + } + + public void paintId(Graphics g, int i) { + i += 47; + char[] c = {(char) i}; + g.drawChars(c, 0, 1, ((int) (this.getPara1() + (0.5 * this.getPara3()))), + ((int) (this.getPara2() + (0.5 * this.getPara4())))); + } + + public boolean isGewinnerFeld() { + return gewinnerFeld; + } + + public void setGewinnerFeld(boolean gewinnerFeld) { + this.gewinnerFeld = gewinnerFeld; + } +} diff --git a/src/gfn/marc/Speicher.java b/src/gfn/marc/Speicher.java new file mode 100644 index 0000000..424e54c --- /dev/null +++ b/src/gfn/marc/Speicher.java @@ -0,0 +1,53 @@ +package gfn.marc; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; + +public class Speicher { + + private static final CSVDatei csv = new CSVDatei(benutzerVerzeichnisErmitteln() + ".TicTacToe" + + File.separator, "TicTacToe_spielstand.csv"); + + public static void spielstaendeEinlesen() throws FileNotFoundException { + ArrayList eintraege = csv.lese(); + + if (eintraege != null && !eintraege.isEmpty()) { + for (String zeile : eintraege) { + String[] eintrag = zeile.split(";"); + if (eintrag.length != 0) { + String spielername = eintrag[0]; + String punktestand = eintrag[1]; + new Spieler(spielername, Integer.parseInt(punktestand)); + } + } + } + } + + public static void spielstaendeSpeichern() throws IOException { + csv.schreibe(Spieler.getSpieler()); + } + + public static String benutzerVerzeichnisErmitteln() { + + String os = System.getProperty("os.name").toLowerCase(); + if (os.contains("win")){ + //Windows + return "C:\\users\\"+ System.getProperty("user.name") +"\\"; + } + else if (os.contains("osx")){ + //OSX + return "/home/" + System.getProperty("user.name" + "/"); + } + else if (os.contains("nix") || os.contains("aix") || os.contains("nux")){ + //Linux/Unix + return "/home/" + System.getProperty("user.name") + "/"; + } else { + System.err.println("Benutzerverzeichnis konnte nicht gefunden werden."); + return ""; + } + } + + +} diff --git a/src/gfn/marc/Spiel.java b/src/gfn/marc/Spiel.java new file mode 100644 index 0000000..afe48c4 --- /dev/null +++ b/src/gfn/marc/Spiel.java @@ -0,0 +1,170 @@ +package gfn.marc; + +import javax.swing.*; +import java.awt.*; + +public class Spiel { + + private static Spieler spieler1; + private static Spieler spieler2; + private Frame f; + private Spielfeld spielfeld; + + + Spiel(Frame f, Spielfeld spielfeld) throws InterruptedException { + + this.f = f; + + // Spielernamen festlegen vor erstem Spiel + if (spieler1 == null || spieler2 == null) { + boolean neuerSpieler1 = false; + + // Eingebdialog: Name Spieler1 + String eingabe = ""; + while (true) { + if (Spieler.getSpieler().size() > 1) { + eingabe = JOptionPane.showInputDialog(f, "Wie soll Spieler1 heißen?", + Spieler.getSpieler().get(Spieler.getSpieler().size() - 2).getName()); + } else { + eingabe = JOptionPane.showInputDialog(f, "Wie soll Spieler1 heißen?", + "Spieler1"); + } + if (eingabe == null || !eingabe.contains(";")) { + break; + } else { + JOptionPane.showMessageDialog(null, + "Der Spielername darf kein Semikolon enthalten"); + } + } + // Wenn der eingegebene Spielername vorhanden ist + if ( eingabe != null && !eingabe.equals("")) { + for (Spieler spieler : Spieler.getSpieler()) { + if (spieler != null) { + if (eingabe.equals(spieler.getName())) { + spieler1 = spieler; + spieler1.setForm(new Kreuz()); + break; + } + } + } + // Wenn kein Spielername eingegeben wurde + } else { + spieler1 = new Spieler(); + spieler1.setForm(new Kreuz()); + spieler1.setName("Spieler1"); + } + // Wenn ein neuer Spielername eingegeben wurde + if (spieler1 == null) { + spieler1 = new Spieler(); + spieler1.setForm(new Kreuz()); + spieler1.setName(eingabe); + neuerSpieler1 = true; + } + + // Eingebdialog: Name Spieler2 + while (true) { + if (neuerSpieler1 && Spieler.getSpieler().size() > 1) { + eingabe = JOptionPane.showInputDialog(f, "Wie soll Spieler2 heißen?", + "Spieler2"); + } else if (Spieler.getSpieler().size() > 1) { + eingabe = JOptionPane.showInputDialog(f, "Wie soll Spieler2 heißen?", + Spieler.getSpieler().get(Spieler.getSpieler().size() - 1).getName()); + } else { + eingabe = JOptionPane.showInputDialog(f, "Wie soll Spieler2 heißen?", + "Spieler2"); + } + if (eingabe == null || !eingabe.contains(";")) { + break; + } else { + JOptionPane.showMessageDialog(null, + "Der Spielername darf kein Semikolon enthalten"); + } + } + + // Wenn der eingegebene Spielername vorhanden ist + if (eingabe != null && !eingabe.equals("")) { + for (Spieler spieler : Spieler.getSpieler()) { + if (spieler != null) { + if (eingabe.equals(spieler.getName())) { + spieler2 = spieler; + spieler2.setForm(new Kreis()); + break; + } + } + } + // Wenn kein Spielername eingegeben wurde + } else { + spieler2 = new Spieler(); + spieler2.setForm(new Kreis()); + spieler2.setName("Spieler2"); + } + // Wenn ein neuer Spielername eingegeben wurde + if (spieler2 == null) { + spieler2 = new Spieler(); + spieler2.setForm(new Kreis()); + spieler2.setName(eingabe); + } + } + +// Neues Spielfeld anlegen + this.spielfeld =spielfeld; + + +} + + public boolean spielen() { + + // Züge durchführen + try { + Zug zug = new Zug(); + // Zufälliger Spieler startet + double startSpieler = Math.random(); + while (Gewinner.ermittleGewinner(this) == null && Zug.getZugNummer() < 9) { + if (Zug.getZugNummer() % 2 == 0) { + if (startSpieler <= 0.5d) { + Zug.macheZug(spieler1); + } else { + Zug.macheZug(spieler2); + } + } else { + if (startSpieler > 0.5d) { + Zug.macheZug(spieler1); + } else { + Zug.macheZug(spieler2); + } + } + } + f.repaint(); + Thread.sleep(500); + f.setTitle(Spiel.spieler1.getName() + ": " + Spiel.spieler1.getPunktestand() + " | " + + Spiel.spieler2.getName() + ": " + Spiel.spieler2.getPunktestand()); + if (Gewinner.getSpieler() == null) { + // Noch ein Spiel? + int auswahl = JOptionPane.showOptionDialog(f, "Unentschieden!\nNoch ein Spiel?", "Tic Tac Toe", JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, null, null, null); + return auswahl != JOptionPane.NO_OPTION; + } else { + // Noch ein Spiel? + int auswahl = JOptionPane.showOptionDialog(f, Gewinner.getSpieler().getName() + " hat gewonnen!\nNoch ein Spiel?", "Tic Tac Toe", JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, null, null, null); + return auswahl != JOptionPane.NO_OPTION; + } + } catch (InterruptedException ie) { + System.err.println("Da ist was schief gelaufen!"); + } + return false; + } + + + public Spielfeld getSpielfeld() { + return spielfeld; + } + + public Spieler getSpieler1() { + return spieler1; + } + + public Spieler getSpieler2() { + return spieler2; + } +} diff --git a/src/gfn/marc/Spieler.java b/src/gfn/marc/Spieler.java new file mode 100644 index 0000000..84569a6 --- /dev/null +++ b/src/gfn/marc/Spieler.java @@ -0,0 +1,52 @@ +package gfn.marc; + +import java.util.ArrayList; + +public class Spieler { + + private static ArrayList spieler = new ArrayList<>(); + + private String name; + private Form zeichen; + private int punktestand; + + // Konstruktor zum erzeugen der Spieler im aktuellen Spiel + public Spieler() { + Spieler.spieler.add(this); + } + + // Konstruktor zum Laden der Spieler*innen aus dem Speicher + public Spieler(String name, int punktestand) { + this.name = name; + this.punktestand = punktestand; + Spieler.spieler.add(this); + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public Form getForm() { + return zeichen; + } + + public void setForm(Form form) { + this.zeichen = form; + } + + public int getPunktestand() { + return punktestand; + } + + public void setPunktestand() { + this.punktestand++; + } + + public static ArrayList getSpieler() { + return spieler; + } +} diff --git a/src/gfn/marc/Spielfeld.java b/src/gfn/marc/Spielfeld.java new file mode 100644 index 0000000..b14bd96 --- /dev/null +++ b/src/gfn/marc/Spielfeld.java @@ -0,0 +1,69 @@ +package gfn.marc; + +import java.awt.*; + +import static gfn.marc.TicTacToe.fensterGroesse; +import static gfn.marc.TicTacToe.DEBUG; + +public class Spielfeld { + + final static int KORREKTUR_X = 0; // Korrektur der Spielfeldposition auf X Achse + final static int KORREKTUR_Y = 25; // Korrektur der Spielfeldposition auf Y Achse + + private int quadrant = fensterGroesse / 3; + private Frame f; + private Feld[] felder = new Feld[9]; + private boolean spielfeldExistiert; + + // Unterteilung des Spielfelds in rechteckige Felder + public Spielfeld(Frame f) { + this.f = f; + int k = 0; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + felder[k] = new Feld(new Rechteck(((this.quadrant * j) + KORREKTUR_X), (KORREKTUR_Y + (this.quadrant * i)), + this.quadrant, this.quadrant)); + k++; + } + } + } + + // zeichne Spielfeld + public void zeichneSpielfeld(Graphics2D g) { + + for (Feld feld : this.felder) { + feld.getRechteck().setSichtbar(true); + feld.getRechteck().paintMe(g); + // Zahlen auf Felder einblenden, wenn Debug-Mode aktiviert ist + this.f.add(feld.getLabel()); + if (DEBUG) { + feld.getRechteck().paintId(g, feld.getFeldId()); + } + } + } + + // Spielfeld äufräumen + public void aufraeumen() { + + felder = null; + this.f = null; + + } + + public Feld[] getFelder() { + return felder; + } + + public Frame getF() { + return f; + } + + public boolean isSpielfeldExistiert() { + return spielfeldExistiert; + } + + public void setSpielfeldExistiert(boolean spielfeldExistiert) { + this.spielfeldExistiert = spielfeldExistiert; + } +} + diff --git a/src/gfn/marc/TicTacToe.java b/src/gfn/marc/TicTacToe.java new file mode 100644 index 0000000..28dba34 --- /dev/null +++ b/src/gfn/marc/TicTacToe.java @@ -0,0 +1,116 @@ +package gfn.marc; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.io.IOException; + +import static gfn.marc.Spielfeld.KORREKTUR_X; +import static gfn.marc.Spielfeld.KORREKTUR_Y; + + +public class TicTacToe extends JFrame { + + static Frame f; + static int fensterGroesse; + static Spielfeld spielfeld; + static Spiel spiel; + static boolean DEBUG = false; + + public static void main(String[] args) throws IOException { + + // Laden der Spielstände + Speicher.spielstaendeEinlesen(); + + // Eingabedialog: Fenstergröße + String eingabe = ""; + while (true) { + eingabe = JOptionPane.showInputDialog(f, "Wie groß soll das Spielfeld sein? (in Pixel)", + "600"); + try { + fensterGroesse = Integer.parseInt(eingabe); + break; + } catch (NumberFormatException nfe) { + JOptionPane.showMessageDialog(null, "Die Eingabe muss eine Zahl sein!"); + } + } + + + // Spiel starten + try { + boolean nochEinSpiel = true; + while (nochEinSpiel) { + + f = new TicTacToe(); + f.setSize((fensterGroesse + KORREKTUR_X), (fensterGroesse + KORREKTUR_Y)); // Fenster Breite und Höhe + f.setLocationRelativeTo(null); + f.setLayout(null); + f.setResizable(false); + f.setTitle("Tic Tac Toe"); // Fenster Titeltext + f.setVisible(true); // Fenster anzeigen + f.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + try { + Speicher.spielstaendeSpeichern(); + } catch (IOException ex) { + ex.printStackTrace(); + } + System.exit(0); // sofortiges Programmende + } + }); + + spielfeld = new Spielfeld(f); + spiel = new Spiel(f, spielfeld); + nochEinSpiel = spiel.spielen(); + + // aufräumen + spielfeld.aufraeumen(); + Gewinner.setSpieler(null); + spiel = null; + spielfeld = null; + Zug.setZugNummer(0); + f.setVisible(false); + f = null; + } + } catch (InterruptedException ie) { + System.err.println("Da ist was schief gelaufen!"); + } + Speicher.spielstaendeSpeichern(); + System.exit(0); // sofortiges Programmende + + } + + public static Spielfeld getSpielfeld() { + return spielfeld; + } + + public static Frame getF() { + return f; + } + + public void paint(Graphics g) { + + Graphics2D g2 = (Graphics2D) g; + + if (spielfeld != null) { + spielfeld.zeichneSpielfeld(g2); + spielfeld.setSpielfeldExistiert(true); + } + + if (spielfeld != null) { + for (Feld feld : spielfeld.getFelder()) { + feld.getKreuz().paintMe(g2); + feld.getKreis().paintMe(g2); + } + } + + if (spielfeld != null) { + for (Feld feld : spielfeld.getFelder()) { + feld.getRechteck().faerbeGruen(g2); + feld.getKreuz().paintMe(g2); + feld.getKreis().paintMe(g2); + } + } + } + +} \ No newline at end of file diff --git a/src/gfn/marc/Zug.java b/src/gfn/marc/Zug.java new file mode 100644 index 0000000..ac7bc12 --- /dev/null +++ b/src/gfn/marc/Zug.java @@ -0,0 +1,136 @@ +package gfn.marc; + +import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +public class Zug { + + private static Frame f; + private static Spielfeld spielfeld; + private static int zugNummer = 0; + private static boolean zugLaeuft; + private static CustomMouseListener[] cmls = new CustomMouseListener[9]; + + public Zug() { + Zug.spielfeld = TicTacToe.getSpielfeld(); + Zug.f = TicTacToe.getF(); + createMouseListeners(); + } + + // Zuganzahl hochzählen und Titelleiste setzen + public static void macheZug(Spieler spieler) { + if (zugNummer == 9) { + Zug.zugNummer = 0; + } + Zug.zugNummer++; + f.setTitle(spieler.getName() + " ist dran!"); + Zug.setZugLaeuft(true); + + + // Mouselistener auf Felder setzen, die noch nicht gesetzt wurden + for (int i = 0; i < spielfeld.getFelder().length; i++) { + if (!spielfeld.getFelder()[i].isGesetzt()) { + cmls[i].setSpieler(spieler); + spielfeld.getFelder()[i].getLabel().addMouseListener(cmls[i]); + } + } + + // Auf setzen eines Feldes warten + while (Zug.isZugLaeuft()) { + try { + Thread.sleep(200); + } catch (InterruptedException ie) { + break; + } + } + + // MouseListener von allen Feldern entfernen + for (int i = 0; i < spielfeld.getFelder().length; i++) { + spielfeld.getFelder()[i].getLabel().removeMouseListener(cmls[i]); + } + + } + + public static void createMouseListeners() { + for (int i = 0; i < spielfeld.getFelder().length; i++) { + cmls[i] = new CustomMouseListener(f, spielfeld.getFelder()[i]); + } + } + + public static int getZugNummer() { + return zugNummer; + } + + public static boolean isZugLaeuft() { + return zugLaeuft; + } + + public static void setZugLaeuft(boolean zugLaeuft) { + Zug.zugLaeuft = zugLaeuft; + } + + public static void setF(Frame f) { + Zug.f = f; + } + + public static void setSpielfeld(Spielfeld spielfeld) { + Zug.spielfeld = spielfeld; + } + + public static void setZugNummer(int zugNummer) { + Zug.zugNummer = zugNummer; + } + + public static void setCmls(CustomMouseListener[] cmls) { + Zug.cmls = cmls; + } +} + + +class CustomMouseListener implements MouseListener { + + private Frame f; + private Feld feld; + private Spieler spieler; + + public CustomMouseListener(Frame f, Feld feld) { + this.f = f; + this.feld = feld; + } + + public void setSpieler(Spieler spieler) { + this.spieler = spieler; + } + + // Auf Setzen des Feldes prüfen und ggf. Form zeichnen lassen + @Override + public void mouseClicked(MouseEvent mouseEvent) { + this.feld.setZeichen(spieler.getForm()); + f.repaint(); + Zug.setZugLaeuft(false); + } + + // notwendige Implementierungen ohne weitere Funktion + @Override + public void mousePressed(MouseEvent mouseEvent) { + + } + + @Override + public void mouseReleased(MouseEvent mouseEvent) { + + } + + @Override + public void mouseEntered(MouseEvent mouseEvent) { + + } + + @Override + public void mouseExited(MouseEvent mouseEvent) { + + } +} + +