【发布时间】:2020-07-09 00:14:39
【问题描述】:
我正在尝试开发一个程序,该程序通过将牌组分成两部分然后交错来对牌组进行洗牌。
Class Deck 代表一副 52 张牌。有两种方法:Deck(int n)和Card drawCard()。
Deck(int n) 是构造函数。该参数告诉甲板应该洗多少轮。在每一轮洗牌中,首先将整个牌组分成两个子牌组。然后将子甲板交错成一个完整的甲板。
一些注意事项:
为简化讨论,我们假设卡片为 1、2、...、10。
第一轮,全副牌分为[1,2,3,4,5]和[6,7,8,9,10]。然后,我们通过将它们交错到 [1, 6, 2, 7, 3, 8, 4, 9, 5, 10] 来组合两个子卡组。
在第二轮中,我们再次将整个卡组分成两个子卡组 [1, 6, 2, 7, 3] 和 [8, 4, 9, 5, 10],然后将它们合并为[1、8、6、4、2、9、7、5、3、10]。
-
由于我们总是将牌放在第一个子牌组中的第二个子牌组之前,因此无论我们洗多少轮,牌组的第一张牌和最后一张牌都保持不变。
甲板的原始顺序是S2,S3,...,SK,SA,H2,...,HA,C2,...,CA,D2,...,DA。
Card drawCard() 移除牌组中的第一张牌并将其归还。参考上面讨论的第二轮后的牌组,drawCard()返回1,牌组变成[8,6,4,2,9,7,5,3,10]。
我的交错方法:创建 3 个数组列表,其中 2 个(cards1 和 cards2)持有卡片 SA - HA 和 C2 - DA 和另一个(shuffled)拿着交错的牌组。我设法实现了原始的卡组顺序,但是当我尝试交错时,我得到了一个超出范围的错误:“索引 0 超出了长度 0 的范围”。
问题:我做错了什么?
这是我的代码:
import java.util.*;
public class Deck {
private int rounds;
private ArrayList<Card> cards = new ArrayList<Card>();
private ArrayList<Card> cards1 = new ArrayList<Card>();
private ArrayList<Card> cards2 = new ArrayList<Card>();
private ArrayList<Card> shuffled = new ArrayList<Card>();
public Deck(int n) {
for (Suit s : Suit.values()) {
for (Rank r : Rank.values()) {
cards.add(new Card(r,s));
}
}
for (int x=0; x<n; x++) {
for (int i=0; i<((cards.size())/2); i++) {
cards1.add(cards.get(i));
for (int j=26; j<cards.size(); j++) {
cards2.add(cards.get(j));
for (int k=0; k<cards.size(); k++) {
shuffled.add(k*2, cards1.get(i));
shuffled.add(k*2+1, cards2.get(j));
}
}
}
}
System.out.println(cards);
System.out.println(cards1);
System.out.println(cards2);
System.out.println(shuffled);
rounds = n;
}
public Card drawCard() {
Card removed = shuffled.get(0);
shuffled.remove(0);
return removed;
}
}
public class Card {
private Rank rank;
private Suit suit;
public Card (Rank rank, Suit suit) {
this.rank = rank;
this.suit = suit;
}
public String toString() {
return suit + "" + rank;
}
}
public enum Suit {
SPADE("S"),
HEART("H"),
CLUB("C"),
DIAMOND("D");
private String suit;
Suit (String s) {
suit = s;
}
public String toString() {
return suit;
}
}
// YOU CANNOT MODIFY THIS FILE
public enum Rank {
TWO("2"),
THREE("3"),
FOUR("4"),
FIVE("5"),
SIX("6"),
SEVEN("7"),
EIGHT("8"),
NINE("9"),
TEN("10"),
JACK("J"),
QUEEN("Q"),
KING("K"),
ACE("A");
private String rank;
// Constructor
Rank (String r) {
rank = r;
}
public String toString() {
return rank;
}
}
public class TestDeck {
public static void main(String[] args) {
Deck deck;
deck = new Deck(0);
System.out.println("The original deck is: ");
for (int i = 0; i < 52; i++) {
System.out.print(deck.drawCard() + " ");
}
System.out.println();
System.out.println();
deck = new Deck(1);
System.out.println("After shuffling once is: ");
for (int i = 0; i < 52; i++) {
System.out.print(deck.drawCard() + " ");
}
System.out.println();
System.out.println();
deck = new Deck(2);
System.out.println("After shuffling twice is: ");
for (int i = 0; i < 52; i++) {
System.out.print(deck.drawCard() + " ");
}
System.out.println();
System.out.println();
}
}
class TestDeck 的假定输出是
The original deck is:
S2 S3 S4 ... DK DA
After shuffling once is:
S2 C2 S3 C3 ... DA
After shuffling twice is:
S2 H2 C2 D2 ... DA
【问题讨论】:
标签: java arrays loops arraylist nested