Probleme bei dem erstellen von leveln in meinem Spiel

httprt

Neues Mitglied
Hallo, ich bin noch recht ein Amateur und würde ein Ratespiel kodieren. Jedoch weiß ich nicht wie ich ein neues Wort zum erraten einfügen kann, sodass
mehrere levels entstehen. Zum Beispiel möchte ich das nachdem das erste Wort richtig erraten wurde die abfrage kommt also System.out.println("möchtest du mit dem nächsten level fortfahren ?"); das mann dann entweder ja oder nein eintippen kann sodass entweder das neue level bzw. das neue Wort erraten werden kann oder das sich cmd schließt. Wenn ihr Ideen habt schreibt bitte codes rein und wenn ihr könnt erklärt sie mir damit ich sie auch in zukunft verwenden kann.

Der Code:

Java:
import java.io.*;
public class wortfinden
                        
{
        public static void main(String args[])throws IOException
        {
                String wort = "leben";int i,erraten=0,schlüssel=0,richtig=0;
                String besitz[] = new String[wort.length()];

                System.out.println("um das Wort zu finden hast du 5 versuche.");
                BufferedReader tastatur = new BufferedReader(new InputStreamReader(System.in)); //bufferedreader speichert grössere Datenmängen
                 // Ein InputStream ist ein Datenfluss über den Daten reinkommen in dem fall einfach die Tastatur.
                for (i = 0; i < wort.length(); i++)
                {
                        besitz[i] = "_ ";

                }

                finish:
                while(erraten<6){
                        System.out.println("schreiben sie einen Buchstaben (du hast noch "+(5 -erraten) +"übrig) : ");
                        String buchstabe = tastatur.readLine();
                        erraten++;
                        for (i = 0; i < wort.length(); i++)
                        {
                                if (wort.charAt(i) == buchstabe.charAt(0))
                                {
                                        besitz[i] = buchstabe+" ";
                                        schlüssel = 1;
                                        richtig++;
                                        if (richtig == wort.length()) { System.out.println("das Wort ist " +wort+"...Glückwunsch..."); break finish; }
                                }
                        }
                        if (schlüssel == 1) { schlüssel = 0; erraten--; }
                        for (i = 0; i < wort.length(); i++)
                        {
                                System.out.print(besitz[i]);

                        }
                        System.out.println();
                }
                if (richtig != wort.length()) { System.out.println("Tut mir leid... das richtige Wort ist " + wort); }

        }
        
}
 
Ein paar ganz wichtige Tipps:
- Schau Dir an, wie Du den Code in Methoden unterteilen kannst. Das macht es deutlich lesbarer und weniger komplex. Spätestens wenn man dann auch noch zu Labeln greifen muss für breaks und so, dann ist eine gewisse Grenze überschritten, die man nicht überschreiten sollte 🙂
- Lass Dir den Code ordentlich formatieren - nie mehrere Anweisungen auf einer Zeile!

Wenn Du den ersten Punkt hast, dann kannst Du den Inhalt von main in eine eigene Methode packen, die als Parameter das zu erratene Wort übergeben bekommt. Das könntest Du dann in mehreren Leveln aufrufen, indem Du die zu erratenen Wörter z.B. in einem Array vorhältst. Index ist dann Levelnummer -1. Da kannst Du dann eine Logik drumherum bauen.

Aber auch die Methode lässt sich in mehrere Methoden aufteilen, so dass es deutlich einfacher wird, den Code zu verstehen.

Ein weiterer Schritt könnte sein, dass man dies objektorientiert aufbaut, aber das ist vermutlich noch ein Schritt zu viel im Augenblick und dazu kommst Du erst später.
 
Hallo, ich bin noch recht ein Amateur und würde ein Ratespiel kodieren. Jedoch weiß ich nicht wie ich ein neues Wort zum erraten einfügen kann, sodass
mehrere levels entstehen. Zum Beispiel möchte ich das nachdem das erste Wort richtig erraten wurde die abfrage kommt also System.out.println("möchtest du mit dem nächsten level fortfahren ?"); das mann dann entweder ja oder nein eintippen kann sodass entweder das neue level bzw. das neue Wort erraten werden kann oder das sich cmd schließt. Wenn ihr Ideen habt schreibt bitte codes rein und wenn ihr könnt erklärt sie mir damit ich sie auch in zukunft verwenden kann.
Habe einmal das Spiel Hangman zur Übung gemacht.
Das Spiel verlang zu Beginn ein neues Wort, das nicht in der Wortliste gespeichert ist.
Dann bekommt man Punkte als Platzhalter für die Buchstaben.
Man versucht dann einen richtigen Buchstaben zu erraten, der falls korrekt die Punkte ersetzt an denen er im gesuchten Wort vorkommt.
Andernfalls wird das Galgenmännchen um ein Zeichen erweitert.
Am Ende wird man gefragt ob man weitermachen möchte.
Hier der Code dazu: Abgesehen vom Wordserver spielt sich alles in der Klasse Gallow ab.
Java:
import java.util.Scanner;

public class Gallow {
    private static Scanner in = new Scanner(System.in);
    private static WordServer wordServer = WordServer.getInstance();
    public static final int MAX_MISTAKES = 8;

    public static void main(String[] args) {
        enterGameByNewWord();
        boolean playing = true;
        while (playing && doGame())
            playing = isYesAnswer("Wollen Sie noch einmal spielen");
        wordServer.printWords();
        in.close();
    }

    private static boolean doGame() {
        int mistakes = 0;
        String word = wordServer.getNotUsedRandomWord();
        if (word == null) {
            System.out.println("Alle Wörter sind schon benutzt worden!");
            return false;
        }

        char[] found = new char[word.length()];
        for (int i = 0; i < found.length; i++)
            found[i] = '.';
        do {
            printSeperator();
            drawGallow(mistakes, found);
            char c = inputLetter(word, found, mistakes);

            int idx = word.indexOf(c);
            if (idx < 0) {
                mistakes++;
                if (mistakes == MAX_MISTAKES) {
                    drawGallow(mistakes, found);
                    System.out.println("Leider konntest Du das Wort '" + word + "' nicht erraten!\n");
                    return true;
                }
            } else {
                found[idx] = c;
                while ((idx + 1) < word.length() && (idx = word.indexOf(c, idx + 1)) >= 0)
                    found[idx] = c;
            }

        } while (!word.equals(new String(found)));
        System.out.println("\nBravo, Du hast das Wort '" + word + "' erraten!\n");
        return true;
    }

    public static void drawGallow(int mistakes, char[] found) {
        String[][] man = { { "   |" }, { "   O" }, { "  /", "|", "\\" }, { "  _", "|", "_" } };
        System.out.println("+---+\t" + new String(found));
        for (int i = 0; i < man.length; i++) {
            System.out.print("|");
            if (i < 2) {
                if (mistakes > i)
                    System.out.print(man[i][0]);
            } else {
                int offMistake = mistakes - 2 - 3 * (i - 2);
                if (offMistake > 3)
                    offMistake = 3;
                for (int ii = 0; ii < offMistake; ii++)
                    System.out.print(man[i][ii]);
            }
            System.out.println();
        }
        System.out.println("+");
    }

    private static void enterGameByNewWord() {
        printSeperator();
        System.out.println("Willkommen zum Galgenmann - Spiel:\n\n");
        String word = null;
        boolean ok = false;
        do {
            System.out.println("Um das Spiel zu beginnen geben Sie bitte ein neues korektes Suchwort ein!");
            word = inputNewWord();
            if (word == null)
                continue;
            if (wordServer.contains(word))
                System.out.println("Das Wort '" + word + "' existiert bereits!");
            else {
                wordServer.addWord(word);
                wordServer.setwordUsed(word);
                ok = true;
            }
        } while (!ok);
        wordServer.save();
        System.out.println();
    }

    public static char inputChar() {
        String input = in.nextLine();
        if (input == null || input.length() == 0)
            return '\n';
        return input.toUpperCase().charAt(0);
    }

    private static char inputLetter(String word, char[] found, int mistakes) {
        System.out.print("Gebens Sie eine Buchstaben ein: ");
        return inputChar();
    }

    public static String inputNewWord() {
        System.out.println("Geben Sie ein neues Suchwort ein:");
        String word = in.nextLine();
        if (word.length() < 1) {
            System.out.println("Das Wort ist zu kurz!");
            return null;
        }

        if (!isYesAnswer("Ist das Wort " + word + " korrekt ?"))
            return null;
        return word;
    }

    public static boolean isYesAnswer(String label) {
        System.out.print(label + "\t(J fuer ja) :");
        char c = inputChar();
        return c == 'J';
    }

    private static void printSeperator() {
        System.out.println("**********************************");
    }

}
Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;

public class WordServer {
    public static final String wordFile = "./words.txt";
    private static final Random rnd = new Random(System.currentTimeMillis());
    private static ArrayList<String> words = new ArrayList<String>();
    private static ArrayList<String> usedWords = new ArrayList<String>();
    private static WordServer instance = null;

    private static boolean changed = false;

    private WordServer() {
        load();
    }

    public boolean addWord(String word) {
        word = formatWord(word);
        if (words.contains(word))
            return false;
        changed = true;
        return words.add(word);
    }

    public static String formatWord(String word) {
        return word.trim().toUpperCase();
    }

    public boolean contains(String word) {
        word = formatWord(word);
        return words.contains(word);
    }

    public static WordServer getInstance() {
        if (instance == null)
            instance = new WordServer();
        return instance;
    }

    public String getNotUsedRandomWord() {
        String word = getRandomWord();
        while (word != null && usedWords.contains(word))
            word = getRandomWord();
        usedWords.add(word);
        return word;
    }

    private String getRandomWord() {
        if (isEmpty() || usedWords.size() == words.size())
            return null;
        return words.get(rnd.nextInt(words.size()));
    }

    public boolean isEmpty() {
        return words.isEmpty();
    }

    private void load() {
        File file = new File(wordFile);
        if (!file.exists()) {
            addWord("haus");
            addWord("mauer");
            addWord("kuchen");
            save();
            return;
        }
        try {
            FileReader fR = new FileReader(file);
            BufferedReader bR = new BufferedReader(fR);
            String word = null;
            while ((word = bR.readLine()) != null)
                addWord(word);
            bR.close();
            fR.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void printWords() {
        Iterator<String> it = words.iterator();
        int i = 1;
        while (it.hasNext()) {
            System.out.print(it.next());
            if (i % 5 == 0)
                System.out.println();
            else if (it.hasNext())
                System.out.print(", ");
            i++;
        }
    }

    public boolean removeWord(String word) {
        boolean ok = words.remove(word);
        if (ok)
            changed = true;
        return ok;
    }

    public void resetUsedWords() {
        usedWords.clear();
    }

    public void setwordUsed(String word) {
        word = formatWord(word);
        if (words.contains(word))
            usedWords.add(word);
    }

    public void save() {
        if (!changed)
            return;
        try {
            FileWriter fW = new FileWriter(wordFile, false);
            PrintWriter pW = new PrintWriter(fW, true);
            Iterator<String> it = words.iterator();
            while (it.hasNext())
                pW.println(it.next());
            pW.close();
            fW.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}


1653602592375.png
 

Anhänge


Zurück
Oben