Highscoreliste

siod

Mitglied
Hallo,

ich habe ein sehr simples Spiel geschrieben und möchte nun eine Highscoreliste implementieren. Leider wird diese aber nicht aufgerufen und da ich noch Probleme mit Übergaben und aufrufen von von Methoden in anderen Klassen habe, möchte ich Euch mal um Hilfe bitten. Ich glaube es ist am einfachste wenn ich mal poste was ich bisher habe:

Klasse Highscore:
Java:
public class Highscore {
	
	public void highscore(int versuche){
		
		int[] highscoreliste;
		highscoreliste = new int[5];
		
		int platz1;
		int platz2;
		int platz3;
		int platz4;
		int platz5;
		
		platz1 = highscoreliste[0];
		platz2 = highscoreliste[1];
		platz3 = highscoreliste[2];
		platz4 = highscoreliste[3];
		platz5 = highscoreliste[4];
		
								
		if (versuche<platz1){
			versuche = platz1;
			System.out.println("Sie sind auf Platz 1 !");
		}
		else{
			if (versuche<platz2){
				versuche = platz2;
				System.out.println("Sie sind auf Platz 2 !");
			
			}
			else{
				if (versuche<platz3){
					versuche = platz3;
					System.out.println("Sie sind auf Platz 3 !");
				}
				else{
					if (versuche<platz4){
						versuche = platz4;
						System.out.println("Sie sind auf Platz 4 !");
					}
					else{
						if (versuche<platz5){
							versuche = platz5;
							System.out.println("Sie sind auf Platz 5 !");
						}
						}
					}
				}
			}
		
	}

}

Meine Main in der die Methode game10 läuft, was mein Spiel mit 10 Versuchen wäre. an folgender Stelle habe ich versucht meine Highscoreliste aufzurufen :

