Integer aus Textdatei auslesen

die Keys in Properties müssen unique sein,
wenn das dein Ziel ist, dann bietet sich Nummerierung an

        throws Exception
    {
        FileInputStream in = new FileInputStream("spielstand.txt");
        Properties spielstand = new Properties();
        spielstand.load(in);
        for (int n = 0; n < 20; n++)
        {
            spielstand.setProperty("gastkarten" + n, "lalelu" + (n % 5));
        }
        spielstand.store(new FileOutputStream("spielstand.txt"), "Gespeichertes Spiel");
    }

erzeugt/ füllt bei mir Textdatei


#Gespeichertes Spiel
#Fri Oct 31 11:52:41 CET 2014
gastkarten12=lalelu2
gastkarten11=lalelu1
gastkarten10=lalelu0
gastkarten9=lalelu4
gastkarten8=lalelu3
gastkarten7=lalelu2
gastkarten6=lalelu1
gastkarten5=lalelu0
gastkarten4=lalelu4
gastkarten3=lalelu3
gastkarten2=lalelu2
gastkarten1=lalelu1
gastkarten0=lalelu0
gastkarten19=lalelu4
gastkarten18=lalelu3
gastkarten17=lalelu2
gastkarten16=lalelu1
gastkarten15=lalelu0
gastkarten14=lalelu4
gastkarten13=lalelu3

nicht gerade sortiert, aber muss ja auch nicht sein,
Einlesen ebenso mit Schleife, genaue Keys zusammenbauen

ich habe bisschen älteres Java 1.5, da mit Stream statt Reader/ Writer

wenn du dich auch Properties-Format verläßt, dann sollte das zumindest zwischen zwei Properties kaum ein Problem sein, siehe mein Beispiel/ deine Dateien

Hallo und Vielen Dank,

das bringt mich um einiges mehr voran, vielen Dank!
Also das Abspeichern auf die Art funktioniert spitze.
Ich musste ja nur die For-Schleife einfügen, den Writer selbst, der in Deinem Antiquierten Java anders heißt, war ja schon vorhanden.:smiley:
Ich bin aber noch über eine Sache gestolpert. Ich scheitere immer und immer wieder an einer Sache. Wie kann ich denn aus diesen Enums einzelne Listenelemente abrufen? ich will das immer über [n] machen, wie ich das aus Array kenne, das macht er aber nicht.

Mein Schreibcode sieht nun so aus:

        {
            spielstand.setProperty("gastkarten" + n, gastkarten + "");
        }```

Ich hab Dein Lalelu-Beispielzeuchs durch Gastkarten ersetzt. Da fügt er logischerweise bei jedem Element die ganze Liste ein, das ist ja auch unsinnig. Er soll da immer nur das Element einfügen, wo er gerade bei n ist.
Hab's mit gastkarten[n] versucht, geht leider nicht.


Schöne Grüße
Lukas

PS: Ja, in der Tat ist das wirklich sehr chaotisch... Aber da sehe ich drüber hinweg, weil das Spiel das selbst einliest und der Anwender die Datei nicht anfasst. Also da könnte noch so viel Chaos drin sein, solange es die Laufzeit nicht beeinflusst, ist das nicht weiter dramatisch. Ordnung darin wäre schön, muss aber nicht. (Für diese Meinung werden mich die Pro-Anwender bestimmt wieder schröpfen.:p )

Wie wär’s, die Spielsatandsache mal von der andren Seite anzugehen. Im wahren Leben weis ja auch der Spieler, welche Karte(n) er hat und nicht die Karte, welchem Spieler sie gerade gehört. Also würde ich die Spielstände so speichern:

#key=spielerID, value=Liste der KarternIDs
lalelu0=gastkarten0,gastkarten5,gastkarten10,gastkarten15 
lalelu1=gastkarten1,gastkarten6,gastkarten11,gastkarten16
...

Vorteil: Du kannst gezielt nach dem Stand eines Mitspielers fragen. Die einzelnen Karten löst Du mit dem bekannten String.split() auf.
Und mit diesem Ansatz ist es recht simpel darauf zu reagieren, dass ein Spieler gar keine Karten hat…

bye
TT

gastkarten ist ja eine List bzw. ArrayList - also ein komplexes Objekt, das Methoden liefert um es ggf. zu manipulieren oder auf seine Inhalte zuzugreifen. Die Methoden zum befüllen nutzt Du ja bereits, genauso gibt es Methoden um die Einträge auszulesen, sogar gezielt per Index. Bei einem Blick in die API Doku findet man z.B: List#get(int)
Alternativ kann man auch mal in der IDE die Methoden durchschauen, die diese zu einem Objekt liefert.

Hallo Timothy_Truckle,

das ist natürlich auch ein netter Ansatz, aber das wirft irgendwie mein Konzept ein wenig auseinander, wie ich mir das ganze vorgestellt habe. Ich hab schon lange eine Vorstellung, wie ich das genau umsetze und würde das jetzt ungerne über den Haufen werfen und gerne so programmieren, wie es oben steht.
Folgendermaßen hab ich das gemacht: Bei mir gibt es, wie Du gesehen hast Unmengen Integer, die irgendwas zählen.
Zum Beispiel Restkartengast zählt, wie viele Karten noch im Umlauf sind. Das ist Anfangs 0 und wenn ich die Karten mische (siehe Methode gastkartenmischen) zählt er bei jeder Karte die ich generiere eins hoch. Und wenn ich Karten ablege, dann sinkt er um die abgelegte Zahl. Wenn restkartengast 0 erreicht hat, endet das Spiel und es hat der gewonnen, der mehr Punkte hat.
Ich habe ein generelles Problem, wie ich das mit dem Mischen mache. Deshalb hatte ich das jetzt so gemacht, dass er von Anfang an eine Festgelegte Reihenfolge ausmischt und dann immer wenn eine Karte gezogen wird die Reihenfolge abarbeitet.
Also der Zähler Restkartengast zieht sich einfach die Karte mit dem entsprechenden Index raus. Wenn es noch 67 Karten im Spiel gibt, dann zieht er halt 100 - 67 = die 33. Karte aus dem Stapel. :wink:

Jeder Spieler hat 5 Karten. Wie viele er hat, ablegen darf und aufnehmen muss, entscheidet ebenfalls ein Zähler kartenspielerx.

Das wirkt für euch vielleicht etwas konfus, aber für mich ist das die beste Variante, das zu realisieren.
Deshalb möchte ich die Reihenfolge der Karten auch als ganzes abspeichern.
@_Michael : Dein Beitrag kam schon, nachdem ich angefangen habe zu antworten. Ich schau mir das mal an, danke.

Gruß
Lukas

vor jeder Speicherung mit evtl. internen Problem und mühsamen Nachschauen in Datei
gehört immer erst ein System.out.println(…)
damit kannst du viel besser testen, was dein Programm machen könnte,

erst wenn die Ausgabe klappt, dann den String der Ausgabe in die Properties speichern,
erst wenn die Ausgabe klappt, dann eine GUI mit komplexen Model drumherumbauen,
erst wenn die Ausgabe klappt, dann den Roboter anhand der ausgegebenen Bewegungen bewegen,
erst wenn die Ausgabe klappt, dann das Atomkraftwerk mit diesen Spezifikationen hochfahren
usw.
System.out.println(…) ist der einzig wichtige Befehl in einem Programm, alles andere ist nur Spielerei :wink:

Hallo SlaterB,

wie Du an meinem Programmcode sehen kannst, arbeite ich sehr viel mit System.out.println() und der Konsole, ich hab persönlich auch schon vor ein paar Tagen (erst) gemerkt, wie praktisch das ganze ist. :slight_smile:

@_Michael :
Vielen Dank dafür, get scheint höchst perfekt zu laufen, schöne Sache.

            spielstand.setProperty("gastkarten" + n, gastkarten.get(n) + "");
        }```
