# Hängmann Spiel ohne ArrayList. Einzig mit String_Methoden, String-arrays und char-arrays lösen



## OliI. (27. Nov 2022)

Das mit den 20 vordef. Wörtern vergessen wir mal. Ich habe drei Wörter das langt.
Hier ist mein Code bisher:


```
public static void main(String[] args)
    {
        // Zahl zw. 0 und 1 erzeugen für Array-Index  
        int zahl = (int) (Math.random()*3);
        int wortLaenge;
        int counter = 0;
        String rateWort="";
        char rateBuchstabe = ' ';
        Scanner sc = new Scanner(System.in);
      
      
        // Array besteht aus 2 Wörtern
        String[] woerter = new String[3];
        // wie 20 verschiedene Wörter erzeugen?
        woerter[0] = "Programmiersprache";
        woerter[1] = "Testprogramme";
        woerter[2] = "Informatik";
          
//        System.out.println(woerter[zahl])                       // Länge des gesuchten Wortes
        int anzeige = woerter[zahl].length();
      
        for (int i = 0; i < anzeige; i++)
        {
            rateWort += "_ ";
        }
      
        // Umwandeln String to char-array
        char[] chars = rateWort.toCharArray();
        char[] chars_ = woerter[zahl].toCharArray();
        System.out.println("Buchstabe eingeben: ");
        System.out.println(rateWort);
      
        for (int i = 0; i < 15; i++)
        {
            rateBuchstabe = sc.nextLine().charAt(0);
           
          
            
        }
```

Mein Problem ist jetzt: Nehmen wir an, das Wort Testprogramme wurde ausgewählt
*Wie muss ich jetzt in der for-Schleife vorgehen, um die oben beschriebene Vorgehensweise umzusetzen?*
► Nutzer liest Buchstabe ein. Es soll laut Aufgabenstellung egal sein, ob er groß M oder klein m eingibt
► Dann eingegebenen Buchstaben mit gesuchtem Wort vergleichen, wo sind die Stellen (Indexe) in dem gesuchten Wort, wo der eingegebene Buchstabe alles vorkommt? D. h. ich muss deren Indexe ermitteln, so würde zumindest ich vorgehen.
► Habe ich diese, müssen in dem char array rateWort dass bislang aus _ _ _ _ _ _ _  ... besteht die Buchstaben ersetzt werden die erraten wurden.
► Solange bis alle Buchstaben erraten wurden oder das Spiel nach 15-Fehl Versuchen endet.   

Sorry, aber ich bin hier als Programmier-Einsteiger echt überfragt. Kann mir jemand hier bitte weiterhelfen, wie ich dies Umsetzen kann.

Nicht erlaubt sind Array_Listen, doppelte Arrays... Es sind* einzig char-arrays, String-arrays, String-Methoden und Character.Methoden *erlaubt.
Sonst nichts. 

Meine Idee wäre die String-Methoden           equalsIgnoreCase(String s)       indexOF(String s)    resplace(old, new)        toCharArray()         contains(string)
                                                                         substring(int beginIndex, int endIndex) zu verwenden, allerdings funktionieren diese bei einem char-array anscheinend gar nicht.


----------



## Neumi5694 (27. Nov 2022)

1. Poste deinen Code immer mit Code-Tags. Gerade weil du hier mit Arrays arbeitest, besteht sonst die Gefahr, dass die Foren-Engine einiges vom Code verschluckt. Außerdem ist er besser lesbar, wenn Einrückungen usw. stimmen.


Anm: Es gibt jetzt relativ viel Möglichkeiten, das Ganze anzugehen, ich beschreib dir hier EINE. Andere mögen effizientere oder elegantere Möglichkeiten als ich haben oder auch nur solche, die ihnen besser gefallen.

2. EqualsIgnoreCase usw. lassen wir mal außen vor, über Chars zu arbeiten ist hier viel angenehmer, das ist ein Musterbeispiel für char-Arrays.
Außerdem lassen sich Strings nicht verändern. Wenn du mit replace(..) arbeitest, wird immer ein neuer String erstellt.

3. Konvertiere sowohl Lösungsworte als auch die Eingabe am Besten gleich in Großbuchstaben, da die Groß-Kleinschreibung egal ist. So kannst du Chars ganz einfach mit == vergleichen.
3.1 also

```
char[] loesungsWortVergleich = loesungsWort.toUpperCase().toCharArray(); //einmalig, vor der Schleife
char eingabeGross =  Character.toUpperCase(eingabe);
```

4. Ich bin kein Fan der for-Schleife, hier würde ich do-while verwenden und in der while Bedingung prüfen, ob entweder das Lösungswort komplett erraten wurde oder das Limit erreicht ist. Es geht aber auch mit for-to und einem break, das ist Geschmackssache.

5. Vergiss aber erst mal die For-Schleife. Konzentrier dich darauf, was mit einem einzelnen Buchstaben passieren soll.
Geh die Buchstaben von loesungsWortVergleich durch.
Bei einem Match gib mal den Buchstaben per print(nicht println) aus, bei keinem Match gib "_" aus.
Erst sobald das klappt, gehe einen Schritt weiter.

6. Erstelle vor der Schleife ein Char-Array mit der selben Länge des Lösungswortes.
char[] erraten = new char[...];
Dann setze jedes Zeichen darin noch auf "_". Gib das Char-Array testweise aus, um zu sehen ob es passt.

Jetzt ändere wir die Vorgehensweise aus Punkt 4 etwas, reagiere nur noch auf Matches, Mismatch wird ignoriert. Geh mit einer for-to-schleife das Lösungswort durch. Gibt es einen Match, dann wird im "erraten" Array das entsprechende Zeichen an der gleichen Stelle reingeschrieben.

8. Und damit bist du eigentlich schon fertig. Das Lösungswort gilt als erraten, sobald dein "erraten" Array keine "_" Zeichen mehr enthält.


----------



## Neumi5694 (27. Nov 2022)

Edit: Nur, falls es nicht klar ist: Vom üblen Vertipsler abgesehen, meinte ich im vorletzten Satz Punkt 5, nicht Punkt 4.


----------



## Hansen_07 (27. Nov 2022)

Ich würde zur Auflistung von @Neumi5694 noch gerne Punkt 9 anfügen.

9. Poste Hausaufgaben bitte in der entsprechenden Rubrik "Hausaufgaben".

Vor lauter Hausaufgaben, sieht man hier nur noch sehr schwerlich Anfängerthemen.


----------