Java:
	public void game10(int rz){			//rz = gesuchte zufallszahl
	
		int versuche = 0;
		int versuche2 = 10;
		boolean gefunden = false;
		
		Highscore hs = new Highscore();  <--------
		
		while (gefunden==false){
			System.out.println("Anzahl verbleibende Versuche = " +versuche2);
		
			System.out.println("Bitte Tipp abgeben (zurück zum Hauptmenü mit 0): ");

			int zahl = eingabe.nextInt();	//Wert der der User eingibt
			if (zahl==0){
				back2Hauptmenu();
			}
			if (versuche<10){
				if (zahl == rz){
					versuche ++;
					versuche2 --;
					System.out.println("Zahl korrekt!");
					System.out.println("Sie benötigten " + versuche + " Versuche");
					gefunden = true;
					
					hs.highscore(versuche); <========
					
					System.out.println();
					System.out.println("Noch eine Runde:");
					back2Hauptmenu();
				}

müsste nun nicht eigentlich die Anzahl der benötigten Versuche an die Highscoreliste übergeben werden und von dort dann zum einen der Text ausgegeben werden auf welchem Platz man ist und natürlich der Platz gespeichert werden.

Apropos Speicher: mir ist klar das die Highscores nur zur Laufzeit gespeichert werden, aber das ist erstmal in Ordnung so.

Vielen Dank schon mal!
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
> mir ist klar das die Highscores nur zur Laufzeit gespeichert werden

wenn es das wenigstens wäre, im Moment wird nur in der Methode gespeichert,
das Array dauerhaft als Instanzattribut abzulegen wäre der erste Schritt

die 5 Einzelvariablen brauchst du nicht, eine Schleife löst es auch hier
Java:
for (i durchs Array) {
  wenn i-te Array-Position passt: zu tun was zu tun ist, Ausgabe auch mit i
}

-------

teste das besser nicht im Programm mit x-mal raten usw., sondern rufe in einem Testprogramm

hs.highscore(9);
hs.highscore(5);
hs.highscore(7);
usw. direkt hintereinander auf, bei Fehler auch wichtig nach Korrektur im nächsten Versuch mit denselben Ablauf zu testen,
Zufall wäre dazu schlecht
 
Zuletzt bearbeitet von einem Moderator:

siod

Mitglied
Hi,
Danke erstmal für die schnelle Antwort!

Also das mit der for Schleife krieg ich jetzt grad nich, sitze viell. auch schon zu lange vorm Rechner. Jedenfalls, wenns so laufen müsste, würde ich es erstmal übersichtshalber so belassen....

Habe meinen Code "leicht" überarbeitet und ein Testprogramm gemacht, ich hoffe so war das gemeint!

Hier mal wieder n bisschen Code:

Main:
Java:
public class Main {


	public static void main(String[] args) {
		
		
		
		Highscore hs = new Highscore();
		
		hs.highscore(9); 
		hs.highscore(5); 
		hs.highscore(7); 

}
}

Highscore:
Java:
public class Highscore {
	
	int[] highscoreliste;
	
	
	public void highscore(int versuche){
		
		
		highscoreliste = new int[5];
		
		
		int platz1;
		int platz2;
		int platz3;
		int platz4;
		int platz5;
		
		platz1 = highscoreliste[0];
		platz2 = highscoreliste[1];
		platz3 = highscoreliste[2];
		platz4 = highscoreliste[3];
		platz5 = highscoreliste[4];
		
								
		if (versuche<platz1){
			versuche = platz1;
			System.out.println("Sie sind auf Platz 1 !");
		}
		else{
			if (versuche<platz2){
				versuche = platz2;
				System.out.println("Sie sind auf Platz 2 !");
			
			}
			else{
				if (versuche<platz3){
					versuche = platz3;
					System.out.println("Sie sind auf Platz 3 !");
				}
				else{
					if (versuche<platz4){
						versuche = platz4;
						System.out.println("Sie sind auf Platz 4 !");
					}
					else{
						if (versuche<platz5){
							versuche = platz5;
							System.out.println("Sie sind auf Platz 5 !");
						}
						}
					}
				}
			}
		
	}

}

es wird leider überhaupt nichts ausgegeben -.-
 
S

SlaterB

Gast
überlege doch ganz einfach bzw. lasse dir ausgeben was ganz am Anfang im Array steht, was der erste Vergleich daraus macht
und ob das in deinem Sinne korrekt ist oder nicht
 
N

nillehammer

Gast
Habe man Deinen Code kommentiert. Vielleicht hilft es Dir, zu verstehen, was da passiert.
Java:
public class Highscore {
    
    int[] highscoreliste;
    
    
    public void highscore(int versuche){
        
        // Es werden alle Elemente mit 0 belegt (Standardverhalten bei primitiven Arrays)
        // Du solltest die Instanzvariable highscoreliste wohl eher in einem Konstruktor initialisieren.
        // In der Methode macht das irgendwie keinen Sinn.
        highscoreliste = new int[5];
        
        // Du hast die Werte schon im Array, wozu die extra Variablen?
        int platz1;
        int platz2;
        int platz3;
        int platz4;
        int platz5;
        // Jede platzX-Variable übernimmt 0 aus dem Array.
        platz1 = highscoreliste[0];
        platz2 = highscoreliste[1];
        platz3 = highscoreliste[2];
        platz4 = highscoreliste[3];
        platz5 = highscoreliste[4];
        
        // Wie SlaterB schon geschrieben hat, for-Schleife.
        // Das ist nun wirklich nicht schwer. Google: Java for-Schleife                        
        if (versuche<platz1){
            versuche = platz1;
            System.out.println("Sie sind auf Platz 1 !");
        }
        else{
            if (versuche<platz2){
                versuche = platz2;
                System.out.println("Sie sind auf Platz 2 !");
            
            }
            else{
                if (versuche<platz3){
                    versuche = platz3;
                    System.out.println("Sie sind auf Platz 3 !");
                }
                else{
                    if (versuche<platz4){
                        versuche = platz4;
                        System.out.println("Sie sind auf Platz 4 !");
                    }
                    else{
                        if (versuche<platz5){
                            versuche = platz5;
                            System.out.println("Sie sind auf Platz 5 !");
                        }
                        }
                    }
                }
            }
        
    }
 
}
es wird leider überhaupt nichts ausgegeben -.-
Wie in den Kommentaren im Code beschrieben, werden alle Werte des Arrays mit 0 initialisiert. Die platzX-Variablen damit auch. Du prüfst immer, ob versuche (9, 7, 5) kleiner 0. Das ist nie wahr, deswegen wird nichts ausgegeben.
 

siod

Mitglied
Also wie ich daraus eine for-Schleife machen soll kann ich mir leider nicht erklären, obwohl ich eigtl. dachte ich weiss was eine for-Schleife so alles kann...

Auch mit dem Konstruktor bin ich völlig überfordert ;(

ich bin jetzt soweit, das mir Platz 1 ausgegeben wird, allerdings nur Platz1, also werden die Werte wohl immer wieder überschrieben und ich weiss nicht wie ich es verhindern kann:

Java:
public class Highscore {
	

	
	
	public void highscore(int versuche){
		
		int[] highscoreliste;
		
		highscoreliste = new int[5];
	
		highscoreliste[0] = 1000;
		highscoreliste[1] = 1000;
		highscoreliste[2] = 1000;
		highscoreliste[3] = 1000;
		highscoreliste[4] = 1000;
										
		if (versuche<highscoreliste[0]){
			versuche = highscoreliste[0];
			System.out.println("Sie sind auf Platz 1 !");
		}
		else{
			if (versuche<highscoreliste[1]){
				versuche = highscoreliste[1];
				System.out.println("Sie sind auf Platz 2 !");
			
			}
			else{
				if (versuche<highscoreliste[2]){
					versuche = highscoreliste[2];
					System.out.println("Sie sind auf Platz 3 !");
				}
				else{
					if (versuche<highscoreliste[3]){
						versuche = highscoreliste[3];
						System.out.println("Sie sind auf Platz 4 !");
					}
					else{
						if (versuche<highscoreliste[4]){
							versuche = highscoreliste[4];
							System.out.println("Sie sind auf Platz 5 !");
						}
						}
					}
				}
			}
		
	}

}

naja, ich peils net, versuche mich morgen wieder...

Vielen Dank für die tollen Hilfestellungen, ich hoffe ich raffs noch! :rtfm:
 
Zuletzt bearbeitet:
S

SlaterB

Gast
das ist ja wieder der Code aus dem ersten Post, nichtmal ein Instanzattribut für längerfristige Speicherung,
solange aber die Verarbeitung nicht funktioniert, nichts gespeichert wird, ist es freilich egal ob 'kurzfristig nicht' oder 'längerfristig nicht'..
(edit: ok, mit Startwert 1000 mag es gehen)

vielleicht läßt du erstmal das Array weg und versuchst es mir nur einer einfachen Variable, nur Platz 1, oder funktioniert das schon mit welchem Code?
> ich bin jetzt soweit, das mir Platz 1 ausgegeben wird, allerdings nur Platz1
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
Gut die extra Variablen sind schon mal weg. Das ist ein Fortschritt. Jetzt initialisierst Du auch alle Werte des Arrays selbst mit 1000, ein weiterer Fortschritt.
ich bin jetzt soweit, das mir Platz 1 ausgegeben wird, allerdings nur Platz1, also werden die Werte wohl immer wieder überschrieben und ich weiss nicht wie ich es verhindern kann:
Guck Dir mal ganz genau Dein erstes
Code:
if (versuche<highscoreliste[0])
an. Was ist highscoreliste[0] für ein Wert? Womit vergleichst Du den (Wert von versuche)? Was kommt bei diesem Vergleich raus, true oder false? Danach kommen else-ifs? Kommt er nach dem ersten if da überhaupt noch rein?
 
S

SlaterB

Gast
mit Startwert 1000 könnten die if/else doch funktionieren, auch wenn eine Schleife schöner wäre,
mit Instanzattribut und auch nicht ständig neuen 1000-Werten bei jedem Methodenaufruf wäre die längerfristige Funktionalität im Bereich des Möglichen

ach und speichern in der Liste fehlt noch, die Variable versuche muss dagegen nicht mit 1000 befüllt werden..
 

Ähnliche Java Themen


Oben