Byter ej spelare
Jag försöker skriva ett program för ett spel som liknar sten sax påse. Problemet är att den byter inte spelare. Vad är det som är fel med koden?
void getNextPlayer (Player current, Player[] players){
for (int i = 0; i < players.length - 1; i ++){
if (players[i] == current){
current = players[i + 1];
}
else if (current == players [players.length - 1]){
current = players[0];
}
}
}
Prova att stoppa in spårutskrifter där du sätter 'current', så ser du när den sätts och vad den sätts till. Jag tror det är bäst att skriva om koden, för den är svårbegriplig. Om du kommenterar precis vad den gör så kanske det blir bra (när den funkar).
void getNextPlayer (Player current, Player[] players){
//Sök igenom players för att hitta den som är "current"
for (int i = 0; i < players.length; i ++){
//Om current hittad och ej sista spelaren i arrayen -> sätt spelaren efter i arrayen som current
if ((players[i] == current) && ((i+1) != players.length)){
current = players[i+1];
out.println(current.toString());
i++;
}
//Om current hittad och sista spelare i arrayen -> sätt den första spelaren i arrayen som current
if (((players[i] == current) && ((i+1) == players.length))){
current = players[0];
i++;
out.println(current.toString());
}
}
}
Felet jag har insett att den gör att den byter spelare två gånger så att man får tillbaka den första spelaren man skickade in i metoden. Jag vet inte dock var felet blir
Det första och omedelbara problemet är att metoden inte returnerar nästa spelare. Åtgärdas enkelt genom att ändra metodens signatur och lägga till return
i slutet av den.
Det andra är (som du redan hittat) att programslingan inte avbryts och därför inte hittar rätt nästa spelare. Enklast är att bryta slingan med break
eller return
.
Det tredje är att current == players[players.length-1]
körs i (nästan) varje iteration vilket är onödigt.
Det fjärde är att om metoden inte hittar nästa spelare så kommer current
att vara densamma som när metoden anropades. Metoden bör markera att spelaren inte hittades, t ex med null
.
Det femte är, eller kan vara, att jämförelsen sker mellan objektens adresser och inte mellan deras innehåll. Det fungerar om current
är någon av objekten i arrayen players
för då jämförs adresserna korrekt. Men om current
är ett separat objekt på en helt annan minnesadress så behöver man implementera sin egen metod equals
för att jämföra innehållet och göra override
på Javas.
Mitt förslag:
public static Player getNextPlayer(Player current, Player[] players)
{
if (players.length > 0 && current.equals(players[players.length - 1]))
return players[0];
else
{
for (int i = 0; i < players.length - 1; i ++)
if (current.equals(players[i]))
return players[i + 1];
}
return null;
}
Tack!