Variablen Variablen in einer Schleife erstellen lassen

Diskutiere Variablen in einer Schleife erstellen lassen im Java Basics - Anfänger-Themen Bereich.
S

smogpaster

Hallo liebe Java-Forum-Menschen!

Ich bin ganz neu dabei im Lernen der Java-Programmierung und habe eine Frage, deren Antwort möglicherweise etwas zu knifflig für mich sein könnte. Aber ich lasse es darauf ankommen.

Mein Problem:

Ich möchte ein Programm fürs Pen and Paper schreiben, das mir die Ini-Reihenfolge der Charaktere anzeigt. Zuerst soll es abfragen, wieviele Charaktere teilnehmen, dann für jeden Spieler den Namen und die dazugehörige Ini. Soweit so gut.

Ich habe bereits folgendes Programm geschrieben:

Code:
package Hello;
import java.util.Scanner;
public class Main_Class {
    
        public static void main(String[] args) {
          
            
            //Abfrage Anzahl Charaktere
        
            System.out.println("Wieviele Spielercharaktere? ");
            Scanner AnzahlCharaktere = new Scanner(System.in);
            int inputAnzahlCharaktere = AnzahlCharaktere.nextInt();
            
            while(inputAnzahlCharaktere > 0){ //Beginn Schleife
            
                //Charakter Name
                System.out.println("Gebe den Namen von Charakter " + inputAnzahlCharaktere +" ein: ");
                Scanner Charakter1 = new Scanner(System.in);
                String inputCharakter1 = Charakter1.nextLine();   
                
                //Charakter Ini
                System.out.println("Gebe die Ini von Charakter "+ inputAnzahlCharaktere + " ein: ");
                Scanner IniCharakter1 = new Scanner(System.in);
                String inputIniCharakter1 = IniCharakter1.nextLine();
                
            inputAnzahlCharaktere--;
            
            
            
            
            }
            
            System.out.println(inputAnzahlCharaktere);
            System.out.println("Ende");
            
            
            
            
            
            //Abfrage Rundenstart - noch zu tun
            
            //Abfrage höchste Ini - noch zu tun
            
            //Display höchste Ini mit Namen - noch zu tun
            
            //Display andere Inis mit Namen - noch zu tun
            
            //Abfrage nächste Runde? - noch zu tun
            
    
            
            
        }
}
Das funktioniert soweit auch. Mein Problem besteht jetzt nur darin, mehr Variablen als nur die für den Charakter 1 zu erstellen. Ich könnte sie natürlich alle im Vorhinein erstellen und im Code implementieren, das fände ich aber sehr unschön, da dann ja viele ungenutzte Zeilen im Code umherflirren würden.

Mein Wunsch wäre folgendes:

Solange die while-Schleife läuft, sollen stets zwei neue Variablen erstellt werden, die die neuen Charakter-Daten aufnehmen können.

Ist das irgendwie möglich?

Ich freue mich sehr über Hilfe :)

Liebe Grüße

smog
 
X

Xyz1

Meinst Du so?
Java:
		int n = 5;
		Scanner scan = new Scanner(System.in);
		for (int i = 0; i < n; i++) {
			System.out.println((i + 1) + " a und b:");
			String[] a = scan.nextLine().split(" ");
			int i1 = Integer.parseInt(a[0]);
			int i2 = Integer.parseInt(a[1]);
			System.out.println(i1);
			System.out.println(i2);
		}
Tupel können in Java nicht anders eingegeben werden.
 
J

JustNobody

Wonach Du suchst dürften Arrays sein. Evtl. willst Du die einmal nachlesen?

Also grob sieht es so aus:
int inputAnzahlCharaktere = AnzahlCharaktere.nextInt();
Hier hast Du jetzt die Anzahl an Charaktere, die eingeben werden sollen. Also definierst du dir nun entsprechende Arrays:
Code:
String[] inputCharakters = new String[inputAnzahlCharaktere];
String[] inputIniCharakters = new String[inputAnzahlCharaktere];
Und das kannst Du nun in einer for Schleife füllen:
Java:
for (int i=0; i<inputAnzahlCharaktere; i++) {
    inputCharakters[i] = IN.nextLine();
    inputIniCharakters[i] = IN.nextLine();
}
Und Du musst nicht ständig eine neue Scanner Instanz erzeigen. Mach direkt in deine Klasse ein:
public static final Scanner IN= new Scanner(System.in);
Dann kannst du in der ganzen Klasse einfach immer auf den Scanner IN zugreifen, wenn du etwas einlesen willst. Und von außerhalb kannst Du dann Main_Class.IN nutzen.

Dann noch ein paar weitere allgemeine Hinweise:
Bei der Namensgebung in erster Linie die Funktion oder den Inhalt beschreiben. Woher etwas kommt ist in der Regel unwichtig. Ich würde also die Variablen eher sowas wie characterName, chatacterIni (was ist ini?), ... nennen.
Und bei den meisten Namen wir ein PascalCase oder camelCase verwendet. Also kein _. Main_Class wird also MainClass bzw, da wir nicht schreiben, dass die Klasse eine Klasse ist: einfach Main. Du bist ja auch "smog" und nicht "smogUser" oder "smogMensch". Und ich bin Konrad und nicht KonradMensch :)

Ich hoffe, ich konnte Dir weiter helfen.

Viele Grüße und frohe Ostern,

Konrad
 
S

smogpaster

Hallo zusammen!

@Xyz1: Ich befürchte, deine Lösung hilft mir leider nicht wirklich weiter. Ich bin mir auch nicht wirklich sicher, was genau dein Code macht :/

@JustNobody: Danke! Das war genau, was ich gesucht habe. Obwohl ich mich mit den Arrays noch etwas mehr auseinandersetzen muss, die habe ich noch nicht voll durchstiegen!
Ich habe auch die anderen Vorschläge gerne angenommen. Gerade das mit dem Scanner in der Klasse macht es doch einfacher :) Allerdings habe ich jetzt zwei Scanner in der Klasse erstellt, da er mir einen Fehler ausgegeben hat, wenn ich mit dem einen sowohl int als auch String einlesen wollte. Jetzt habe ich einen für int und einen für String.
Ini steht für Initiative und zeigt im Rollenspiel an, in welcher Reihenfolge die Charaktere in einem Kampf handeln können. Der mit der höchsten Ini startet zuerst, dann der mit der zweithöchsten und so weiter. Jeder Charakter hat für gewöhnlich einen Ini-Basiswert, auf den dann noch ein Würfelwurf hinzukommt.

Ich bin nun schon ziemlich weitergekommen, habe aber noch eine weitere Frage, die vielleicht (hoffentlich?) etwas einfacher zu beantworten sein wird. Und zwar möchte ich den User auffordern, jeweils den Namen und die Ini der Charaktere einzugeben. Da die Arrays aber bei 0 starten, kann ich, wenn ich i als Nummerierung der Charaktere benutze, bisher nur ausgeben: "Bitte gebe den Namen von Charakter 0 ein", bevor die Zählung weitergeht. Ich hätte aber gerne, dass der erste Charakter auch mit 1. benannt werden kann.
Gibt es eine Möglichkeit, meine Variable i nur in der Ausgabe immer um 1 zu erhöhen? Ich habe es mit "+1" versucht, aber daraus wurde dann 01, 11, 21 usw.

Mein Code sieht momentan jetzt so aus:

Code:
package IniAnzeige;
import java.util.Scanner;
public class Main {
public static final Scanner IN= new Scanner(System.in);
public static final Scanner IN2= new Scanner(System.in);

        public static void main(String[] args) {
          
            
            //Abfrage Anzahl Charaktere
        
            System.out.println("Wieviele Spielercharaktere? ");
            
        
            int inputAnzahlCharaktere = IN2.nextInt();
            
            
            String[] inputNameCharakter = new String[inputAnzahlCharaktere];
            int[] inputIniCharakter = new int[inputAnzahlCharaktere];
            
            for (int i=0; i<inputAnzahlCharaktere; i++) {
                System.out.println("Bitte gebe den Namen des " + i + ". Charakters ein: ");
                inputNameCharakter[i] = IN.nextLine();
                System.out.println("Bitte gebe die Ini des " + i + ". Charakters ein: ");
                inputIniCharakter[i] = IN2.nextInt();
            }
            
            for (int i=0; i<inputAnzahlCharaktere; i++) {
                System.out.println(inputNameCharakter[i]);
                System.out.println("Ini " + inputIniCharakter[i]);
            }
                
            
            
            
            //Abfrage Rundenstart - noch zu tun
            
            //Abfrage höchste Ini - noch zu tun
            
            //Display höchste Ini mit Namen - noch zu tun
            
            //Display andere Inis mit Namen - noch zu tun
            
            //Abfrage nächste Runde? - noch zu tun
        }
}

Danke vielmals für eure Hilfe, das ist Gold wert! Auch an dich, @M.L., ich schaue mir das bestimmt später mal an, wenn ich weiter fortgeschritten bin!
 
J

JustNobody

Also das mit den zwei Scannern ist nicht unbedingt eine gute Idee. Ein Scanner sollte ausreichen. Du musst nur verstehen, wie der Scanner funktioniert.

Eine Problematik, die auftreten kann, ist, dass er einen Zeilenumbruch im Puffer hat und es dann daran hängt. In solchen Fällen kann man dann einfach mittels nextLine den noch im Puffer befindlichen Zeilenumbruch entfernen.

Wenn Du willst kannst du gerne einmal zeigen, wann an welcher Stelle das Problem mit einem scanner aufgetreten ist und dann würde ich den Fall im Detail noch erläutern.
 
S

smogpaster

Hi, hm, ok.

Folgender Fehler passiert, wenn ich den Code kompiliere:

Code:
Wieviele Spielercharaktere?
5
Bitte gebe den Namen des 0. Charakters ein:
Bitte gebe die Ini des 0. Charakters ein:
PEter
Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:939)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
    at HelloPro/IniAnzeige.Main.main(Main.java:24)
