Zufällige Spielerreihenfolge

Hallo,

ich möchte ein Kartenspiel programmieren hierzu soll ein zufälliger Startspieler bestimmt werden, und die Reihenfolge der Spieler dann fortgesetzt werden.

z.B. 5 Spieler
Zufälliger Startspieler = 4
Reihenfolge der Spieler= 4,5,1,2,3

Ich habe das viel zu komplex programmiert mit 2 Array Listen. Das geht doch bestimmt besser oder? Gibt es Tipps? Hier der Quellcode:

import java.util.ArrayList;

public class Test3 {
public static void main(String[] args) {

int allplayer = 4;
int random_number = (int) ((Math.random()) * allplayer+1 ); //Startspieler bestimmen
ArrayList<Integer> playernumbers=new ArrayList<>();
ArrayList<Integer> arr2= new ArrayList<>();

if(allplayer==random_number) { //Wenn Startspieler gleich höchste Spieleranzahl dann zähle einfach von 1 hoch
System.out.println("Startspieler ist Player"+" "+random_number);
for (int a = 0; a < allplayer; allplayer--) {
playernumbers.add(allplayer);
}
System.out.println(playernumbers);
} else { //ansonsten zähle von 1 bis Zufallsspieler
System.out.println("Startspieler ist Player"+" "+random_number);
for(int i=0;i<random_number;i++)
{
arr2.add(i+1);
}

for (;allplayer>random_number;random_number++) //und zähle vom Zufallsspieler bis zum letzten Spieler
{
playernumbers.add(random_number);
}

playernumbers.add(random_number); //Alles in Array Listen speichern und ausgeben
playernumbers.addAll(arr2);
playernumbers.remove(playernumbers.size()-1);


System.out.println("Spielreihenfolge"+playernumbers);

}


}

}


Vielen Dank

Gruß Tobi
 
Zuletzt bearbeitet:
Erst einmal: Code bitte immer in Code-Tags posten - mit Hilfe des Knopfes </> oberhalb des Eingabebereiches.

Du brauchst doch gar kein Array so die Reihenfolge immer der nächste Spieler ist und nur der Startspieler ausgelost wird.

Dann hast Du etwas in der Art:
Java:
public class Player {
    int numberOfPlayers;
    int currentPlayer;
    
    public Player (final int numberOfPlayers) {
        this.numberOfPlayers = numberOfPlayers;
        currentPlayer = (int) (Math.random() * numberOfPlayers+1);
    }
    
    public int getCurrentPlayer() {
        return currentPlayer;
    }
    
    public int nextPlayer() {
        currentPlayer++;
        if (currentPlayer > numberOfPlayers) {
            currentPlayer = 1;
        }
        return currentPlayer();
    }
}

(Code direkt im Forum geschrieben, daher sind ggf Fehler enthalten. Aber das Prinzip sollte gut ersichtlich sein.)
 
Dankeschön Konrad.

Ich wollte Array Listen oder mehrdimensionale Arrays verwenden um die Spielerreihenfolge und die Anzahl der Karten eines Spielers in ein Objekt Player abzuspeichern.
 
Ich wollte Array Listen oder mehrdimensionale Arrays verwenden um die Spielerreihenfolge und die Anzahl der Karten eines Spielers in ein Objekt Player abzuspeichern.
Generell ist das natürlich für die Speicherung der Daten auch vollkommen richtig. Aber das wäre dann eigentlich nur die Daten der Spieler.
Welcher Spieler als nächstes dran ist, ist davon prinzipiell zu unterscheiden. Du kannst den Ansatz 1:1 mit Spieler-Daten vermengen.

Evtl. wird es deutlich, wenn ich das einfach einmal mit Code skizziere:
Java:
public class PlayerService {
    private int numberOfPlayers;
    private int currentPlayer;
    private List<Player> allPlayerData;
   
    public Player (final Player... players) {
        numberOfPlayers = players.length;
        currentPlayer = (int) (Math.random() * numberOfPlayers);
        allPlayerData = Arrays.stream(players).toList();
    }
   
    public Player getCurrentPlayer() {
        return players.get(currentPlayer);
    }
   
    public Player nextPlayer() {
        currentPlayer = (currentPlayer + 1) % numberOfPlayers;
        return currentPlayer();
    }
}

Das ist jetzt eine Klasse PlayerService oder PlayerManagement. Der Konstruktor nimmt alle Spieler, die von einer beliebigen Klasse Player sind. numberOfPlayer ist eigentlich unnötig, da wird das ja über die Liste bereits hätten. Habe ich jetzt aber mal nicht heraus genommen.

Aber was zu erkennen ist: Du musst die Reihenfolge in dem Array nicht zwingend anpassen. Die Reihenfolge kannst Du so lassen und die Info, welcher Spieler dran ist, kann einfach durch einen Index gemerkt werden. Es ist also unnötig, da irgendwelche Zusätzlichen Datenstrukturen zu schaffen.

Evtl. noch ein Hinweis zu dem Shuffle Hinweis: Das ist nur dann sinnvoll, wenn Du wirklich eine beliebige Reihenfolge haben willst. Die Reihenfolge der Spieler ist aber unveränderlich - Es ist nur offen, wer anfängt. (So habe ich Dein Post zumindest verstanden und das ist ja auch etwas was Dein Code macht.)
 
Hi, was ist eigentlich der Unterschied zwischen:

Java:
 public int nextPlayer() {
        currentPlayer++;
        if (currentPlayer > numberOfPlayers) {
            currentPlayer = 1;
        }
        return currentPlayer();

und der Methode:
Code:
 public void nextPlayer() {
        currentPlayer++;
        if (currentPlayer > numberOfPlayers) {
            currentPlayer = 1;
        }

und wann wende ich was an?
Ich hab es noch nicht so drauf mit objektorientiertem programmieren.
 
Die erste Version gibt den currentPlayer auch direkt zurück, die zweite Variante schaltet nur um.

Das kann man etwas beleuchten - da kommen wir in einen Bereich, den ich Clean Code nennen würde. Daher bringe ich da meine Sicht:

Die Frage ist, was Du bei nextPlayer erwartet: Ist es nur das umschalten zum nächsten Spieler oder soll es den nächsten Spieler auch zurück geben? Das ist nicht wirklich klar, da ja auch kein Verb sagt, was da passiert.

Es ist üblich, dass man entweder etwas aktiv macht (so dies den Status verändert) oder etwas zurück gibt. Das soll nicht vermengt werden. Ausnahmen gibt es aber: Rückgabe ob etwas erfolgreich war oder nicht oder eben das BuilderPattern. Damit wäre die erste Variante etwas unsauber. Aber diese Rückgabe des Ergebnisses ist auch etwas, das man öfters mal findet.

Aber wie schon gesagt: Die Benennung ist nicht gut. Es fehlt ein Verb so dass das Verhalten verständlich ist. getCurrentPlayer wäre dann die Abfrage des Current Player. Das ist aber etwas, das sich mit Records einschleicht - da hat man auch kein get. Somit ist das auch eine Sache, die etwas im Wandel ist. Und davon habe ich mich da etwas leiten lassen. Aber wenn man etwas mehr drüber nachdenkt, dann war das nicht ideal. Die Begründung ist keine Rechtfertigung in meinen Augen.
 

Zurück
Oben