【问题标题】:Rank of Cards in a Game游戏中的纸牌排名
【发布时间】:2014-07-11 21:08:00
【问题描述】:

我是一名初学 Java 的学生。所以任何帮助将不胜感激!

我设计了一个卡片类和甲板类,我将在我创建的游戏中使用它们。到目前为止,我的游戏似乎运行得很好,但我遇到的问题在于我的 Cards 类。我想利用我的 getRank() 方法来为玩家拥有的牌累积点数(无论花色如何)。

例如,如果他们抽到 2 颗钻石,则价值 2 分,红心 3 为 3 分……等等。我创建了一个名为ranksString[] 来尝试执行此操作,我认为就是这样做的。但是,我希望所有面牌(如国王、王后……)的值都为 10。但并非所有这些牌都位于我数组中的索引 10 处。我可以就如何进行调整有一些指导吗?

提前谢谢你。

int rank;
int suit;
String[]ranks = { " "," ", " " } //all 13 ranks from Ace to King 
String[]suits = { " ", " ", " "} //all ranks

public Card(int rank, int suit){
   this.rank = rank;
   this.suit = suit; 
}

public void setRank(int rank){
   this.rank = rank;
}

public int getRank(){
   return rank;
}

//more code for suits

public String toString(){
   return ranks[rank]+" of "+suits[suit];
}

【问题讨论】:

  • 一个简单的方法就是 return Math.min(10, rank);
  • 你可以使用第三个数组:int[] pointValue = {2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 10}; //王牌高

标签: java class


【解决方案1】:

枚举是你的朋友。正如您所发现的,ints 不合适,因为它们仅适用于某些情况(从 ace 到 10),并且没有什么可以阻止您的用户提供非法值(负数或大于 13)。枚举既可以强制执行正确的值,也可以轻松关联您喜欢的任何数值。

public enum CardRank  {
   ACE(1),
   TWO(2),
   THREE(3),
   ...
   TEN(10),
   JACK(10),
   QUEEN(10),
   KING(10);

   private final int value;
   CardRank(int value)  {
      this.value = value;
   }
   public int getValue()  {
      return  value;
   }
}

使用这个,你可以设置排名

public void Card(CardRank rank, CardSuit suit)  {
   this.rank = rank;
   this.suit = suit;
}
public int getRankValue()  {
   return  rank.getValue();
}

枚举的另一个好处是更清晰,自我记录的功能。如果参数都是ints,那么,只看签名的类型,并不清楚哪个是等级,哪个是花色。使用枚举,这不是问题。

我会留下CardSuit 作为练习:)

更多信息:

【讨论】:

  • 谢谢,这似乎很有用!但我还没有学到这一点,我真的不确定我是否可以将它用于我的作业:/
  • 如果你不能,我会感到惊讶。这是一个非常基本的 Java 概念。
【解决方案2】:

您可以重组您的 Card 类,使其也具有一个“值”或等效参数,用于存储每张卡的点值。但是,点值更多的是一种游戏逻辑。也许给你的游戏一个 getValue(Card c) 方法,它可以根据你的逻辑将卡片的等级转换为值。该方法可能如下所示

public int getValue(Card c) {
    if (c.getRank() > 10) {
        return 10;
    } else {
        return c.getRank();
    }
}

【讨论】:

  • 这似乎在我目前的能力范围内,但我在我的主要方法中有我的实际游戏......所以当我调用 myCard.getRank()......我似乎不能弄清楚如何改变它的值:/
  • 基本上你可以用Game.getValue(myCard)之类的方法替换你对myCard.getRank()的调用getValue方法可能看起来像这样if (myCard.getRank() > 10) {return 10;} else {return myCard.getRank()}
  • 查看答案中的编辑以更清楚地表示该方法的外观
  • 这是一个更优雅的答案。您可能应该使用@resueman 和@alliteralmind 指出作为值逻辑来代替myCard.getRank()
  • 更正:return Math.min(10, c.getRank());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多