2017-01-02 26 views
0

Ich habe dieses gemischte Kartenspiel und ich soll es so machen, dass es 5 Karten an vier Spieler verteilt. Ich sitze stundenlang hier wie ein Idiot und stecke fest.Gemischtes Kartenspiel. 5 Karten an 4 Spieler verteilen

public class Deck { 
public static void main(String[] args) 
{ 
    String[] SUITS = { 
     "Clubs", "Diamonds", "Hearts", "Spades" 
    }; 

    String[] RANKS = { 
     "2", "3", "4", "5", "6", "7", "8", "9", "10", 
     "Jack", "Queen", "King", "Ace" 
    }; 

    // initialize deck 
    int n = SUITS.length * RANKS.length; 
    String[] deck = new String[n]; 
    for (int i = 0; i < RANKS.length; i++) { 
     for (int j = 0; j < SUITS.length; j++) { 
      deck[SUITS.length*i + j] = RANKS[i] + " of " + SUITS[j]; 
     } 
    } 

    // shuffle 
    for (int i = 0; i < n; i++) { 
     int r = i + (int) (Math.random() * (n-i)); 
     String temp = deck[r]; 
     deck[r] = deck[i]; 
     deck[i] = temp; 
    } 
    // print shuffled deck 
    for (int i = 0; i < 4; i++) { 
     for (int j = 0; j < 5; j++) 
     System.out.println(deck[i]) 
    } 
} 

Ich bin auf diesem letzten Teil fest. Ich bekomme fünf ähnliche Karten für vier Spieler. Es sieht wie folgt aus:

