OOP gewinner in einem Spiel feststellen

nasir

Mitglied
hallo Leute.

Ich bin gerade an einem Memory Projekt dran. Es funktioniert super und wirklich gut, allerdings habe ich Probleme bei N Spieler algorithmisch den Gewinner oder besser gesagt die Gewinner festzulegen.

Wenn 4 Spieler mitspielen also:
Code:
Spieler Punkte
0         3
1         4
2         4
3         5

sollte ermittelt werden, wer die maximale Punktzahl hat und es Unentschieden gibt, soll ermittelt werden, wer den Unentschieden hat.

jeder Spieler gibt mit player[index].getPunkte(); sein Punktestand wieder.
Also wenn ich z.B.
player[0].getPunkte() ausgeben möchte, käme dort dann eine 3 heraus.


Ich weiß nicht wie ich das genau sortieren soll. Denn wenn ich alle Werte herausnehme und es in einem Array speichere, also
z.B.

Java:
int[] spielerErgebnisse = new int[player.length];
for(int i = 0; i < player.length; i++)
{
     spielerErgebnisse[i] = player[0].getPunkte();
}

und diesen Array "spielerErgebnisse" sortiere, weiß ich nicht mehr, welcher Spieler welchen Array hat und wer jetzt nun gewonnen hat.

Wie könnte man sowas darstellen, wo genau ich weiß, dass auch dieser Spieler gewonnen hat oder eis ein Unentschieden zwischen mehrere Speielr herrscht?
 
Man könnte Player "Comparable" machen, oder den player-Array mit Arrays.sort(player, someComparator); sortieren, wobei 'someComparator' eben ein Comparator ist der nach Punktzahlen vergleicht. Alternativ: Einmal durch den Array laufen, und den Spieler mit den meisten Punkten merken. Dann nochmal durchlaufen, und schauen, ob es ein Unentschieden ist (also ob noch jemand die gleiche Punktzahl hat).
 
Java:
    public int compareTo( Spieler other) {
        Spieler other = (Spieler) o;
        if( this.getPunkte() < other.getPunkte() )
            return -1;
        if( this.getPunkte() > other.getPunkte() )
            return 1;            
        return 0;
    }

Diese Methode habe ich nun in Spieler implementiert. Natürlich auch mit einem "implements Comparable<Spieler>" in der Klasse

Das Array heißt ja
Spieler[] player = new Spieler[4];

das problem bei der sache ist, dass ich player[0] behalten möchte, falls ein neues Spiel gestartet wird. Das heißt es muss in einem speraten Array verglichen und ausgegeben werden und darum weiß ich halt immernoch nicht wie ich es darstelle.
 
Hmm, vielleicht nicht die schönste lösung, aber sie funktioniert.
Die untere Methode gibt in einem int[] die Spieler-IDs der Gewinner zurück.
Wenn man eine ArrayList verwenden würde könnte man sich auch die 2. for Schleife sparen.

Java:
	// gibt die PlayerID(s) des Gewinners / der Gewinner zurueck
	int[] getWinnerIndex(Spieler[] player)
	{
		int max=0;
		int nwinners=0;

		for(int i=0;i<player.length;i++)	// suche maximale pkte
		{
			if(player[i].getPunkte()>max){
				max=player[i].getPunkte();
			}
		}

		for(int i=0;i<player.length;i++)	// wieviele gewinner gibt es? ( fuer array groesse)
		{
			if(player[i].getPunkte()==max){
				nwinners++;
			}
		}

		int[] winners = new int[nwinners];

		int ctr=0;
		for(int i=0;i<player.length;i++)	// gewinner in array eintragen
		{
			if(player[i].getPunkte()==max){
				winners[ctr]=i;
				ctr++;
			}
		}

		return winners;
	}

Als Gewinner-Testausgabe kann man z.B. das hier nehmen:
Java:
		int[] gewinner =getWinnerIndex(player);
		for (int i=0;i<w.length;i++)
		{
			System.out.println("Gewinner:"+w[i]);
		}
oder halt anhand der PlayerIDs der Gewinner die Namen ausgeben. Ich weiß ja nicht wie deine Spieler-Klasse aussieht.
z.B.
System.out.println("Gewinner:"+player[w].getName());

MfG P4
 

Zurück
Oben