4 svar
96 visningar
Na5a är nöjd med hjälpen
Na5a 388
Postad: 17 sep 2021 10:58

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];
            }
        }
    }
Laguna 28443
Postad: 17 sep 2021 11:27

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).

Na5a 388
Postad: 17 sep 2021 13:15
 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

Lindehaven 820 – Lärare
Postad: 17 sep 2021 15:37 Redigerad: 17 sep 2021 15:38

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;
	}
Na5a 388
Postad: 23 sep 2021 19:45

Tack!

Svara Avbryt
Close