有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何创建一副随机的卡片?

我需要使用两个字符串创建一组卡片:“HSCD”和“A2345678910JQK”

public class Deck {
Random random=new Random();
Queue cards=new Queue(112);
String suits="HSCD";
String rands="A2345678910JQK";

public Deck() {
    for (int i = 0; i < suits.length(); i++) {
        for (int j = 0; j < rands.length(); j++) {
            char suit = suits.charAt(random.nextInt(suits.length()));
            char rand = rands.charAt(random.nextInt(rands.length()));
            if (rand == '1' || rand == '0') {
                String s = Integer.toString(10);
                cards.enqueue(new Card(suit, s));
            } else {
                String s1 = Character.toString(rand);
                cards.enqueue(new Card(suit, s1));
            }
        }
    }
}
public void display(){
    for (int i = 0; i < cards.size(); i++) {
        System.out.print(cards.peek());
        cards.enqueue(cards.dequeue());
    }
}

public Queue getCards() {
    return cards;
}

public void setCards(Queue cards) {
    this.cards = cards;
}

public String getSuits() {
    return suits;
}

public void setSuits(String suits) {
    this.suits = suits;
}

public String getRands() {
    return rands;
}

public void setRands(String rands) {
    this.rands = rands;
}}

我有甲板和纸牌课

public class Card {

private char rand;
private String suit;

public Card(char rand, String suit) {
    this.rand = rand;
    this.suit = suit;
}

public Card(){}

public char getRand() {
    return rand;
}

public void setRand(char rand) {
    this.rand = rand;
}

public String getSuit() {
    return suit;
}

public void setSuit(String suit) {
    this.suit = suit;
}

public String toString(){
    return "\t"+rand + suit;
}}

但我无法解决每件西装必须有13兰特的问题。在我的程序中,我的牌组是随机创建的。我的牌必须洗牌。我不能使用列表或数组结构,因为老师告诉我们:)。你能帮我吗


共 (4) 个答案

  1. # 1 楼答案

    您尚未包含Queue类,因此帮助将受到限制。这里还有其他一些建议

            String suits="HSCD";
            String ranks="A23456789TJQK";
            for (int i = 0; i < 52; i++) {
                int suit = i/13; // index into suit 0 to 3 inclusive
                int rank = i%13; // index into rank 0 to 12 inclusive
                cards.enqueue(new Card(suits.charAt(suit), ranks.charAt(rank));
            }
    

    而且,很多时候,纸牌游戏软件使用T表示十,这就是我在本例中所做的。它可以更改,但在您的实现中,您不能将10存储为单个字符,并且为卡列维护两种类型很麻烦。所以你应该把你所有的军衔和西装都定为String

  2. # 2 楼答案

    1. 你在为每件西装制作14张卡片,而不是13张:你在两次制作10。用01rands移除

    2. 如果你先创建卡片,然后洗牌,这会更容易

    卡片的制作应该与你已经在做的事情相似,减去随机化-只需按顺序检查套装和价值:

    for each suit:
      for each value:
        sortedCards.add(new Card(suit, value));
    

    然后,按如下方式洗牌:

    while (sortedCards is not empty):
      shuffledCards.add(sortedCards.get(random.nextInt(sortedCards.size())))
    
  3. # 3 楼答案

    另一种方法:像iluxa一样创建你的牌组,说你自己,然后用以下方法洗牌:

    Random rand = new Random();
    for(int i=0;i<300;i++){
       int a = rand.nextInt(deck.size());
       int b = rand.nextInt(deck.size());
       Card cA = deck.get(a);
       deck.set(a, deck.get(b));
       deck.set(b, cA);
    }
    

    通过多次切换两张随机卡,代码将充斥你的牌组

  4. # 4 楼答案

    只需将第二个字符串复制四次。取两个随机数后,一个对应符号,一个对应数字。最后,将符号+数字放入内存,并删除字符串中的数字:

    String signs = "HSCD";
    String numbersH = "A2345678910JQK";
    String numbersS = "A2345678910JQK";
    String numbersC = "A2345678910JQK";
    String numbersD = "A2345678910JQK";
    ArrayList<String> deck = new ArrayList<String>();
    Random random = new Random();
    while(deck.size()<52){
       int sign = random.nextInt(signs.lenght());
       if(sign==0 && numbersH.lenght()>0){
          int number = random.nextInt(numbersH.lenght());
          deck.add(signs.charAt(sign)+numbersH.charAt(number));
          numbersH = numbersH.substring(0,number)+numberH.substring(number+1);
       }//here the same for other signs
    
    }