如果我具有标准52张纸牌的图像,并且想要创建一个游戏,其中有4位玩家从纸牌中随机选择一张纸牌,则取值最高的人获胜。如何为卡片图像分配值?我目前分配了一个随机数来为每位玩家挑选卡片...
Button p1 = new Button("Player 1");
p1.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
int n = rand.nextInt(52)+0;
deckView.setImage(cards.get((n)%cards.size()));
event.consume();
p1.setDisable(true);
Collections.shuffle(cards);
}
});
甲板视图是一个将卡片显示在玩家1上方的对象。如下所示: OverView of game
我需要创建52个卡对象并在其中分配值吗?如果这样做,是否需要寻找另一种方法来使用卡的对象而不是N查找随机值?如果我没有清楚解释,请按照以下说明进行操作。
(游戏的获胜者是赢得最多回合的玩家。每回合,一名玩家玩一张牌。拥有最高价值卡的玩家赢得一轮。2是最低价值,A是最高价值的卡。如果抽出相同张牌值的倍数,则花色决定赢家。黑桃>球杆>钻石>心形“)
答案 0 :(得分:0)
只需将值/适合的列表保存在某处即可。如果将它们按升序排列,则可以很容易地通过使用嵌套循环分别遍历值和西服来按升序创建卡,外层循环是迭代值。
关于抽奖卡:您可能不想重复,因此抽奖后应从卡组中取出一张卡片。
public enum Suit {
HEART("hearts"), SPADE("spades"), CLUB("clubs"), DIAMOND("diamonds");
private final String imageString;
Suit(String imageString) {
this.imageString = imageString;
}
public String getImageString() {
return imageString;
}
}
public enum CardValue {
TWO("2"),
THREE("3"),
FOUR("4"),
FIVE("5"),
SIX("6"),
SEVEN("7"),
EIGHT("8"),
NINE("9"),
TEN("10"),
JACK("jack"),
QUEEN("queen"),
KING("king"),
ACE("ace");
private final String imageString;
CardValue(String imageString) {
this.imageString = imageString;
}
public String getImageString() {
return imageString;
}
}
public final class Card implements Comparable<Card> {
private final CardValue value;
private final Suit suit;
private final int cardValue;
public Card(Suit suit, CardValue value) {
if (suit == null || value == null) {
throw new IllegalArgumentException();
}
this.suit = suit;
this.value = value;
this.cardValue = value.ordinal() * 4 + suit.ordinal();
}
public CardValue getValue() {
return value;
}
public Suit getSuit() {
return suit;
}
@Override
public int compareTo(Card o) {
return cardValue - o.cardValue;
}
public Image createImage() {
return new Image(value.getImageString() + "_of_" + suit.getImageString() + ".png");
}
@Override
public int hashCode() {
return cardValue;
}
@Override
public boolean equals(Object obj) {
return obj != null
&& (obj instanceof Card)
&& (((Card)obj).cardValue == cardValue);
}
}
private final Random random = new Random();
创建套牌:
private final List<Card> cards;
{
cards = new ArrayList<>(suits.length * values.length);
Suit[] suits = Suit.values();
CardValue[] values = CardValue.values();
List<Card> cards = new ArrayList<>(suits.length * values.length);
for (CardValue val : values) {
for (Suit suit : suits) {
cards.add(new Card(suit, val));
}
}
}
将所有卡片放在卡座上并洗牌
// create copy to avoid having to recreate all the cards when putting all cards back in the deck
List<Card> deck = new ArrayList<>(cards);
Collections.shuffle(deck, random);
从卡组中删除“最上面的”卡(在这种情况下,为提高效率,列表中的最后一张):
Card card = deck.remove(deck.size() - 1);
相反,您也不能在Collections.shuffle
上使用deck
,而是每次抽卡时都会移除随机卡:
Card card = deck.remove(random.nextInt(deck.size()));
Card
类提供了一种为其创建图像并比较卡值的方法。