#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❤]