Schleife mit Abbruchbedingung

crazyyou

Mitglied
Hallo Leute,

ich hab ein kleines Problem, ich versuche nämlich ein Textbasiertes Spiel für die Schule zu erstellen.

Zu meiner Frage:

Wenn die Auswahl getroffen wird in die Bibliothek zu gehen, soll man gefragt werden was man dort tun möchte und daraufhin ggf. was man durchsuchen möchte.

Im moment klappt das schon wenn man die richtigen Werte angibt, jedoch soll der bei einer falschen Eingabe, eine Meldung ausgeben und aus der Schleife Rausspringen.

Zeile 108 - 128

Wäre noch nett wenn ihr mir allgemeine Tipps geben könntet, was ich sonst noch so verbessern könnte.
Ich setzte mich erst seit 2 Monaten mit Java auseinander, also knallt mir hier bitte nicht die Fachwörter vor den Kopf. 🙂

Danke schonmal...

MfG crazyyou

Java:
package restrike;

import javax.swing.*;

/**
 * @author crazyyou
 * @version 1.0
 * Java Game ReStrike
 */
public class Main {

    public static void main(String[] args) {

        //Variablen
        String auswahl = "";
        int treffer=0;

        int sieg = 0;
        /*Variable für Sieg oder Niederlage
         * 0 = Resume
         * 1 = Zombie Tod
         * x = Gewonnen
         * x = Verloren
         * x = Zeit um
         */

        int raumwahl;

        //Optionen
            //Möglichkeiten zum Durchsuchen
                    Object[] suche = {"Durchsuchen","durchsuchen",
                                      "Durchsuche","durchsuche",
                                      "Suchen","suchen",
                                      "Suche","suche",
                                      "Stöbern","Stoebern","stöbern","stoebern",
                                      "Search","search"};
                                     //14 Stück -- 13 Arrayfelder
            //Möglickeiten zum Angriff
                  Object[] angriff = {"Angriff","angriff",
                                      "Attacke","attacke",
                                      "Töten","töten","Toeten","toeten","Töte","töte","Toete","toete",
                                      "Kill","kill",
                                      "an Koten","an koten" //Easteregg
                  };
                                     //16 Stück -- 15 Arrayfelder
            //Möglickeiten zum Flüchten
                Object[] fluechten = {"Flüchten","flüchten","Fluechten","fluechten",
                                      "Fliehen","fliehen",
                                      "Flieh","flieh",
                                      "Laufen","laufen",
                                      "Run","run",
                                      "Abhauen","abhauen"
                };
                                     //14 Stück -- 13 Arrayfelder
            //Möglichkeit Item zu Nutzen
                     Object[] item = {"Item Nutzen","Item nutzen","item Nutzen","item nutzen",
                                      "Use Item","Use item","use Item","use item",
                                      "","","","","",""

                     };
        //Variable um Objekt zu dursuchen
            String searchobject = " ";
        //Durchsuchbare Objekte
            //Bibliothek
                  Object[] biblioitem = {//Array 0-5
                                      "Bücherregal","bücherregal","Buecherregal","buecherregal",
                                      "Regal","regal",
                                      //Array 6-11
                                      "Couch","couch",
                                      "Sitz","sitz",
                                      "Stuhl","stuhl",
                                      //Array 12-19
                                      "Tischlampe","tischlampe",
                                      "Lampe","lampe",
                                      "Nachtleuchte","nachtleuchte",
                                      "Leuchte","leuchte",
                                      //Array 20-21
                                      "Tisch","tisch"
                  };

        //Raumgebundene möglickeiten zum Durchsuchen
        int test = 0;

        //Auffindbare Objekte
        int birne=0;
        int brecheisen;

        //Räume
        Object[] options = {"Bibiliothek","Wohnzimmer","Esszimmer","Kammer","Keller"};

        //Willkommen
        JOptionPane.showMessageDialog(null,"Willkommen bei ReStrike", "ReStrike", JOptionPane.PLAIN_MESSAGE);


        //Sozusagen die Main
        do {
            raumwahl = JOptionPane.showOptionDialog(null,"Willkommen bei ReStrike","ReStrike",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,null,options,options[4]);

            switch(raumwahl) {
                case 0:
                    auswahl = JOptionPane.showInputDialog(null,"Du befindest dich nun in der Bibliothek\n"
                                                              +"Der Raum ist förmlich mit Bücherregalen Tapeziert.\n"
                                                              +"In der Mitte befindet sich eine Couch,\n"
                                                              +"anbei ein kleiner Tisch worauf sich eine Nachtleuchte befindet.\n\n"
                                                              +"Was möchtest du tun?", "ReStrike", JOptionPane.QUESTION_MESSAGE);


    for (int i = 0; i < suche.length; i++) {
        // Vielleicht eine for schleife für die zweite if Bedingung
        if (!suche[i].equals(auswahl)){
            JOptionPane.showMessageDialog(null,"Eingabe unbekannt1","",JOptionPane.ERROR_MESSAGE);

        }
        else {
            searchobject = JOptionPane.showInputDialog(null, "Welches Objekt möchtest du Durchsuchen?",JOptionPane.QUESTION_MESSAGE);
            for (int n = 12; n < 19; n++) {
            if (!biblioitem[n].equals(searchobject)){
                JOptionPane.showMessageDialog(null,"Eingabe unbekannt2","",JOptionPane.ERROR_MESSAGE);
                break;
            }
            else {
                JOptionPane.showMessageDialog(null,"Du hast eine Glühbirne gefunden!");
                birne=1;
                break;
            }
            }
        }
    }
                    break;
                case 1:
                    JOptionPane.showMessageDialog(null,"Wohnzimmer", "ReStrike", JOptionPane.PLAIN_MESSAGE);
                    break;
                case 2:
                    JOptionPane.showMessageDialog(null,"Fernsehzimmer", "ReStrike", JOptionPane.PLAIN_MESSAGE);
                    break;
                case 3:
                    JOptionPane.showMessageDialog(null,"Kammer", "ReStrike", JOptionPane.PLAIN_MESSAGE);
                    sieg=4;
                    break;
                case 4:
                    JOptionPane.showMessageDialog(null,"Keller", "ReStrike", JOptionPane.PLAIN_MESSAGE);
                    sieg=1;
                    break;
            }
        }while(sieg!=4);

    }
}
 
Zuletzt bearbeitet:
Hab das Spiel gerade mal ausprobiert und bin nicht ganz sicher, von welcher Schleife du sprichst (denn da sind ja zwei for-Schleifen ineinandergeschachtelt), aber ich vermute mal, du meinst die äußere for-Schleife. Wenn man nämlich direkt da einen Fehler provoziert, wird immer wieder "Eingabe unbekannt1" ausgegeben. Setzt man hingegen noch ein
Code:
break;
in Zeile 112, kehrt das Spiel zurück zum Start.
Hilft dir das weiter? Ansonsten frag nochmal genauer nach, wo das Problem liegt (in den folgenden ifs hast du ja schon break-Anweisungen).
 
Die Breaks die da sind, sind ja nur für den Fall, dass die if's zutreffen. Wenn ih jetzt noch mehrere Breaks hinzufüge, bricht der ja schon beim ersten durchlauf ab.

Noch zur Erläuterung, die erste for Schleife ist dafür was man tun möchte, sprich suchen oder angreifen, falls man scuhen eingibt soll er dich fragen was durchsuht werden soll. Dann soll er entweder sagen, dass etwas gefunden wurde, dass sich in dem Objekt nichts befindet oder das die Eingabe unbekannt ist. Ich glaube ein switch mit einem String würde mein Problem lösen, das ist leider jedoch nicht möglich...
 
Zuletzt bearbeitet:
Durch die JOptionPane benutzt du ja ohnehin schon so eine Art kleine graphische Oberfläche. Wie wäre es denn, wenn du das ein wenig ausbaust und dem Benutzer RadioButtons zur Verfügung stellst?

Dann kannst du dir die manuellen Nutzereingaben ersparen (was sicher auch den Nutzer freuen wird 🙂) und brauchst keine Errors raushauen, dass es den Befehl "Essen kochen" o.ä. nicht gibt, denn dann kann der Benutzer ohnehin nur noch das anklicken, was da ist.

Also etwa so:

Was möchtest du tun?
* Suchen
* Angreifen
OK

(wenn "Suchen" geklickt wurde):
Was möchtest du durchsuchen?
* mystische Truhe
* Bücherregal
* usw.


Das Spiel "Radical Dreamers", ein Textadventure für SNES, verfährt ähnlich (eben ohne Maus, nur über Tastatur).
 
Du kannst z.B. mit Zuständen arbeiten um die Verschachtelung etwas weg zu kriegen. Hier mal deine do Schleife etwas modifiziert. Ich weiss nicht ob es das ist was du willst aber für mich macht das so Sinn. 🙂

Java:
        //Sozusagen die Main
        do {
            raumwahl = JOptionPane.showOptionDialog(null, "Willkommen bei ReStrike", "ReStrike", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[4]);
            if (raumwahl == -1) {
                break;
            }
            switch (raumwahl) {
                case 0:
                    int state = 0;
                    int error = 0;
                    for (int i = 0; i < 100; i++) {

                        if (state == 0 && error == 0) {
                            auswahl = JOptionPane.showInputDialog(null, "Du befindest dich nun in der Bibliothek\n"
                                    + "Der Raum ist förmlich mit Bücherregalen Tapeziert.\n"
                                    + "In der Mitte befindet sich eine Couch,\n"
                                    + "anbei ein kleiner Tisch worauf sich eine Nachtleuchte befindet.\n\n"
                                    + "Was möchtest du tun?", "ReStrike", JOptionPane.QUESTION_MESSAGE);
                            state = 1;
                        }
                        // Vielleicht eine for schleife für die zweite if Bedingung
                        if (state == 1 && error == 0) {
                            for (int n = 0; n < suche.length; n++) {
                                if (suche[n].equals(auswahl)) {
                                    searchobject = JOptionPane.showInputDialog(null,
                                            "Welches Objekt möchtest du Durchsuchen?",
                                            JOptionPane.QUESTION_MESSAGE);
                                    state = 2;
                                    break;
                                }
                                if (n == suche.length - 1) {
                                    error = 1;
                                }
                            }

                        }
                        if (state == 2 && error == 0) {
                            for (int n = 12; n < 19; n++) {
                                if (biblioitem[n].equals(searchobject)) {
                                    state = 3;
                                    break;
                                }
                                if (n == 19 - 1) {
                                    error = 1;
                                }
                            }
                        }
                        if (state == 3 && error == 0) {
                            JOptionPane.showMessageDialog(null, "Du hast eine Glühbirne gefunden!");
                            break;
                        }
                        if (error == 1) {
                            JOptionPane.showMessageDialog(null, "Hä?");
                            error = 0;
                            state = state - 1;
                        }
                    }
                    break;
                case 1:
                    JOptionPane.showMessageDialog(null, "Wohnzimmer", "ReStrike", JOptionPane.PLAIN_MESSAGE);
                    break;
                case 2:
                    JOptionPane.showMessageDialog(null, "Fernsehzimmer", "ReStrike", JOptionPane.PLAIN_MESSAGE);
                    break;
                case 3:
                    JOptionPane.showMessageDialog(null, "Kammer", "ReStrike", JOptionPane.PLAIN_MESSAGE);
                    sieg = 4;
                    break;
                case 4:
                    JOptionPane.showMessageDialog(null, "Keller", "ReStrike", JOptionPane.PLAIN_MESSAGE);
                    sieg = 1;
                    break;
            }
        } while (sieg != 4);
 
Hab dir mal was Kleines geschrieben. So könnte eine Verwendung von RadioButtons aussehen. Kopieren, kompilieren, ausführen 🙂

Java:
import java.awt.event.*;
import javax.swing.*;

public class Crazyyou {
	JFrame f;
	JPanel p;
	JLabel l;
	JRadioButton[] optionButtons; //die Buttons zum Auswaehlen
	ButtonGroup bg;
	JButton okButton;
	
	public Crazyyou() {
		f = new JFrame("Radiobutton-Demo");
		p = new JPanel();
		p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); //Komponenten sollen untereinander angezeigt werden
		l = new JLabel("Was moechtest du tun?");
		
		optionButtons = new JRadioButton[2];
		optionButtons[0] = new JRadioButton("Suchen");
		optionButtons[1] = new JRadioButton("Angreifen");
		bg = new ButtonGroup(); //wird benutzt, damit nur ein RadioButton zu einer Zeit aktiv sein kann
		bg.add(optionButtons[0]);
		bg.add(optionButtons[1]);
		
		okButton = new JButton("OK");
		okButton.addActionListener(new OkListener());
		
		p.add(l);
		p.add(optionButtons[0]);
		p.add(optionButtons[1]);
		p.add(okButton);
		
		f.add(p);
		f.pack();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}
	
	//Listener-Klasse fuer den Ok-Button
	class OkListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			for(int i=0; i<optionButtons.length; i++) {
				if(optionButtons[i].isSelected()) {
					JOptionPane.showMessageDialog(f, "Es wurde "+optionButtons[i].getText()+" gewaehlt.");
				}
			}
		}
	}
	
	public static void main(String[] args) {
		new Crazyyou();
	}
}
 
Erstmal vielen dank für eure recht schnelle Hilfe.

@Haave
Deine Radio Button Idee ist zwar gut, jedoch finde ich persönlich diese unpassend zu einem "Textgebundenem" Spiel, da sollte man schon selber was eintippen 😉

Ausserdem finde ich es sehr Monoton für den Spieler heutzutage einfach nur auf eins von vier Buttons immer und immer wieder zu klicken. Dadurch das man selber etwas eintippen muss, muss man auch sein Köpfchen (zumindest ein wenig) anstrengen.

@Raum114
Ob du es glaubst oder nicht, ich bin 10 Minuten vor deinem Post auf die selbe Idee gekommen das so zu machen, meine Version ist jedoch nicht so gut wie deine.

Bei meiner Version, wird bei jeder Option etwas ausgegeben, also für die Option Suche, Angriff oder Fliehen. Bei deiner kann man das glaube ich leichter unterdrücken, dadurch das du die Variable Error nutzt. Das hab ich nämlich nicht, ich habe es so gelöst, werde es jedoch deinem angleichen, danke😀

Ne frage hab ich da noch, wenn das Programm mich fragt Welches Objekt durchsucht werden soll steht im Texteingabefeld ne 3, kann mir das einer erklären?!?

Java:
        //Sozusagen die Main
        do {
            raumwahl = JOptionPane.showOptionDialog(null,"Willkommen bei ReStrike","ReStrike",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,null,options,options[4]);

            switch(raumwahl) {
                case 0:
                    auswahl = JOptionPane.showInputDialog(null,"Du befindest dich nun in der Bibliothek\n"
                                                              +"Der Raum ist förmlich mit Bücherregalen Tapeziert.\n"
                                                              +"In der Mitte befindet sich eine Couch,\n"
                                                              +"anbei ein kleiner Tisch worauf sich eine Nachtleuchte befindet.\n\n"
                                                              +"Was möchtest du tun?", "ReStrike", JOptionPane.QUESTION_MESSAGE);


                    // Vergleich Optionen mit Eingabe was getan werden soll
                    for (int i=0;i<suche.length;i++){
                        if (suche[i].equals(auswahl)){
                            JOptionPane.showMessageDialog(null,"Treffer");
                            treffer=1;
                            break;
                        }
                        else
                            treffer=0;
                    }
                    //Wenn Vergleich zutreffend, Vergleich ob gesuchtes Objekt übereinstimmend mit gegebenem Objekt ist
                    if (treffer == 1){
                        //Eingabe was durchsucht werden soll
                        searchobject = JOptionPane.showInputDialog(null, "Welches Objekt möchtest du Durchsuchen?",JOptionPane.QUESTION_MESSAGE);
                                        for (int i=0;i<biblioitem.length;i++){
                                            //Vergleich ob Objekt mit Eingabe übereinstimmt
                                            if (biblioitem[i].equals(searchobject)){
                                                JOptionPane.showMessageDialog(null,"Objekt existiert");
                                                trefferobjekt=1;
                                                break;
                                            }
                                            else
                                                trefferobjekt=0;
                                        }
                                        //Objekt wurde gefunden
                                        if (trefferobjekt == 1){
                                            JOptionPane.showMessageDialog(null,"Gefunden");
                                        }
                                        //Objekt wurde nicht gefunden
                                        else {
                                            if (trefferobjekt == 0)
                                                JOptionPane.showMessageDialog(null,"Es wurde nichts gefunden");
                                        }
                    }
                    //Option nicht gefunden
                    else {
                        if (treffer == 0)
                            JOptionPane.showMessageDialog(null,"Nicht möglich");
                    }
                    treffer = 0;

//---------------------------------------------------------------------------------------------------------
                    
                    //Durchlauf für Angriff
                    for (int i=0;i<angriff.length;i++){
                        if (angriff[i].equals(auswahl)){
                            treffer=1;
                            break;
                        }
                        else
                            treffer=0;
                    }
                    if (treffer == 1)
                        JOptionPane.showMessageDialog(null,"Nix zum angreifen!");
                    else
                        JOptionPane.showMessageDialog(null,"Eingabe unbekannt!");

                    break;
                case 1:
                    JOptionPane.showMessageDialog(null,"Wohnzimmer", "ReStrike", JOptionPane.PLAIN_MESSAGE);
                    break;
                case 2:
                    JOptionPane.showMessageDialog(null,"Fernsehzimmer", "ReStrike", JOptionPane.PLAIN_MESSAGE);
                    break;
                case 3:
                    JOptionPane.showMessageDialog(null,"Kammer", "ReStrike", JOptionPane.PLAIN_MESSAGE);
                    sieg=4;
                    break;
                case 4:
                    JOptionPane.showMessageDialog(null,"Keller", "ReStrike", JOptionPane.PLAIN_MESSAGE);
                    sieg=1;
                    break;
            }
        }while(sieg!=4);

    }
 
Zuletzt bearbeitet:

Zurück
Oben