我正在尝试开发一个程序,通过将一副牌分成两部分然后将它们交错来洗牌。
班级甲板代表一副 52 张牌。有两种方法:牌组(int n) and 抽卡卡().
牌组(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。
抽卡卡()取出牌组中的第一张牌并将其归还。参考上面讨论的第二轮后的牌组,抽卡()返回 1,牌组变为 [8, 6, 4, 2, 9, 7, 5, 3, 10]。
我的交错方法:创建 3 个数组列表,其中 2 个 (cards1 and cards2)持有 SA - HA 和 C2 - DA 牌,另一张(shuffled)持有交错的甲板。我设法实现了原始的牌组顺序,但是当我尝试隔行扫描时,出现越界错误:“索引 0 超出长度 0 的范围”。
Question: 我究竟做错了什么?
这是我的代码:
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();
}
}
假设的输出为测试平台类 is
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