  • Königin der Herzen
  • Königin der Herzen
  • Königin der Herzen
  • Königin der Herzen
  • Königin der Herzen
  • 10 von Diamanten
  • 10 Diamanten
  • 10 von Diamanten
  • 10 von Diamanten
  • 10 von Diamanten
  • 6 der Herzen
  • 6 der Herzen
  • 6 der Herzen
  • 6 der Herzen
  • 6 der Herzen
  • 10 Pik
  • 10 von Spaten
  • 10 von Spaten
  • 10 of Spades
  • 10 Pik

Wie ich es gehen soll, wenn ich meine Absicht ist, fünf verschiedene Karten zu vier Spielern zu umgehen?

Ich bin in Java Codierung, Arrays und ich kann keine Java-Utils verwenden.

+0

"Ich kann keine Java-Utils verwenden" Was bedeutet das genau? – weston

+2

Es sieht so aus, als ob du die selbe Karte fünfmal hier druckst 'System.out.println (deck [i])'. –

+0

Entschuldigung für die Unklarheit mit dem Begriff utils. Ich meinte, dass ich nichts importieren kann, zum Beispiel "import java.utils". usw. –

Antwort

1

Es ist nur ein Fehler beim Drucken Ihrer Ergebnisse. Verwenden

// print shuffled deck 
for (int i = 0; i < 4; i++) { 
    System.out.println("** Person " + (i + 1) + " **"); 
    for (int j = 0; j < 5; j++) { 
     System.out.println(deck[i + j * 4] + " (Card " + (i + j * 4) + ")"); 
    } 
} 

(Sysouts hinzugefügt Kartenverteilung zu demonstrieren)

Beispiel Ausgabe:

** Person 1 **
2 von Clubs (Karte 0)
4 von Diamonds (Karte 4)
9 von Diamanten (Karte 8)
10 von Herzen (Karte 12)
9 von Clu bs (Karte 16)
** 2 ** Person
6 der Herzen (Karte 1)
8 von Diamonds (Karte 5)
Pik 9 (Card 9)
Herzbube (Karte 13)
Jack of Diamonds (Karte 17)
** Person 3 **
Queen of Clubs (Karte 2)
Ace of Diamonds (Karte 6)
König der Herzen (Karte 10)
8 von Clubs (Karte 14)
5 Pik (Card 18)
** Person 4 **
10 of Spades (Karte 3)
10 von Clubs (Karte 7)
Jack of Spades (Karte 11)
10 von Diamonds (Karte 15)
Ace von Clubs (Karte 19)

+1

Oh go - .. es war so einfach? Gottverdammt. Vielen Dank! Vielen Dank für die Hilfe, es war sehr hilfreich! –

1

Math.random() * (n-i) ist biased, aber Sie können shuffle verwenden:

Collections.shuffle(deck, new Random()) 

Ich weiß nicht, ob das zählt als „java utils“, wie ich bin nicht sicher, wenn Sie das Paket java.utils oder nicht bedeuten.

Nun zu Ihrem Problem. Ein Array ist keine gute Darstellung eines Kartenspiels. Ein Stapel oder eine Schlange wäre besser, da beide es erlauben, eine Karte vom Stapel zu nehmen. Mit dem Array guckst du in einem Index auf das Deck, und so sollten wir im echten Leben nicht Karten spielen. Im Idealfall handelt es sich um die Übertragung einer Karte vom Deck auf die Hand eines Spielers, wodurch es schwierig wird, den Überblick zu behalten.

+0

Es ist klar, dass er keine Sammlungen verwenden darf.Außerdem löst es sein Problem nicht. Es ist wahrscheinlich eine Aufgabe ... –

+0

@JawadLeWywadi Sorry, das ist mir nicht klar, da sie bereits 'java.utils.Random' verwenden, also muss ich davon ausgehen, dass sie das Paket nicht meinen, dann weiß ich nicht, was sie meine ich. – weston

+1

Ich bin mir ziemlich sicher, dass er Collections meint, aber Ihr Code löst sein Problem nicht. Es ist kein Problem des Shufflings, es ist nur ein Fehler des Codes. –

0

die letzte Schleife, um diese Änderung:

for (int i = 0; i < n; i++) { 
    System.out.println(deck[i]); 
} 
-1

Ihre for-Schleife jeder Spieler die gleiche Karte 5mal zu umgehen eingerichtet ist (i ändert sich nie als j der Fall ist).Versuchen Sie Folgendes:

for (int i = 0; i < 4; i++) { 
    for (int j = 0; j < 5; j++) 
    System.out.println(deck[j * 5 + i]) 
+0

i * 4 + j ist wahrscheinlich, was Sie suchen –

+0

@JawadLeWywadi Das würde Karten zweimal behandeln. Es ist 'i + j * 4'. –

+0

Nein, es wird nicht. Indizes sind 0 + [0-4], 4 + [0-4], 8+ [0-4] und so ein –

1
for (int i = 0; i < 4; i++) { 
    for (int j = 0; j < 5; j++) 
    System.out.println(deck[i]) 
} 

Hier können Sie Schleife auf der gleichen Karte deck[i] seit j wird nicht berücksichtigt. Außerdem, selbst wenn Sie j betrachteten, würde es Ihr Problem nicht lösen, da Ihre eingebettete Schleife immer mit Index j=0 als Initialisierung beginnt, wenn die äußere Schleife iteriert.
Sie sollten die zweite Schleife aus dem Index der letzten Karte starten.

Ihre Schleife sollte zuerst die Anzahl der Spieler und dann die Anzahl der Karten für jeden Spieler berücksichtigen.
Also schlage ich Ihnen zwei Schleifen: eine und eine andere eingebettet.

Ich schlage vor, die Anzahl der Spieler und die Anzahl der Karten in Konstanten zu deklarieren anstatt sie hart zu codieren, um einen besser lesbaren Code zu haben.
Wenn diese Daten später abweichen können, können Sie beispielsweise Konstanten durch Variablen aus Methodenparametern ersetzen.

public class Deck { 
     ... 
    private static final int NB_PLAYER = 4; 
    private static final int NB_CARD_BY_PLAYER = 5; 
     ... 
    int playerNumber = 1; 
    // you loop as much as the number of players 
    // your increment step is the number of cards to deal by player 
    // your end condition is the number of cards you have to 
    // deal for all players 
    for (int i = 0; i < NB_PLAYER * NB_CARD_BY_PLAYER; i = i + NB_CARD_BY_PLAYER) { 

     System.out.println("player " + playerNumber + ", cards ="); 
     // you loop as much as the number of cards to deal by player 
     // your start from the last dealed card 
     // your increment step is 1 as you want to deal card by card from the deck 
     // your end condition is the number of cards to deal by player 
     for (int j = i; j < i+NB_CARD_BY_PLAYER; j++) { 
      System.out.println(deck[j]); 
     } 
     playerNumber++; 
    } 
} 
Verwandte Themen