Попытка раздать колоду карт с помощью сканера, чтобы указать, сколько игроков должно разделить карты

#java

Вопрос:

Я пытаюсь создать программу для дилеров карт и использую сканер для ручного ввода количества игроков. Но я немного зациклился на том, как разделить/раздать карты указанному количеству игроков.

Результат, к которому я стремлюсь, примерно такой

Пример: раздача его 4 игрокам

Лопата-2 1-й игрок Королева-Сердце 2-й игрок Клуб-5 3-й игрок Клуб-9 4-й игрок Алмаз-7 1-й игрок Лопата-Валет 2-й игрок …. и так далее, пока он не раздаст все 52 карты 4 игрокам

Это текущий код, который я написал, когда искал учебные пособия о том, как тасовать колоду карт.

импорт java.util.Сканер; основной общедоступный класс {

 public static void main(String[] args) {  // TODO Auto-generated method stub    Scanner sc = new Scanner(System.in);  System.out.println("Please Input how many players there are");    int player = sc.nextInt();    if (player gt; 0) {  String[] type = {"S-", "H-", "D-", "C-"} ;  String[] rank = {"A ", "2 ", "3 ", "4 ", "5 ", "6 ", "7 ", "8 ", "9 ", "10 ", "J ", "Q ", "K "};  String[] cset = new String[52];    for (int i = 0; i lt; cset.length; i  ) {  cset[i] = type[i/13]   rank[i];  }  for (int i = 0; i lt; cset.length; i  ) {  int index = (int) (Math.random() * cset.length);  String temp = cset[i];  cset[i] = cset[index];  cset[index] = temp;  }  for (String u: cset) {  System.out.println(u); }  } else {  System.out.println("Please input a correct number of player/s");  } }  

}

Кто-нибудь, пожалуйста, может мне помочь? Извините, если мое объяснение сбивает с толку

Комментарии:

1. Если вы по какой-то причине не хотите написать свой собственный алгоритм перетасовки, подумайте о том, чтобы поместить свои карты в список массивов, в котором есть метод перетасовки, который сделает всю грязную работу за вас. Для раздачи ваша логика будет выглядеть примерно так: «пока колода не пуста, пройдитесь по игрокам и передайте им следующую карту в колоде». Если вы перестанете думать о проблеме немного больше, решения станут ясными. Возьмите настоящую колоду карт и пройдите через раздачу, если у вас возникли проблемы с концептуализацией. Избегайте просить о помощи, пока она вам действительно не понадобится, потому что так не учатся.

2. Collections.shuffle(arrayList); кстати, это перетасовка, на которую ссылается @MarsAtomic, она тоже есть в Collections классе на случай, если вы не смогли ее найти.

Ответ №1:

Как заметили @MarsAtomic и @Nexevis в комментариях, вы можете перетасовать с ArrayList помощью статического метода Collections.shuffle() :

Suit.java

 public enum Suit {  CLUBS('u2663'), DIAMONDS('u2666'), HEARTS('u2764'), SPADES('u2660');    private final char symbol;    private Suit(char symbol) {  this.symbol = symbol;  }    public final char getSymbol() {  return symbol;  }   }  

Card.java

 public static class Card {   private final Suit suit;   private final int value;   private transient final String name;   public Card(Suit suit, int value) {  this.suit = suit;  this.value = value;  this.name = createName(suit, value);  }   public final Suit getSuit() {  return suit;  }   public final int getValue() {  return value;  }   public final String getName() {  return name;  }   @Override  public String toString() {  return name;  }   private static String createName(Suit suit, int value) {  char symbol = suit.getSymbol();  switch(value) {  case 1:  return "A"   symbol;  case 11:  return "J"   symbol;  case 12:  return "Q"   symbol;  case 13:  return "K"   symbol;  default:  return Integer.toString(value)   symbol;  }   }  }  

Способы раздачи карт:

 public static Listlt;Listlt;Cardgt;gt; deal(int players, int playerCards) {  Listlt;Cardgt; cards = Stream.of(Suit.values())  .flatMap(suit -gt; IntStream.range(1, 14)  .mapToObj(value -gt; new Card(suit, value)))  .collect(Collectors.toList());    Collections.shuffle(cards);    return IntStream.range(0, players)  .map(i -gt; i * playerCards)  .mapToObj(index -gt; cards.subList(index, index   playerCards))  .collect(Collectors.toList()); }  public static Listlt;Listlt;Cardgt;gt; dealAll(int players) {  return deal(players, Math.round(52f / players)); }  

Тогда вы можете сделать:

 Listlt;Listlt;Cardgt;gt; cards = dealAll(4); // or deal(4, 13) if each player has a specific number of cards  cards.forEach(System.out::println);  

Выход:

 [5♣, 4♣, 9♣, 7♣, 5❤, 6♠, 3♠, K♦, 4♦, 6♣, Q♦, 9♦, J♦] [Q♣, 2♦, 9♠, Q❤, 7♦, 10♣, 9❤, 5♠, 2♣, 10❤, 5♦, A❤, 8❤] [2♠, 8♠, 8♣, 4♠, 10♦, 3♣, 2❤, 3♦, K♣, 7♠, A♣, 3❤, J❤] [7❤, J♠, 4❤, Q♠, 6♦, 10♠, A♦, K❤, A♠, J♣, 8♦, K♠, 6❤]