当前位置: 首页 > 知识库问答 >
问题:

试图通过使用扫描仪来指定有多少玩家要分牌来处理一副牌

尤夕
2023-03-14

我正在尝试制作一个卡经销商程序,我正在使用扫描仪手动输入有多少玩家。但是,我有点困在如何将牌分/发到指定数量的玩家身上。

我想要的结果有点像这样

示例:将其交给4名玩家

黑桃-2第一层女皇心形第二玩家俱乐部-5第三玩家俱乐部-9第四玩家钻石-7第一玩家黑桃杰克第二玩家。。。。以此类推,直到它将所有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 > 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 < cset.length; i++) {
        cset[i] = type[i/13] + rank[i%13];
    }
    for (int i = 0; i < 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个答案

裴哲
2023-03-14

正如@Mars原子和@Nexevis在注释中注意到的,您可以使用静态方法Collections.shuffle()来洗牌ArrayList

适合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;
    }
    
}

卡片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 List<List<Card>> deal(int players, int playerCards) {
    List<Card> cards = Stream.of(Suit.values())
            .flatMap(suit -> IntStream.range(1, 14)
                    .mapToObj(value -> new Card(suit, value)))
            .collect(Collectors.toList());
    
    Collections.shuffle(cards);
    
    return IntStream.range(0, players)
            .map(i -> i * playerCards)
            .mapToObj(index -> cards.subList(index, index + playerCards))
            .collect(Collectors.toList());
}

public static List<List<Card>> dealAll(int players) {
    return deal(players, Math.round(52f / players));
}

然后你可以做:

List<List<Card>> 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❤]
 类似资料:
  • 我正在尝试通过单行输入检索用户输入:例如,使用扫描仪分隔符为Comma5,6,4,8,9。如何使用这种类型的输入检索任意数量的整数?也就是说,不必询问用户希望输入多少个整数。下面是我一直在使用的代码,但是当我想中断时,不能中断while循环。请注意,我保留System.Out以跟踪程序当前运行的位置。令人困惑的是,我可以以这种格式获得用户输入,但程序停止并再次要求用户输入,然后如果输入是一个整数,

  • 问题内容: 请问我关于扫描仪的问题;我在一家小公司工作;我们有一个软件;它生成一个大文本文件;而且我们必须从中得到一些有用的信息; 我想用Java编写一个简单的应用程序以节省时间;你能指导我吗? 例如我要这个输出; 输出量 RFID:25蓝色:562 WifiID:2610 RFID:33 RFID数量:2 例如;这是我的文本文件,因为使用我们的软件生成的每个文件都有14000行:) 我用此源代码

  • 我正在创建一个小算法,这是其中的一部分。 如果用户输入非整数值,我想输出一条消息,让用户再次输入一个数字: 我得到了一个永无止境的循环,我不知道为什么。 如果用户输入非整数数字,我如何识别? 如果用户输入非整数数字,我如何要求用户再次输入? 更新 当我打印异常时,我得到了InputMismatchExctive,我应该怎么做?

  • 我试图从用户那里得到2个整数。这是我的代码的相关部分: 起初,它抛出一个,所以我使用了。现在,它只需跳过扫描器并立即调用。

  • 问题内容: 我有一个创建多个对象并将其放入一个类的类,如下所示: 我有一个从控制台扫描输入“ add”的应用程序,如果找到该应用程序,则调用如下所示的方法: 该应用程序应允许用户根据需要多次输入“添加”,但是在add调用该方法后将出现错误“找不到行” 。 我猜这是因为方法中的尚未关闭,然后在需要时重新打开。这是程序的问题吗?如果是,我将如何修复它? 请注意,该程序尚未完成,因为我将添加一种出售这些

  • 我有一副牌洗牌和返回结果,但现在我想根据用户输入更改输出:玩家数量和每个玩家的纸牌数量。 原始代码: CardRun-main 甲板级 卡片类 纸牌输出甲板:54 玩家数量:4(由用户输入) 每个用户的纸牌数量:5(由用户输入) 玩家1:黑桃A,红心2,红小丑 玩家2:红心8,梅花10,红心9 玩家1手牌更好。