Integer aus Textdatei auslesen

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");

(Beitrag vom Verfasser gelöscht)

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

(Beitrag vom Verfasser gelöscht)

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

(Beitrag vom Verfasser gelöscht)

Probiere mal

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

(Beitrag vom Verfasser gelöscht)

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

(Beitrag vom Verfasser gelöscht)

[quote=FranzFerdinand]gastkarten.add(new Gastkarte(einzelkarte[0], einzelkarte[1])); funktioniert nicht:
Der Konstruktor Gastkarte(string, string) ist nicht definiert[/quote]
Die Meldung ist doch ziemlich deutlich. Für die Klasse Gastkarte gibt es nur einen Konstruktor und der erwartet ein Enum vom Typ Land und als zweites einen Enum vom Typ Geschlecht.
einzelkarte ist aber ein String Array und einzelkarte[0] bzw. [1] sind Strings. Zur Lösungsfindung einfach ein bisschen über die Ausgangsituation nachdenken. Gegen sind zwei Strings, benötigt werden entweder zwei Enums oder ein zusätzlicher Konstruktor in der Klasse Gastkarte der mit Strings umgehen kann.
Hier hilft die Methode valueof: Land.valueOf("Brite") liefert den Enum Land.Brite und Geschlecht.valueof("weiblich") liefert Geschlecht.weiblich. Nun hast Du einen Enum Land und Geschlecht und kannst z.B. damit über den gegebenen Konstruktor eine Gastkarte erzeugen.

(Beitrag vom Verfasser gelöscht)