Prüfen ob ein String den selben Namen hat wie eine Booleanreihe?

oOJavaNeulingOo

Bekanntes Mitglied
Hallo 🙂 !

Ich wollte fragen, ob man prüfen kann ob ein Boolean mit dem Namen des Strings existiert und dann den wert von diesem zurückgibt.

Also zB in meiner Hauptklasse habe ich einen statischen boolean:

public static boolean test = true;

und jetzt will ich gucken ob meine Hauptklasse einen Boolean mit dem Namen meines Strings enthält, und wenn ja soll es den wert von diesem boolean zurückgeben.

Ich habe aber keine Idee wie ich das machen könnte..

MfG
 
Hm :/

Und wenn man weiß dass der Boolean existiert, und nun darauf zugreifen will?

Ich will nämlich eine Art Tic Tac Toe machen, und habe dafür jeweils ein boolean für jedes Feld, und der input ist worauf man setzt - Und dann muss diese methode mir diesen boolean zurückgeben.. (Um zu gucken ob das feld besetzt ist oder nicht :/ )

Muss ich da jetzt wirklich alles in ein Set stecken D: ?

MfG

PS: Kann man denn generell so eine erkennung bauen? Also dass dein ein String in einer bestimmten Klasse mit dem gleichen Namen von dem Input zu etwas bestimmtem gesetzt wird?
 
Zuletzt bearbeitet:
Tic Tac Toe hat doch nur 3x3 Felder. Warum kein mehrdimensionales Array?

Möglicherweiße per Reflection, ich kenne mich da nicht wirklich aus. Allerdings fällt mir auch kein Fall ein, in dem das nötig sein dürfte. Hab aber nicht so viel Erfahrung wie die meisten hier.
 
Nunja, ehrlich gesagt, keine Ahnung was ein 3dArray ist.. Ich bin wirklich totaler Anfänger, und wollte ebe n so ein TicTacToe-Konsolen Spiel machen, um ein bisschen zu üben. Mein bisheriger Code sieht so aus:

Main:
Code:
package t;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class T {
	
	public static void main(String[] args) {
		new T().start();
	}

	
	
	
	
	
	public static String leerfeld = "m", playerfeld = "x" , comfeld = "o";
	public static boolean
	a1 = false,	a2 = false,	a3 = false,
	b1 = false,	b2 = false, b3 = false,
	c1 = false, c2 = false, c3 = false;
	
	
	
	
	protected void start(){
		System.out.println("Willkommen bei Tic Tac Toe! Zum setzten eines Steines auf ein Feld, einfach den Feld-Namen eingeben!");
		System.out.println("");
		util.printFeld(a1, a2, a3, b1, b2, b3, c1, c2, c3);
		
		player_Zug();
	}
	
	protected void player_Zug(){
		System.out.println("Du bist dran!");
		String input = null;
		
		//Input lesen
		try {
			input = (new BufferedReader(new InputStreamReader(System.in))).readLine();
		} catch (IOException e) {e.printStackTrace();}
		
		if(util.inputExists(input)){
			if(util.nothingOn(input)){
				
			}else{
				System.out.println("Dieses Feld ist besetzt!");
				player_Zug();
			}
		}else{
			System.out.println("Dieses Feld existiert nicht!");
			player_Zug();
		}
	}
}

Meine util Klasse:
Code:
package t;

public class util {
	
	public static boolean inputExists(String in){
		if(in.equalsIgnoreCase("a1") || in.equalsIgnoreCase("a2") || in.equalsIgnoreCase("a3") || in.equalsIgnoreCase("b1") || in.equalsIgnoreCase("b2")
			|| in.equalsIgnoreCase("b3") || in.equalsIgnoreCase("c1") || in.equalsIgnoreCase("c2") || in.equalsIgnoreCase("c3")){
			return true;
		}else{
			return false;
		}
	}
	public static boolean nothingOn(String in){
		return true;
	}
	