Er gibt also die beiden System.outs. auf einmal aus, ohne zwischendurch eine Eingabe zu erwarten und am Ende kommt es dann noch zum zu sehenden Fehler.

Hast du ne Idee?

Und kannst du mir mit dem anderen Problem (Dass die Zählung bei 1 beginnt) vielleicht auch weiterhelfen? :)
 
J

JustNobody

Das Array startet mit index 0. Wenn Du da die Ausgabe ab 1 haben willst, dann kannst Du bei der Ausgabe auf den Wert ja 1 addieren.

Und hier schlägt das Problem mit dem Zeilenumbruch auf:
Der Scanner bekommen von der Eingabe eine Serie von Zeichen. Für die Eingabe ist aber immer die Enter-Taste das, was die weitere Abarbeitung triggert (das '\n' Zeichen).

Also bei der Abfrage nach der Anzahl der Spielcharaktere gibst du ein '5' und '\n' (Also die Enter-Taste).
nextInt liest aber nur die '5' - daher ist das '\n' noch da.

Dann kommt die Eingabe des Namens. Das nextLine findet nun aber noch dieses '\n' aus der vorherigen Eingabe. Daher ist er sofort zufrieden und der Name ist der leere String ("").
Nun kommt die Abfrage nach der Ini, was eine Zahl sein soll. Du gibst aber "PEter" ein. Das ist keine Zahl und nextInt meckert.

Was also nach dem ersten nextInt kommen muss ist ein weiterer Aufruf von nextLine. Dadurch löscht Du alles, was noch nach der Zahl kommt:
Java:
System.out.println("Wieviele Spielercharaktere? ");
int inputAnzahlCharaktere = IN2.nextInt();
IN2.nextLine(); // Bis einschließlich den Zeilenumbruch raus lesen.
Das Gleiche musst Du auch machen bei der anderen nextInt() Abfrage.
 
S

smogpaster

Hallo und als erstes: Frohe Osterfeiertage! Ich hoffe, ihr habt trotz der Umstände eine schöne Zeit.

Vielen Dank für deine ausführlichen Ratschläge @JustNobody! Die Sache mit nur einem Scanner funktioniert jetzt und ich habe das Problem auch verstanden!

Noch nicht weitergekommen bin ich aber mit dem Addieren des Wertes des Indexes. Offenbar habe ich hier einen blöden Denkfehler?
Wenn ich auf i eins addiere, dann ändere ich damit ja die gesamte Bedingung der Schleife. Das führt bei mir nicht nur zu falschen Werten, sondern auch noch zu einem Absturz des Programms.

Der Code:

Code:
 //for-Schleife zur Abfrage der Namen und Inis
            for (int i=0; i<inputAnzahlCharaktere; i++) {
                System.out.println("Bitte gebe den Namen des " + ++i + ". Charakters ein: ");
                inputNameCharakter[i] = IN.nextLine();
                System.out.println("Bitte gebe die Ini des " + i + ". Charakters ein: ");
                inputIniCharakter[i] = IN.nextInt();
                IN.nextLine();
            }
Der Fehler:

Code:
Wieviele Spielercharaktere?
3
Bitte gebe den Namen des 1. Charakters ein:
Mark
Bitte gebe die Ini des 1. Charakters ein:
4
Bitte gebe den Namen des 3. Charakters ein:
tom
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
    at HelloPro/IniAnzeige.Main.main(Main.java:22)
Was mache ich falsch?

Danke noch einmal im Voraus für die Beantwortung dieser (vorerst) letzten Frage!
 
M

M.L.

ArrayIndexOutOfBounds..... und Zeile 22 deutet auf diese Codezeilen hin:
Java:
int inputAnzahlCharaktere = IN2.nextInt();
            String[] inputNameCharakter = new String[inputAnzahlCharaktere];
            int[] inputIniCharakter = new int[inputAnzahlCharaktere];
Hier wird ein Array mit fixer Länge angelegt (z.B. 3, macht dann die Indexe 0,1,2) und später der Index überschritten. Für später (Stichwort: dynamisches Array) gibt es "Vector", "ArrayList", "CopyOnWriteArrayList "
 
J

JustNobody

Du willst doch nicht i erhöhen sondern lediglich i+1 ausgeben, also sowas machen:
System.out.println("Bitte gebe den Namen des " + (i+1) + ". Charakters ein: ");
bzw. dann 2 Zeilen später:
System.out.println("Bitte gebe die Ini des " + (i+1) + ". Charakters ein: ");

Es wird also i nicht verändert sondern lediglich vor der Ausgabe i+1 gerechnet um das Ergebnis dann auszugeben.
 
S

smogpaster

Ah, super, die Klammern haben mir gefehlt! Vielen Dank! Damit wäre nun alles geklärt und ich kann mich an meine restlichen Baustellen machen. Das war eine super Hilfe!
 
Thema: 

Variablen in einer Schleife erstellen lassen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben