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:

KonradN

Top Contributor
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.
 

KonradN

Top Contributor
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.
 

KonradN

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Zufällige ungerade Zeile aus Text-Datei lesen Java Basics - Anfänger-Themen 5
D Zufällige Auswahl aus einem angelegten Array? Java Basics - Anfänger-Themen 10
L Zufällige Übereinstimmungen in 2 Arrays Java Basics - Anfänger-Themen 3
C Werte im Vector in zufällige Reihenfolge bringen Java Basics - Anfänger-Themen 14
C Vector-Inhalt in zufällige Reihenfolge bringen Java Basics - Anfänger-Themen 6
T Zufällige Matrix in neue Matrix schreiben Java Basics - Anfänger-Themen 6
W Wie kann man zufällige Anordnungen machen? Java Basics - Anfänger-Themen 1
J Zufällige Buchstaben Java Basics - Anfänger-Themen 45
F zufällige Zahlenfolge Java Basics - Anfänger-Themen 8
J Buchstabe (char) an zufällige Position eines Strings einfügen Java Basics - Anfänger-Themen 1
E Erste Schritte Memorie zufällige Pärchen mischen Java Basics - Anfänger-Themen 6
J Zufällige Bewegung Java Basics - Anfänger-Themen 25
R Zufällige Abfolge Java Basics - Anfänger-Themen 5
E Variablen Zufällige Boolschevariable erzeugen Java Basics - Anfänger-Themen 4
K Zufällige Auswahl innerhalb eines Arrays und Arrays aus JLabel füllen Java Basics - Anfänger-Themen 32
F Datentypen Zufällige Buchstaben vertauschen Java Basics - Anfänger-Themen 3
B Zufällige Zahlen in Array sortieren Java Basics - Anfänger-Themen 18
B "Zufällige" Newlines in Process.getErrorStream Java Basics - Anfänger-Themen 5
M Zufällige Position Java Basics - Anfänger-Themen 3
B zwei zufällige elemente aus array lesen und überprüfen Java Basics - Anfänger-Themen 8
TheKing Zufällige Plattformen Java Basics - Anfänger-Themen 5
M zufällige auswahl eines Panels aus Grid Layout Java Basics - Anfänger-Themen 3
G Zufällige Zahlen Java Basics - Anfänger-Themen 13
S Zufällige Farbe Java Basics - Anfänger-Themen 5
G zufällige zahlen von x bis y generieren Java Basics - Anfänger-Themen 5
H Aus 5 Zahlen eine zufällige Kombination erzeugen,ohne doppel Java Basics - Anfänger-Themen 2
B Memory - Zufällige Anordnung von Buchstabenpaaren Java Basics - Anfänger-Themen 8
G Zufällige Buchstaben in char-Array Java Basics - Anfänger-Themen 9
M Zufällige Zeile aus einer Datei lesen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben