我试图制作纸牌游戏,它有游戏,卡片,玩家,甲板和手牌。我希望它模拟现实生活,你可以从一个牌组到你的手上画5张牌
我让我的班级玩家将所有卡片添加到名为卡片的甲板阵列中。 像这样:
public Player(String name) {
this.name = name;
this.deck = new Deck();
this.deck.addCard(new Card("c1",20, "fire"));
this.deck.addCard(new Card("c2",30, "fire"));
this.deck.addCard(new Card("c3",10,"water")); //etc list goes on
将它传递给我的班级Deck:
public class Deck {
private List<Card> cards;
public Deck() {
this.cards = new ArrayList<>();
}
public void addCard(Card card) {
this.cards.add(card);
}
我在Hand hand hand中创建了一个手部arraylist:
public class Hand {
Deck deck;
private List<Card> hand;
public Hand() {
this.hand = new ArrayList<>();
}
如何从我的deck arraylist中添加5个随机卡片对象到我的手数组列表?
答案 0 :(得分:0)
您可以生成0到列表大小之间的随机数,因此您可以覆盖列表中所有可能的索引(卡片中的所有卡片)。然后使用生成的随机索引从列表中取出每张卡片并将其添加到您的手中。添加if
语句以确保不会多次添加任何卡。使用计数器将其包裹在while
或for
循环中以获得五张卡片。像这样:
int counter = 0;
while (counter < 5){
int min = 0;
int max = cards.size();
int randomNumber = min + (int)(Math.random() * max);
if (!hand.contains(cards.get(randomNumber))) {
hand.add(cards.get(randomNumber));
counter++;
}
}
答案 1 :(得分:0)
首先,您需要让Deck足够聪明,随意提取卡并按要求提取金额。甲板代码应该是这样的:
public class Deck {
private List<Card> cards;
public Deck() {
this.cards = new ArrayList<>();
}
public void addCard(Card card) {
this.cards.add(card);
}
public List<Card> getCards(final int amount) {
ArrayList<Card> result = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < amount; i++) {
int randomIndex = random.nextInt(cards.size());
result.add(cards.remove(randomIndex));
}
return result;
}
}
在第二步中,让Hand访问Deck,对于这个任务,Deck应该在Hand类中,如下所示:
public class Hand {
private final Deck deck;
private final int cardsAmount;
private List<Card> cardsInHand;
public Hand(Deck deck, int cardsAmount) {
this.deck = deck;
this.cardsAmount = cardsAmount;
}
public List<Card> cards() {
if(cardsInHand == null) cardsInHand = deck.getCards(cardsAmount);
return cards;
}
}
在现实生活中,玩家知道他应该根据游戏规则从牌组获得多少张牌,所以我们将牌数传递给Hand构造函数。当手是空的时候我们应该从牌组中取出牌,当手牌是完整的简单归还牌时。