如何创建一副随机化的牌



我需要使用两个字符串创建一副牌:"HSCD"one_answers"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个兰特的问题。在我的程序中,我的牌组是随机创建的。我的甲板必须洗牌。我不能使用列表或数组结构,因为老师告诉我们:(。你能帮我吗?

  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())))

只需将第二个字符串重复四次。取两个随机数后,一个对应符号,另一个对应数字。最后,你把符号+数字放在内存中,然后删除字符串中的数字:

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
}

另一种方法:像iluxa say you一样创建你的牌组,并用这个洗牌:

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);
}

通过多次切换两张随机牌,这一代码将充满你的牌组。

您还没有包含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,这就是我在本例中所做的。它可以更改,但在您的实现中,您不能将10存储为单个字符,并且维护两种类型的卡组是很麻烦的。所以你可能应该把你所有的等级和套装都做成String型。

最新更新