Das ganze läuft sehr gut, das speichert alles schön in die Datei. Ordnung ist was anderes, aber es wird abgespeichert. Ich verstehe an dieser Stelle nicht, wieso Java nicht fähig ist so wie es da steht von n=0 bis n=99 alles in Reihenfolge zu speichern, aber okay, das stört nicht weiter.

Meine letzte Sache wäre das mit der Wiederherstellung.
Die Wiederherstellung der bisherigen Werte, alles Integer lief immer so ab:
```JOptionPane.showMessageDialog(null, "Ein Zwischengespeichertes Spiel wird wiederhergestellt!", "Weiterspielen", JOptionPane.INFORMATION_MESSAGE);
      String spielername1 = spielstand.getProperty("spielername1", "Nicht vorhanden");
      String spielername2 = spielstand.getProperty("spielername2", "Nicht vorhanden");
  	  String string_restkartentisch = spielstand.getProperty("restkartentisch", "0");
      restkartentisch = Integer.parseInt(string_restkartentisch);
      jLabelRestkartenTisch.setText("Resttische: "+restkartentisch);
      String string_restkartengast = spielstand.getProperty("restkartengast", "0");
      restkartengast = Integer.parseInt(string_restkartengast);
      jLabelRestkartenGast.setText("Restgäste: "+restkartengast);
      String string_restbarplaetze = spielstand.getProperty("restbarplaetze", "21");
      restbarplaetze = Integer.parseInt(string_restbarplaetze);
      jLabelRestbarplaetze.setText("Barplätze übrig: "+restbarplaetze); 
      String string_handkartenspieler1 = spielstand.getProperty("handkartenspieler1", "0");
      handkartenspieler1 = Integer.parseInt(string_handkartenspieler1);
      jLabelHandkartenSpieler1.setText("Karten "+spielername1+": "+handkartenspieler1);
      String string_handkartenspieler2 = spielstand.getProperty("handkartenspieler2", "0");
      handkartenspieler2 = Integer.parseInt(string_handkartenspieler2);
      jLabelHandkartenSpieler2.setText("Karten "+spielername2+": "+handkartenspieler2);
      String string_punktespieler1 = spielstand.getProperty("punktespieler1", "0");
      punktespieler1 = Integer.parseInt(string_punktespieler1);
      jLabelPunkteSpieler1.setText("Punkte "+spielername1+": "+punktespieler1);
      String string_punktespieler2 = spielstand.getProperty("punktespieler2", "0");
      punktespieler2 = Integer.parseInt(string_punktespieler2);
      jLabelPunkteSpieler2.setText("Punkte "+spielername2+": "+punktespieler2);
      String string_spieler = spielstand.getProperty("spieler", "1");
      spieler = Integer.parseInt(string_spieler);
      if(spieler == 1){
      	jLabelSpieler.setText("Am Zug: "+spielername1);
      }
      else{
      	jLabelSpieler.setText("Am Zug: "+spielername2);
      }
      System.out.println("Ein altes Spiel wurde wiederhergestellt");```

Sodele und nun muss ich erreichen, dass er die Werte wieder ausliest aus den Dateien und anschließend in **Reihenfolge** (kann es da Probleme mit der chaotischen Ordnung geben?) wieder in die liste schreibt. Wenn die Liste wieder voll ist, dann schups ich das in die jList rein, wie bisher immer gemacht, das ist kein Problem.

Mein Problem liegt nur noch im Einlesen und Liste vollschreiben.

Ich hätte das jetzt auch mit einer for-Schleife gemacht:
```for (int n=0;n<restkartengast;n++) {
            String gastkartewiederhergestellt = spielstand.getProperty("gastkarten" + n, gastkarten.get(n) + "");
            gastkarten.add(new Gastkarte(gastkartewiederhergestellt))
      }```

Die Idee hinter dieser Kollaterallösung wäre jede Gastkarte kurzfristig in einen String abzuspeichern und dann in die Gastkartenliste zu "adden".

Läuft aber nicht so. 1. geht das Adden nicht einfach so als Liste, wie ich mir das vorgestellt habe.
Und zweitens, wenn ich mir das hier mal ausgeben lasse:
```for (int n=0;n<restkartengast;n++) {
            String gastkartewiederhergestellt = spielstand.getProperty("gastkarten" + n, gastkarten.get(n) + "");
            System.out.println(gastkartewiederhergestellt);
      }```
Also einfach anzeigen will, ob er mit dem String klarkommt, dann startet das Programm nach der Meldung ganz oben "Ein altes Spiel wurde wiederhergestellt" gar nicht mehr.:eek:

Gruß
Lukas

Für Properties ist die Reihenfolge eigentlich irrelevant. Wenn Du das geordnet in eine Datei schreiben willst musst Du es selbst tun.

Du musst das ganze selbst sortieren. Problematisch könnte sein, dass „gastkarten11“ vor „gastkarten2“ einsortiert wird.

Zum einen müsstest Du wissen wie viele Elemente einzulesen sind - evtl. eine zusätzliche Property speichern.
Zum anderen musst Du Land und Geschlecht aus der Property extrahieren und interpretieren, da man ja nicht einfach einen String in ein Enum wandeln kann…

kann eine Exception auftreten? ohne Code ist unklar was passiert, catch, Programmende, Checks, Ausgaben?
es ist nichtmal zu sehen ob und wo die Schleife auftritt

bei einer for-Schleife immer vorher eine Ausgabe, und die Variablen der Schleifenbedingung sind interessant, z.B. ob restkartengast = 0 ist und deshalb Schleife nicht drankommt,
immer ausgeben, ruhig auch nach der Schleife eine Ausgabe dass fertig,
und die Ausgabe in der Schleife nicht so formulieren dass nicht evtl. nur Leerzeichen ausgegeben werden sondern irgendwas dazu,
auch besser (zusätzlich) zu Beginn der Schleife etwas, praktischerweise n ausgeben, da weiß man gleich wo man ist


[quote=FranzFerdinand]Läuft aber nicht so. 1. geht das Adden nicht einfach so als Liste, wie ich mir das vorgestellt habe.
Und zweitens, wenn ich mir das hier mal ausgeben lasse:[/quote]
kann man daraus interpretieren, dass, wenn du add() statt Ausgabe hast, irgendwas != dem GAU-Problem ‘startet gar nicht mehr’ passiert?
mit add() läuft das Programm besser?


ganz nebenbei:

      restkartentisch = Integer.parseInt(string_restkartentisch);
      jLabelRestkartenTisch.setText("Resttische: "+restkartentisch);
      String string_restkartengast = spielstand.getProperty("restkartengast", "0");
      restkartengast = Integer.parseInt(string_restkartengast);
      jLabelRestkartenGast.setText("Restgäste: "+restkartengast);

ist ziemlich schlimmer Code

zumindest die ersten beiden Zeilen ließen sich jeweils verbessern auf

      jLabelRestkartenTisch.setText("Resttische: "+restkartentisch);
      restkartengast = parseInt(s, "restkartengast", 0);
      jLabelRestkartenGast.setText("Restgäste: "+restkartengast);

mit Properties s statt spielstand und vor allem einer Hilfsmethode in der Klasse,
vielleicht auch statt Properties eine eigene Klasse mit entsprechend sinnvollen Methoden,
(+ Abfangen aller Exceptions, ohne den Hauptcode zu verunreinigen)

die String-Variablen vorher sind/ waren jedenfalls nutzlos und fehleranfällig,
wie schnell hat man einen Block kopiert und verwendet dann weiterhin die Stringvariable vom vorherigen Block

etwas drastischer wäre eine Hilfsmethode, die gleich noch in ein übergebenes JLabel schreibt,
lohnt nicht so sehr, aber um allgemein die Möglichkeiten zu zeigen:

      restkartengast = parseWriteInt(s, "restkartengast", 0, lRestkartenGast, "Restgäste");

[QUOTE=_Michael;104856]
Zum einen müsstest Du wissen wie viele Elemente einzulesen sind - evtl. eine zusätzliche Property speichern.
Zum anderen musst Du Land und Geschlecht aus der Property extrahieren und interpretieren, da man ja nicht einfach einen String in ein Enum wandeln kann…[/QUOTE]

Das ist das größte Problem.
Ich würde an dieser Stelle dann mit String Split arbeiten, beispielsweise hier:

String[] teile = string.split(";");
String land = teile[0];
String geschlecht = teile[1];```

Das Problem davor ist jedoch weiterhin, dass ich mir noch eine seriöse Schleife basteln muss, die überhaupt einen String zum Splitten einliest.:twisted:

  @SlaterB : Sorry, dass ich das nicht erwähnt habe. Restkartengast ist die Anzahl der Gastkarten, die da sind. Er stellt 100 wiederher. Die Zahl 100 selbst stellt er übrigens direkt aus der Speicherdatei wiederher, weil die in dem Spiel, was wiederhergestellt wird bereits gezählt wurden.
So ist mein aktueller Komplettcode:
```package spiel;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.util.*;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import static spiel.Gastkarte.*;

public class CafeRoot extends JFrame {

  private static final long serialVersionUID = 2463407896592093246L;
  // Anfang Attribute
  private int spielangefangen = 0;
  private int restkartentisch = 0;
  private int restkartengast = 0;
  private int restbarplaetze = 0;
  private int handkartenspieler1 = 0;
  private int handkartenspieler2 = 0;
  private int punktespieler1 = 0;
  private int punktespieler2 = 0;
  private int spieler = 0;
  private String spielername1 = "Spieler 1";
  private String spielername2 = "Spieler 2";
  private List<Gastkarte> gastkarten = new ArrayList<Gastkarte>();
  private JList<Gastkarte> jListGastkarten = new JList<Gastkarte>();
  private DefaultListModel<Gastkarte> jListGastkartenModel = new DefaultListModel<Gastkarte>();
  private JScrollPane jListGastkartenScrollPane= new JScrollPane(jListGastkarten);
  private JLabel jLabelRestkartenTisch = new JLabel();
  private JLabel jLabelRestkartenGast = new JLabel();
  private JLabel jLabelRestbarplaetze = new JLabel();
  private JLabel jLabelHandkartenSpieler1 = new JLabel();
  private JLabel jLabelHandkartenSpieler2 = new JLabel();
  private JLabel jLabelPunkteSpieler1 = new JLabel();
  private JLabel jLabelPunkteSpieler2 = new JLabel();
  private JLabel jLabelSpieler = new JLabel();
  private boolean spielernamenkorrekt = false;
  private JButton jButtonNeustart = new JButton();
  // Ende Attribute
  
  public CafeRoot(String title) throws IOException {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    Reader reader = new BufferedReader(new FileReader("neuesspiel.txt"));
    Properties neuesspiel = new Properties();
    try {
      neuesspiel.load(reader);
    }catch(FileNotFoundException ex){
       ex.printStackTrace();
       System.out.println("Die Datei neuesspiel.txt existiert nicht!");
    }
    reader.close();
    Reader reader2 = new BufferedReader(new FileReader("spielstand.txt"));
    Properties spielstand = new Properties();
    try {
      spielstand.load(reader2);
    }catch(FileNotFoundException ex){
       ex.printStackTrace();
       System.out.println("Die Datei spielstand.txt existiert nicht!");
    }
    reader.close();
    int frameWidth = 506; 
    int frameHeight = 434;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    setTitle("Café International");
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    setLocationRelativeTo(null);
    cp.setLayout(null);
    
    // Anfang Komponenten
    jLabelRestkartenTisch.setBounds(25, 10, 100, 30);
    cp.add(jLabelRestkartenTisch);
    jLabelRestkartenGast.setBounds(25, 35, 100, 30);
    cp.add(jLabelRestkartenGast);
    jLabelRestbarplaetze.setBounds(25, 60, 120, 30);
    cp.add(jLabelRestbarplaetze);
    jLabelHandkartenSpieler1.setBounds(25, 85, 140, 30);
    cp.add(jLabelHandkartenSpieler1);
    jLabelHandkartenSpieler2.setBounds(25, 110, 140, 30);
    cp.add(jLabelHandkartenSpieler2);
    jLabelPunkteSpieler1.setBounds(25, 135, 140, 30);
    cp.add(jLabelPunkteSpieler1);
    jLabelPunkteSpieler2.setBounds(25, 160, 140, 30);
    cp.add(jLabelPunkteSpieler2);
    jLabelSpieler.setBounds(25, 185, 140, 30);
    cp.add(jLabelSpieler);
    jListGastkarten.setModel(jListGastkartenModel);
    jListGastkartenScrollPane.setBounds(25, 210, 300, 100);
    cp.add(jListGastkartenScrollPane);
    jButtonNeustart.setBounds(320, 16, 105, 41);
    jButtonNeustart.setText("Nouveau!");
    jButtonNeustart.setMargin(new Insets(2, 2, 2, 2));
    jButtonNeustart.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        try {
			jButtonNeustart_ActionPerformed(evt);
		} catch (IOException e) {
			e.printStackTrace();
		}
      }
    });
    cp.add(jButtonNeustart);
    //=============================
    String string_spielangefangen = spielstand.getProperty("spielangefangen", "0");
    int spielangefangen = Integer.parseInt(string_spielangefangen);
    if(spielangefangen == 0) {
    	do{
    		namensfrage();
    	}while(spielernamenkorrekt == false);
    	System.out.println("Spieler 1 heißt: "+spielername1);
        System.out.println("Spieler 2 heißt: "+spielername2);
    	neuesspiel();
    	gastkartenmischen();
    }
    else{
    	spielstand();
    }
    // Ende Komponenten
    
    setVisible(true);
    addWindowListener(new MyWindowListener(this, spielstand));
    //=============================
    
    Random wuerfel1 = new Random(); //Würfeltest
    int wuerfel = wuerfel1.nextInt(49)+1; //Würfeltest
    System.out.println(wuerfel);
  }
  
  // Anfang Methoden
  
  public void jButtonNeustart_ActionPerformed(ActionEvent evt) throws IOException {
	  final JFrame Neustart = new JFrame("Ein Frame zum Schließen");
      Neustart.setTitle("Spiel neustarten");
      Object[] options = {"Neustarten", "Abbrechen"};
      int neustart = JOptionPane.showOptionDialog(null,
      "Möchtest Du das Spiel wirklich neustarten?
Dein Spielstand wird verloren gehen!",
      "Café International neustarten?",
      JOptionPane.DEFAULT_OPTION, 
      JOptionPane.QUESTION_MESSAGE, 
      null, options, options[0]);
      if(neustart == 0) {
    	  gastkarten.clear();
    	  jListGastkartenModel.clear();
    	  neuesspiel();
    	  gastkartenmischen();
      }
  }
  private void neuesspiel() throws IOException{
	  Reader reader = new BufferedReader(new FileReader("neuesspiel.txt"));
	    Properties neuesspiel = new Properties();
	    try {
	      neuesspiel.load(reader);
	    }catch(FileNotFoundException ex){
	       ex.printStackTrace();
	       System.out.println("Die Datei neuesspiel.txt existiert nicht!");
	    }
	    reader.close();
	  String string_restkartentisch = neuesspiel.getProperty("restkartentisch", "24");
      restkartentisch = Integer.parseInt(string_restkartentisch);
      jLabelRestkartenTisch.setText("Resttische: "+restkartentisch);
      String string_restkartengast = neuesspiel.getProperty("restkartengast", "0");
      restkartengast = Integer.parseInt(string_restkartengast);
      jLabelRestkartenGast.setText("Restgäste: "+restkartengast);
      String string_restbarplaetze = neuesspiel.getProperty("restbarplaetze", "21");
      restbarplaetze = Integer.parseInt(string_restbarplaetze);
      jLabelRestbarplaetze.setText("Barplätze übrig: "+restbarplaetze); 
      String string_handkartenspieler1 = neuesspiel.getProperty("handkartenspieler1", "0");
      handkartenspieler1 = Integer.parseInt(string_handkartenspieler1);
      jLabelHandkartenSpieler1.setText("Karten "+spielername1+": "+handkartenspieler1);
      String string_handkartenspieler2 = neuesspiel.getProperty("handkartenspieler2", "0");
      handkartenspieler2 = Integer.parseInt(string_handkartenspieler2);
      jLabelHandkartenSpieler2.setText("Karten "+spielername2+": "+handkartenspieler2);
      String string_punktespieler1 = neuesspiel.getProperty("punktespieler1", "0");
      punktespieler1 = Integer.parseInt(string_punktespieler1);
      jLabelPunkteSpieler1.setText("Punkte "+spielername1+": "+punktespieler1);
      String string_punktespieler2 = neuesspiel.getProperty("punktespieler2", "0");
      punktespieler2 = Integer.parseInt(string_punktespieler2);
      jLabelPunkteSpieler2.setText("Punkte "+spielername2+": "+punktespieler2);
      String string_spieler = neuesspiel.getProperty("spieler", "1");
      spieler = Integer.parseInt(string_spieler);
      if(spieler == 1){
      	jLabelSpieler.setText("Am Zug: "+spielername1);
      }
      else{
      	jLabelSpieler.setText("Am Zug: "+spielername2);
      }
      System.out.println("Neues Spiel gestartet");
  }
  private void spielstand() throws IOException{
	  Reader reader2 = new BufferedReader(new FileReader("spielstand.txt"));
	  Properties spielstand = new Properties();
	  try {
	    spielstand.load(reader2);
	  }catch(FileNotFoundException ex){
	     ex.printStackTrace();
	     System.out.println("Die Datei spielstand.txt existiert nicht!");
	  }
	  reader2.close(); 
	  JOptionPane.showMessageDialog(null, "Ein Zwischengespeichertes Spiel wird wiederhergestellt!", "Weiterspielen", JOptionPane.INFORMATION_MESSAGE);
      String spielername1 = spielstand.getProperty("spielername1", "Nicht vorhanden");
      String spielername2 = spielstand.getProperty("spielername2", "Nicht vorhanden");
  	  String string_restkartentisch = spielstand.getProperty("restkartentisch", "0");
      restkartentisch = Integer.parseInt(string_restkartentisch);
      jLabelRestkartenTisch.setText("Resttische: "+restkartentisch);
      String string_restkartengast = spielstand.getProperty("restkartengast", "0");
      restkartengast = Integer.parseInt(string_restkartengast);
      jLabelRestkartenGast.setText("Restgäste: "+restkartengast);
      String string_restbarplaetze = spielstand.getProperty("restbarplaetze", "21");
      restbarplaetze = Integer.parseInt(string_restbarplaetze);
      jLabelRestbarplaetze.setText("Barplätze übrig: "+restbarplaetze); 
      String string_handkartenspieler1 = spielstand.getProperty("handkartenspieler1", "0");
      handkartenspieler1 = Integer.parseInt(string_handkartenspieler1);
      jLabelHandkartenSpieler1.setText("Karten "+spielername1+": "+handkartenspieler1);
      String string_handkartenspieler2 = spielstand.getProperty("handkartenspieler2", "0");
      handkartenspieler2 = Integer.parseInt(string_handkartenspieler2);
      jLabelHandkartenSpieler2.setText("Karten "+spielername2+": "+handkartenspieler2);
      String string_punktespieler1 = spielstand.getProperty("punktespieler1", "0");
      punktespieler1 = Integer.parseInt(string_punktespieler1);
      jLabelPunkteSpieler1.setText("Punkte "+spielername1+": "+punktespieler1);
      String string_punktespieler2 = spielstand.getProperty("punktespieler2", "0");
      punktespieler2 = Integer.parseInt(string_punktespieler2);
      jLabelPunkteSpieler2.setText("Punkte "+spielername2+": "+punktespieler2);
      String string_spieler = spielstand.getProperty("spieler", "1");
      spieler = Integer.parseInt(string_spieler);
      if(spieler == 1){
      	jLabelSpieler.setText("Am Zug: "+spielername1);
      }
      else{
      	jLabelSpieler.setText("Am Zug: "+spielername2);
      }
      /*for (int n=0;n<restkartengast;n++) {
            String gastkartewiederhergestellt = spielstand.getProperty("gastkarten" + n, gastkarten.get(n) + "");
            System.out.println(gastkartewiederhergestellt);
            //gastkarten.add(new Gastkarte(gastkartewiederhergestellt))
      }*/
      System.out.println("Ein altes Spiel wurde wiederhergestellt");
  }
  private void namensfrage() {
	  JTextField spielername01 = new JTextField(new MaxSizeDocument(12), "", 0);
	  JTextField spielername02 = new JTextField(new MaxSizeDocument(12), "", 0);
      Object[] namensfrage = {"Name von Spieler 1", spielername01, "Name von Spieler 2", spielername02};
      JOptionPane pane = new JOptionPane(namensfrage, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION);
      pane.createDialog(null, "Wie heißen die Spieler?").setVisible(true);
      spielername1 = spielername01.getText();
      spielername2 = spielername02.getText();
      if(spielername1.equals("") || spielername2.equals("")) {
    	  JOptionPane.showMessageDialog(null, "Bitte gib beide Spielernamen ein!", "Unvollständige Eingabe", JOptionPane.ERROR_MESSAGE);
    	  System.out.println("Es wurden nicht alle Spielernamen eingetragen");
    	  namensfrage(); 
  	  }
      else if(spielername1.equalsIgnoreCase(spielername2)) {
    	  JOptionPane.showMessageDialog(null, "Bitte benenne die Spieler unterschiedlich!", "Namensgleichheit", JOptionPane.ERROR_MESSAGE);
    	  System.out.println("Es wurde bei beiden Namen \""+spielername1+"\" eingetragen");
    	  namensfrage(); 
      }
      else{
    	  spielernamenkorrekt = true;
      }
  }
  private void gastkartenmischen() {
	  for(int j=0;j<2;j++){
	    	for(Land land : Land.values()) {
	            int anzahl = 2;
	            if (land == Land.Joker) {
	               anzahl = 1;
	            }
	            for(int i = 0; i < anzahl; i++) {
	                for(Geschlecht geschlecht : Geschlecht.values()) {
	                    gastkarten.add(new Gastkarte(geschlecht, land));
	                    restkartengast = restkartengast + 1;
	                }    
	            }
	        }
	    }
	  	
	  	/*Gastkarte eineGastkarte = gastkarten.get(0);
	  	Geschlecht geschlecht = eineGastkarte.geschlecht;
	  	Land land = eineGastkarte.land;
	    
	    if(land == Land.Chinese) {
	       System.out.println("Nihao!");
	    }*/
	    jLabelRestkartenGast.setText("Restgäste: "+restkartengast);
	    Collections.shuffle(gastkarten);
	    for(int n=0;n<gastkarten.size();n++){
	    	jListGastkartenModel.addElement(gastkarten.get(n));
	    }
	    System.out.println("Die Gastkarten wurden gemischt");
	    System.out.println(gastkarten);
  }
  // Ende Methoden
  
  public static void main(String[] args) throws IOException {
    new CafeRoot("CafeRoot");
  } // end of main 
  public class MyWindowListener implements WindowListener {
    private Properties spielstand;
    private CafeRoot cRoot;
    
    public MyWindowListener(CafeRoot cRoot,Properties spielstand) {
      this.cRoot = cRoot;
      this.spielstand = spielstand;
    }
    
    @Override
    public void windowActivated(WindowEvent arg0) { }
    
    @Override
    public void windowClosed(WindowEvent arg0) {
      cRoot.setVisible(false);  
    }
    
    @Override
    public void windowClosing(WindowEvent evt)
    {
      final JFrame Beenden = new JFrame("Ein Frame zum Schließen");
      Beenden.setTitle("Spiel beenden");
      Object[] options = {"Speichern", "Beenden", "Abbrechen"};
      int beenden = JOptionPane.showOptionDialog(null,
      "Möchtest Du das Spiel wirklich beenden?
Dein Spielstand wird verloren gehen!",
      "Café International beenden?",
      JOptionPane.DEFAULT_OPTION, 
      JOptionPane.QUESTION_MESSAGE, 
      null, options, options[0]);
      if(beenden == 0)
      {
      try {
        spielangefangen = 1;
        spielstand.setProperty("spielangefangen",spielangefangen + "");
        spielstand.setProperty("restkartentisch",restkartentisch + "");
        spielstand.setProperty("restkartengast",restkartengast + "");
        spielstand.setProperty("restbarplaetze",restbarplaetze + "");
        spielstand.setProperty("handkartenspieler1",handkartenspieler1 + "");
        spielstand.setProperty("handkartenspieler2",handkartenspieler2 + "");
        spielstand.setProperty("punktespieler1",punktespieler1 + "");
        spielstand.setProperty("punktespieler2",punktespieler2 + "");
        spielstand.setProperty("spielername1",spielername1);
        spielstand.setProperty("spielername2",spielername2);
        spielstand.setProperty("spieler",spieler + "");
        for (int n=0;n<restkartengast; n++) {
            spielstand.setProperty("gastkarten" + n, gastkarten.get(n) + "");
        }
        spielstand.store(new FileWriter("spielstand.txt"),"Gespeichertes Spiel");
        System.out.println("Das Spiel wurde beendet und der Spielstand abgespeichert");
    } catch (IOException e) {
      e.printStackTrace();
    }
        System.exit(0);
      }
      else{
        if(beenden == 1) {
        	try {
        		spielangefangen = 0;
        		spielstand.setProperty("spielangefangen",spielangefangen + "");
				spielstand.store(new FileWriter("spielstand.txt"),"Keine Speicherdatei");
				System.out.println("Das Spiel wurde beendet, aber kein Spielstand gespeichert");
			} catch (IOException e) {
				e.printStackTrace();
			}
          System.exit(0);
        }
      }
    }
    
    @Override
    public void windowDeactivated(WindowEvent arg0) { }
    @Override
    public void windowDeiconified(WindowEvent arg0) { }
    @Override
    public void windowIconified(WindowEvent arg0) { }
    @Override
    public void windowOpened(WindowEvent arg0) { }
    
    
  }
} // end of class CafeRoot

In der Methode Gastkartenmischen ab Zeile 291 wird immer hochgezählt bei jeder neuen Karte:
restkartengast = restkartengast + 1;

Und wiederhergestellt wird der Wert auch:

      restkartengast = Integer.parseInt(string_restkartengast);
      jLabelRestkartenGast.setText("Restgäste: "+restkartengast);```

Glaub mir, das Programm zeigt dann auch 100 an, das stimmt erstmal so. ;)


Gruß
Lukas

PS: Ich hab Deinen Beitrag nur bis zum ersten -------- gelesen, bis dahin war er, als ich hier angefangen habe zu schreiben.
Damit der Beitrag erstmal nicht überladen ist, antworte ich darauf gleich in einem neuen Beitrag, wenn ich das bearbeitet habe.

Entweder Du merkst Dir die Anzahl der Kartendaten unter einem zusätzlichen Key in der Properties Datei oder Du läufst einfach von 0 aus los bis nichts mehr gefunden wird.
So oder so geht es ja genauso wie das speichern in die Properties nur mit get… statt set…

[quote=FranzFerdinand;104858]Ich würde an dieser Stelle dann mit String Split arbeiten, beispielsweise hier:
Java Code:
String string = „Brite;männlich“; //irgendeine eingelesene Karte
String teile = string.split(„;“);
String land = teile[0];
String geschlecht = teile[1];[/quote]
Einfacher wäre es wenn Du nicht den Wert der Enums speicherst, sondern deren Position - siehe ordinal(). Dann musst Du keine Strings interpretieren, sondern kannst ganz einfach per Index den Enum wieder „herstellen“.

@SlaterB :
Ich bin mir dem bewusst, dass das scheußlich aussieht. Ich bin daran gescheitert das Global einzulesen und mache das deswegen für jede Variable einzeln.
Wert einlesen, Sting in Integer umwandeln und ins Label packen. Umständlich, aber geht nicht einfacher, vorerst. Ich nehme das einfach so hin, erstmal. Was funktioniert und keine extreme Laufzeit generiert, muss erstmal nicht verbessert werden.
Wenn ich diesen ganzen Zirkus beendet habe, dass er das seriös einliest, dann kann ich mich darum bemühen.

@_Michael : Meinst Du jetzt, ich generiere die Enoms nochmal und lese dann ein, an welchen Positionen in der Liste die Werte gewesen sind?
Das geht auch, aber das ist mir ehrlich viel zu aufwendig und umständlich, das macht doch alles nur noch komplizierter?

Ich versuche mich gerade einfach nur daran, dem Programm beizubringen, dass da 100 Karten in einer Datei namens spielstand.txt sind und diese bitte eingelesen werden sollen und in die Liste gehören.

Danke an dieser Stelle allen, die es bis hierhin mit meiner Inkompetenz ausgehalten haben.:smiley:

Gruß
Lukas

[quote=FranzFerdinand]das ist natürlich auch ein netter Ansatz, aber das wirft irgendwie mein Konzept ein wenig auseinander, wie ich mir das ganze vorgestellt habe. Ich hab schon lange eine Vorstellung, wie ich das genau umsetze und würde das jetzt ungerne über den Haufen werfen und gerne so programmieren, wie es oben steht.[/quote]Schade, wieder einer der sein Pferd lieber zu tode reitet, als es rechtzeitig zu wechseln…

bye
TT

Du, sei mir nicht böse, ich arbeite seit 3 Wochen daran, an dem schwersten Teil meines Projektes, die 2Dimensionen Gastkarten zu generieren und ein korrektes Speichermanagement zu erbauen. Das danach zu programmieren ist recht einfach.

Ich habe jetzt 3 Wochen daran gesessen und alles fertig, bis auf das Einspeichern der Gastkarten in die Datei.
Ich kann mir das bei meinem Verständnis echt nicht erlauben, da jetzt komplett alles zu verändern. :wink:

Hat noch jemand einen Lösungsansatz?

*** Edit ***

Zu vorhin:
Das Programm was stehen bleibt und nicht startet.
Folgender Programmcode war das:

            String gastkartewiederhergestellt = spielstand.getProperty("gastkarten" + n, gastkarten.get(n) + "");
            System.out.println(gastkartewiederhergestellt);
            //gastkarten.add(new Gastkarte(gastkartewiederhergestellt))
      }```

Die Konsole gibt mir dazu folgendes aus:

> Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
> 	at java.util.ArrayList.rangeCheck(ArrayList.java:635)
> 	at java.util.ArrayList.get(ArrayList.java:411)
> 	at spiel.CafeRoot.spielstand(CafeRoot.java:263)
> 	at spiel.CafeRoot.<init>(CafeRoot.java:147)
> 	at spiel.CafeRoot.main(CafeRoot.java:325)

so sieht ein zumindest arbeitendes Programm aus,
Fehler gibt es 100x am Tag, aber ‚startet gar nicht mehr‘ und komischer Smily, das ist gefährlich :wink:

wahrscheinlich GUI-Programm und nicht in die Konsole geschaut, das gibt es natürlich öfter,
auch hier gilt wieder: im wesentlichen oder bei neuen Funktionen alles lieber erstmal ohne GUI, ohne Eingabe oder sonstige Probleme mit System.out.println() durchlaufen lassen :wink:

ob der Fehler dir erklärbar ist oder nicht ist nicht zu erkennen,
sieht so aus als wäre gastkarten leer, Gründe dafür gibts viele auch ohne dass ich mir das Programm genauer anschauen muss,
prüfe es mit entsprechender Ausgabe falls noch nicht sicher,
verfolge nach, einerseits in deinem Programmplan als auch im Code, ob und wie die Liste gefüllt sein sollte,
korrigiere gegebenenfalls

wenn in der Schleife auskommentiert geaddet werden soll, dann ist offensichtlich nicht der Plan, dass die Liste schon gefüllt ist,
Defaultwert ist auch nicht zwingend, kann ein Dummy sein

Hallo SlaterB,

ich arbeite schon den ganzen Tag daran, diese eine Schleife zu bauen, die mir diese Werte richtig ausliest. Das Auskommentierte war ursprünglich zum hinzufügen gedacht, jedoch ging das ja noch nicht, weil schon die Zeile darüber nichts mehr richtig funktioniert hat. Geprüft mit println hat sich das bestätigt, dass die wahrlich NICHTS passiert.

Hättest Du eine Idee, wie man das kompetent und sinnvoll einlesen könnte?
Die Elemente werden korrekt abgespeichert, das funktioniert bereits und liegen dann wie erwähnt in der Datei in folgendem Format herum:

gastkarten37=Joker\:weiblich
gastkarten36=Franzake\:männlich
gastkarten35=Kubaner\:weiblich
gastkarten34=Joker\:weiblich
gastkarten99=Spanier\:männlich
gastkarten33=Amerikaner\:weiblich
gastkarten98=Spanier\:männlich
gastkarten32=Chinese\:weiblich

Gruß
Lukas

Probiere mal

                String gastkartewiederhergestellt = spielstand.getProperty("gastkarten" + n);
                System.out.println(gastkartewiederhergestellt);
                //gastkarten.add(new Gastkarte(gastkartewiederhergestellt))
          }

[QUOTE=Crian]Probiere mal

                String gastkartewiederhergestellt = spielstand.getProperty("gastkarten" + n);
                System.out.println(gastkartewiederhergestellt);
                //gastkarten.add(new Gastkarte(gastkartewiederhergestellt))
          }
```[/QUOTE]
Tatsache, das funktioniert, verdammte Axt! :D Ich habe echt gedacht, dass man da jetzt noch get(n) mitnutzen muss.
Also, das einlesen und ausgeben in der Konsole läuft wie geschmiert.

Ich habe das jetzt mal erweitert, ich muss die Elemente nämlich einzeln haben, also land und geschlecht und diese dann gemeinsam wieder in die Liste schreiben.
Wenn ich das hier schreibe, dann gibt er mir auch hintereinander beide einzeln aus:
```String gastkartewiederhergestellt = spielstand.getProperty("gastkarten" + n);
            String[] einzelkarte = gastkartewiederhergestellt.split(":");
            System.out.println(einzelkarte[0]);
            System.out.println(einzelkarte[1]);```

Das läuft sehr gut.
Also bisher hab ich die ja immer eingefügt mit: `gastkarten.add(new Gastkarte(geschlecht, land));`

Die eigentlich Erzeugungsschleife für Karten in einem neuen, nicht wiederhergestellten Spiel läuft ja so ab:
```for(int j=0;j<2;j++){
	    	for(Land land : Land.values()) {
	            int anzahl = 2;
	            if (land == Land.Joker) {
	               anzahl = 1;
	            }
	            for(int i = 0; i < anzahl; i++) {
	                for(Geschlecht geschlecht : Geschlecht.values()) {
	                    gastkarten.add(new Gastkarte(geschlecht, land));
	                    restkartengast = restkartengast + 1;
	                }    
	            }
	        }
	    }```

Mit Land und Geschlecht hat das erstmal nichts am Hut, ich hab ja gesplittet auf `einzelkarte[0]` & `einzelkarte[1]`.
Also müsste er eigentlich mit `gastkarten.add(new Gastkarte(einzelkarte[0], einzelkarte[1]));` klarkommen. Aber so läuft das jetzt nicht.

Aber damit bin ich fast am Ziel angekommen.:)
Gruß
Lukas

falls noch nicht deutlich genug erwähnt wurde, dann eine weitere Grundweisheit: ‚läuft nicht‘ geht nicht als Fehlermeldung fürs Forum

es muss immer
A) ein Compilerfehler
oder B) eine Exception
und/ oder C) ein konkret beschriebenes Fehlverhalten (z.B. Daten X und Y statt A und B) vorliegen

aber gut, hier schon sichtbar, der Gastkarte-Konstruktor (ist im Falle eines Problems mit einem Konstruktor natürlich genau zu posten)
erwartet offensichtlich einen Parameter einer obszönen Klasse, keinen String,
da musst du erst den String umwandeln, Enum.valueOf() kann helfen

[QUOTE=SlaterB]falls noch nicht deutlich genug erwähnt wurde, dann eine weitere Grundweisheit: ‚läuft nicht‘ geht nicht als Fehlermeldung fürs Forum

es muss immer
A) ein Compilerfehler
oder B) eine Exception
und/ oder C) ein konkret beschriebenes Fehlverhalten (z.B. Daten X und Y statt A und B) vorliegen[/QUOTE]

Hallo,
entschuldige bitte. Ich nehme mir, wie man hoffentlich erkennt immer viel Zeit beim korrekten und möglich umfangreichen Posten meiner Beiträge. Manchmal rutscht mir das einfach mal unter nach nem langen Beitrag, dass ich vergesse dazu eine Fehlermeldung zu posten.

Also diese obszöne Gastkartenklasse sieht so aus:


public class Gastkarte {
	   public static enum Geschlecht {männlich, weiblich};
	   public static enum Land {Deutscher, Franzake, Brite, Amerikaner, Türke, Inder, Chinese, Russe, Spanier, Kubaner, Afrikaner, Italiener, Joker};
	 
	   public final Land land;
	   public final Geschlecht geschlecht;
	 
	   public Gastkarte(Geschlecht geschlecht, Land land){
	      this.land = land;
	      this.geschlecht= geschlecht;
	   }
	 
	   public String toString(){
	     return land + ":" + geschlecht;
	   }
	}

Der Konstruktor Gastkarte(string, string) ist nicht definiert, ist die Fehlermeldung, wenn ich gastkarten.add(new Gastkarte(einzelkarte[0], einzelkarte[1])); eingebe.
Aber ich sehe schon, dass das nicht läuft ist logisch, die Klasse Gastkarte gibt ja auch vor, dass da was völlig anderes eingefügt werden muss.

Im Zuge meines Studiums diverser Java-Stoffe bin ich auch gerade bei Enums angelangt. Ich werde mir deinen letzten Absatz mal zu Gemüte führen.

Gruß
Lukas :slight_smile: