【问题标题】:Card Deck 52 cards ,Java eclipse , setting color,suit, rank [closed]卡片组 52 张卡片,Java eclipse,设置颜色,套装,等级 [关闭]
【发布时间】:2013-09-29 20:37:34
【问题描述】:

嘿,我正在尝试制作一副牌

一副牌应该包含 52 张牌,

ofc 与铁锹、钻石、心形、梅花 有等级,

这是我的代码,到目前为止我还没有得到 提前感谢您的帮助。

让牌组洗牌,创建一个代表包含 52 张牌的牌组的类,当一个新对象 类的创建后,卡片组将使用它将包含的卡片进行初始化。

public class Card {
    int[] deck = new int[52];

    String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};
    String[] ranks = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"};

    Card() {
       for (int i = 0; i < deck.length; i++) {
           deck[i] = i;
       }
    }
}

【问题讨论】:

  • 你还没有问过问题
  • 对我来说,您似乎不是在问问题。请提出一个真正的问题。在你问一个真正的问题之前(例如:“我怎样才能让一张牌有一个特定的花色或等级?)先自己多试几次。
  • 我该怎么做?让牌组洗牌,创建一个类,表示包含 52 张牌的牌组,当创建此类的新对象时,牌组将使用它将包含的牌进行初始化。
  • 含牌:List&lt;Card&gt; cards;,洗牌:Collections.shuffle(cards);
  • 我认为这里的设计“问题”很明显。

标签: java


【解决方案1】:

卡片不是一副卡片Card 具有属性(即成员变量),例如 suitrank(尽管在比较时通常使用整数或枚举来表示排名,然后更改它们的显示方式) .

A Deck of Cards 是很多张牌;通常在创建套牌时建立限制。在这种情况下,suits[]ranks[] 可用于构建套牌中的许多卡片(在创建时为每张卡片提供一个特定花色和等级) .在 Java 中执行此操作的最简单方法是使用嵌套循环 - 每个维度一次。

每张牌的“颜色”来源于花色,不需要存储,因为它可以根据花色确定。如果使用枚举,则只能将其分配为属性。

按照上面的逻辑,下面是一组示例类:

class Card {
   final public String suit;
   final public String rank;
   public Card(String suit, String rank) {
      // Assign suit/rank from arguments
   }
   String getColor() {
      // Return the color based on suit (effectively "for free" if
      // using an enumeration)
   }
}

class DeckOfCards {
    String[] suits = {..};
    String[] ranks = {..};

    // Arrays are icky to deal with; favor Lists/Collections.
    List<Card> cards = new ArrayList<Card>();

    public DeckOfCards () {
       // For each suit/rank pair, create a Card and add it
       // to the cards collection.
       // You'll want nested loops, as shown by another answer.
    }

    public List<Card> getCards () {
        // Return cards, perhaps
    }

    // Other methods relating to the Deck of Cards
    public void shuffle () {
    }
}

虽然我建议查看enums,但以上内容应表明两种不同“事物”之间的区别 - 卡片和卡片组(或集合)。另一个答案包含显示如何从两个输入数组的叉积生成卡片的代码。

【讨论】:

  • IList?你的意思是List 对吗?但除此之外,是的,这是 OP 需要做出的非常重要的区别
  • @JavaDevil 是的,C# 太多了,谢谢 :)
  • 似乎是枚举的可能位置。
  • 你们对枚举的意思是什么谢谢你清理它@user2246674
  • @user2825771 "枚举类型是一种特殊的数据类型,它使变量能够成为一组预定义的常量。该变量必须等于为其预定义的值之一。常见示例包括指南针方向(NORTH、SOUTH、EAST 和 WEST 的值)和一周中的日期 [或牌组]。” docs.oracle.com/javase/tutorial/java/javaOO/enum.htmlstackoverflow.com/questions/2151232/…stackoverflow.com/questions/2179854/…
【解决方案2】:

首先,将suits[] 和ranks[] 做成int 数组。将deck 设为一组卡片,并将deck 和您正在使用的构造函数放在不同的cals 中(称为deck)将构造函数更改为Card(int suit, int name)只需这样做:

for(int i = 0; i < 4; i++) for(int j = 0; j < 13; j++){
   Cards[13*i + j] = new Card(i, j); 
}

【讨论】:

    【解决方案3】:

    创建一个 Card 对象,该对象具有 suit 和 value 属性。

    创建一个方法来创建一个包含所有 52 张卡片的列表。

    对于你的牌组,我建议使用Deque,通常发音为“Deck”,类似于一副纸牌。

    然后创建洗牌套牌

    //Create a List of cards
    List<Card> deckList = ... //A method to create your 52 cards
    Collections.shuffle(deckList);
    Deque<Card> deck = new ArrayDeque<Card>(deckList);
    

    【讨论】:

    • 我怀疑这个发音是因为这个词的意思类似于一副纸牌,尽管这可能是english stackexchange 的问题。发音很可能是因为单词的拼写方式。
    • @SimonAndréForsberg 可能不是,但这是一种简单的方法来说明它是适合这种情况的结构,已编辑。
    猜你喜欢
    • 2017-04-27
    • 2020-11-27
    • 2023-03-25
    • 2021-07-21
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多