	public static String a;
	public static String aa;
	public static String aaa;
	public static String b;
	public static String bb;
	public static String bbb;
	public static String c;
	public static String cc;
	public static String ccc;
	
	
	public static void printFeld(boolean a1, boolean a2, boolean a3, boolean b1, boolean b2, boolean b3, boolean c1, boolean c2, boolean c3){
		System.out.println("  1 2 3");
		StringBuilder sbA = new StringBuilder().append("a ");
		StringBuilder sbB = new StringBuilder().append("b ");
		StringBuilder sbC = new StringBuilder().append("c ");
		
		if(a1){sbA.append(a + " ");}else{sbA.append(T.leerfeld +  " ");}
		if(a2){sbA.append(aa + " ");}else{sbA.append(T.leerfeld +  " ");}
		if(a3){sbA.append(aaa + " ");}else{sbA.append(T.leerfeld +  " ");}
		
		if(b1){sbB.append(b + " ");}else{sbB.append(T.leerfeld +  " ");}
		if(b2){sbB.append(bb + " ");}else{sbB.append(T.leerfeld +  " ");}
		if(b3){sbB.append(bbb + " ");}else{sbB.append(T.leerfeld +  " ");}
		
		if(c1){sbC.append(c + " ");}else{sbC.append(T.leerfeld +  " ");}
		if(c2){sbC.append(cc + " ");}else{sbC.append(T.leerfeld +  " ");}
		if(c3){sbC.append(ccc + " ");}else{sbC.append(T.leerfeld +  " ");}
		
		System.out.println(sbA.toString());
		System.out.println(sbB.toString());
		System.out.println(sbC.toString());
		
	}

}

Bei der Methode "nothingOn" will ich den Wert des booleans mit dem Namen des Inputs zurückgeben, und immer wenn ein Zug durchgeführt wurde, will ich eins der Felder von "a, aa, aaa, b bb" und so weiter zu dem jeweiligem Feld setzen: Also Playerfeld oder comfeld.
 
Ich würde dir raten (auch wenn es dich wahrscheinlich nervt) dich in Arrays einzulesen. Datenspeicherung ist eine der Hauptaufgaben einer Anwendung, wenn du da jedes mal eine Variable anlegst kennst du dich bald nicht mehr aus. Außerdem wirst du irgendwann auch testen wollen wer gewonnen hat, und falls du das ohne Schleife lösen willst wird das richtig hart.

Ein 2D-Array reicht, du willst ja eine Fläche und keinen Raum modellieren. ^^
 
Vielen Dank 😀 !

Werde ich dann mal probieren 🙂 !

Aber wären Hashmaps nicht besser? Ich mein, in einem Array habe ich ja keinen Key um darauf zuzugreifen, und somit keine Ahnung wie ich es rausbekomme..

Sorry wegen den doofen Fragen, meine einzigen Erfahrungen mit Java lagen bis jetzt bei der "BukkitAPI" eines Spieles namens "Minecraft" 🙁
 
Bei einen Array von 3x3 Feldern kannst du einfach per Feld-ID (beginnend bei 0) darauf zugreifen:

array[0][0] = ...; //Feld 0/0
array[1][2] = ...; //Feld 1/2
array[2][2] = ...; //Feld 2/2
array[3][0] = ...; //ArrayIndexOutOfBoundsException 😀
 
Okay, habe jetzt die 2dArrays benutzt, allerdings bekomme ich eine Fehlermeldung.

Hier die Fehlermeldung - Oder besser gesagt der ganze Output. a1 ist meine Eingabe.
Code:
Willkommen bei Tic Tac Toe! Zum setzten eines Steines auf ein Feld, einfach den Feld-Namen eingeben!

  1 2 3
a m m m 
b m m m 
c m m m 
Du bist dran!
a1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 49
	at t.util.nothingOn(util.java:16)
	at t.T.player_Zug(T.java:61)
	at t.T.start(T.java:45)
	at t.T.main(T.java:11)

T.java:
Java:
package t;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

public class T {
	
	public static void main(String[] args) {
		new T().start();
	}

	
	
	
	//Definiert ob ein Feld leer ist, dem Spieler gehört, oder dem PC gehört.
	public static final int LEER = 2, SPIELER = 0, COM = 1;
	
	//Das 2d-Array des Spielfeldes.
	public static int[][] feld = new int[3][3];
	
	
	public static String leerfeld = "m", playerfeld = "x" , comfeld = "o";
	
	
	
	
	protected void start(){
		
		//Leere das Spielfeld
		for(int r = 0; r < 3; r++){
			for(int c = 0; c < 3; c++){
				feld[r][c] = LEER;
			}
		}
		
		//Sende Willkommens Nachricht und zeige das Feld an
		System.out.println("Willkommen bei Tic Tac Toe! Zum setzten eines Steines auf ein Feld, einfach den Feld-Namen eingeben!");
		System.out.println("");
		
		util.printFeld();
		
		//Lasse den Spieler spielen
		player_Zug();
	}
	
	protected void player_Zug(){
		
		//Sende dem Spieler eine Nachricht
		System.out.println("Du bist dran!");
		String input = null;
		
		//Input lesen
		try {
			input = (new BufferedReader(new InputStreamReader(System.in))).readLine();
		} catch (IOException e) {e.printStackTrace();}
		
		//Vollführe Spielzug
		if(util.inputExists(input)){
			if(util.nothingOn(input)){
				int l = util.replaceLetter(input);
				int c = util.matchInteger(input);
				feld[l][c] = SPIELER;
				util.printFeld();
				com_Zug();
			}else{
				System.out.println("Dieses Feld ist besetzt!");
				player_Zug();
			}
		}else{
			System.out.println("Dieses Feld existiert nicht!");
			player_Zug();
		}
	}
	
	protected void com_Zug(){
		System.out.println("PC ist dran. Lädt...");
		randomizer();
	}
		protected void randomizer(){
			int l = new Random().nextInt() * 3;
			int c = new Random().nextInt() * 3;
			if(feld[l][c] == LEER){
				feld[l][c] = COM;
				util.printFeld();
			}else{
				randomizer();
			}
		}
}

util.java:
Java:
package t;

public class util {
	
	public static boolean inputExists(String in){
		if(in.equalsIgnoreCase("a1") || in.equalsIgnoreCase("a2") || in.equalsIgnoreCase("a3") || in.equalsIgnoreCase("b1") || in.equalsIgnoreCase("b2")
			|| in.equalsIgnoreCase("b3") || in.equalsIgnoreCase("c1") || in.equalsIgnoreCase("c2") || in.equalsIgnoreCase("c3")){
			return true;
		}else{
			return false;
		}
	}
	public static boolean nothingOn(String in){
		int l = replaceLetter(in);
		int c = matchInteger(in);
		if(T.feld[l][c] == T.LEER){
			return true;
		}else{
			return false;
		}
	}
	
	
	public static void printFeld(){
		System.out.println("  1 2 3");
		StringBuilder sbA = new StringBuilder().append("a ");
		StringBuilder sbB = new StringBuilder().append("b ");
		StringBuilder sbC = new StringBuilder().append("c ");
		
		sbA.append(replaceFields(T.feld[0][0]) + " ");
		sbA.append(replaceFields(T.feld[0][1]) + " ");
		sbA.append(replaceFields(T.feld[0][2]) + " ");
		
		sbB.append(replaceFields(T.feld[1][0]) + " ");
		sbB.append(replaceFields(T.feld[1][1]) + " ");
		sbB.append(replaceFields(T.feld[1][2]) + " ");
		
		sbC.append(replaceFields(T.feld[2][0]) + " ");
		sbC.append(replaceFields(T.feld[2][1]) + " ");
		sbC.append(replaceFields(T.feld[2][2]) + " ");
		
		System.out.println(sbA.toString());
		System.out.println(sbB.toString());
		System.out.println(sbC.toString());
		
	}
	
	public static String replaceFields(int field){
		if(field == 0){
			return T.playerfeld;
		}else if(field == 1){
			return T.comfeld;
		}else{
			return T.leerfeld;
		}
	}
	public static int replaceLetter(String in){
		if(in.startsWith("a")){
			return 0;
		}else if(in.startsWith("b")){
			return 1;
		}else if(in.startsWith("c")){
			return 2;
		}else{
			return 0;
		}
	}
	public static int matchInteger(String in){
		Character c = in.charAt(1);
		return Integer.valueOf(c);
	}

}

Ich verstehe es nicht.. Es müsste doch "0, 0" rauskommen, bei der Eingabe a1 !?
 
Ich bezweifel, dass da bei "1" 0 raus kommt:

Java:
public static int matchInteger(String in){
        Character c = in.charAt(1);
        return Integer.valueOf(c);
}
 
EDIT: Gelöst!

Jetzt müsste ich nur noch den Gewinner herausfinden Oo

Hätte wer zufälligerweise einen kleinen Ansatz um eine ewiglange if schleife zu vermeiden?
 
Zuletzt bearbeitet:
Wieso funktioniert meine Methode um den Gewinner herauszufinden nicht :O Ich führe sie nach jedem Zug aus, doch es ergibt auch true wenn es zum Beispiel eine 2er Reihe mit PC und Spieler gemischt gibt...
Code:
public static boolean checkWin(){
		
		//COMPUTER
		
		//Horizontal
		if(T.feld[0][0] == T.COM && T.feld[0][1] == T.COM && T.feld[0][2] == T.COM){
			return true;
		}else if(T.feld[1][0] == T.COM && T.feld[1][1] == T.COM && T.feld[1][2] == T.COM){
			return true;
		}if(T.feld[2][0] == T.COM && T.feld[2][1] == T.COM && T.feld[2][2] == T.COM){
			return true;
		}
		
		//Vertical
		else if(T.feld[0][0] == T.COM && T.feld[1][0] == T.COM && T.feld[2][0] == T.COM){
			return true;
		}else if(T.feld[0][1] == T.COM && T.feld[1][1] == T.COM && T.feld[2][1] == T.COM){
			return true;
		}else if(T.feld[0][2] == T.COM && T.feld[1][2] == T.COM && T.feld[2][2] == T.COM){
			return true;
		}
		
		//Diagonal
		else if(T.feld[0][0] == T.COM && T.feld[1][1] == T.COM && T.feld[2][2] == T.COM){
			return true;
		}else if(T.feld[0][2] == T.COM && T.feld[1][1] == T.COM && T.feld[2][0] == T.COM){
			return true;
		}
		
		
		//SPIELER
		
		//Horizontal
		if(T.feld[0][0] == T.SPIELER && T.feld[0][1] == T.SPIELER && T.feld[0][2] == T.SPIELER){
			return true;
		}else if(T.feld[1][0] == T.SPIELER && T.feld[1][1] == T.SPIELER && T.feld[1][2] == T.SPIELER){
			return true;
		}if(T.feld[2][0] == T.SPIELER && T.feld[2][1] == T.SPIELER && T.feld[2][2] == T.SPIELER){
			return true;
		}
				
		//Vertical
		else if(T.feld[0][0] == T.SPIELER && T.feld[1][0] == T.SPIELER && T.feld[2][0] == T.SPIELER){
			return true;
		}else if(T.feld[0][1] == T.SPIELER && T.feld[1][1] == T.SPIELER && T.feld[2][1] == T.SPIELER){
			return true;
		}else if(T.feld[0][2] == T.SPIELER && T.feld[1][2] == T.SPIELER && T.feld[1][2] == T.SPIELER){
		    return true;
		}
				
		//Diagonal
		else if(T.feld[0][0] == T.SPIELER && T.feld[1][1] == T.SPIELER && T.feld[2][2] == T.SPIELER){
			return true;
		}else if(T.feld[0][2] == T.SPIELER && T.feld[1][1] == T.SPIELER && T.feld[2][0] == T.SPIELER){
			return true;
		}
		
		
		else{
			return false;
		}
	}

Was besseres als tausend if schleifen fiel mir nicht ein >.<
 
Kennst du den Debugger?
Damit kannst du das Programm Schritt für Schritt ausführen und die fehlerhafte Stelle genau lokalisieren.

Alternativ baust du an allen Stellen, an denen deine Prüfmethode ein true zurückgibt ein System.out.print ein und siehst für einen gegebene Fall sofort den Übeltäter.

Übrigens kannst du dein Programm mit Schleifen (if gehört übrigens nicht dazu) vereinfachen.

//Vertical
else if(T.feld[0][0] == T.COM && T.feld[1][0] == T.COM && T.feld[2][0] == T.COM){
return true;
}else if(T.feld[0][1] == T.COM && T.feld[1][1] == T.COM && T.feld[2][1] == T.COM){
return true;
}else if(T.feld[0][2] == T.COM && T.feld[1][2] == T.COM && T.feld[2][2] == T.COM){
return true;
}

Du führst hier drei mal das gleiche aus. Setz für die zweite Dimension einen Parameter ein und mache ein Schleife darüber.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben