Java Card Game: Deck Class 需要帮助

Posted

技术标签:

【中文标题】Java Card Game: Deck Class 需要帮助【英文标题】:Java Card Game: Deck Class help needed 【发布时间】:2013-02-09 11:03:30 【问题描述】:

这是我关于 Stack Overflow 的第一个问题,如果我的问题中有一个新手错误,请原谅我,并随时纠正我,因为我计划在接下来的几个月内更多地使用这个网站。

不管怎样,我是一名 12 年级的高中生,我的一个家庭作业题被卡住了。 所以基本上我们得到了一个创建战争游戏(纸牌游戏)的项目,我们被要求每天做一小部分。到目前为止,直到今天一切都进展顺利,因此我向你们提出了问题。

以下是该项目的内容:

卡片

它有什么: Private int value:卡的价值 私人字符套装:卡片套装 Private Boolean draw:卡片是否从牌堆中抽出 它的作用: Public Card(int val, char s):创建一张价值为 val、花色为 s 且套数为 False 的牌 Public int getValue():返回一张卡片的值 Public char getSuit():返回一张牌的花色 Public Boolean isDrawn():返回卡片是否被抽出 Public String toString():以“花色值”的形式返回描述卡片的字符串

甲板

它有什么: Private char[] suits = ‘c’, ‘d’, ‘h’, ‘s’:西装的表示 Public int numCards:一副牌中的牌张数(传统上是 52 - 将其降低以进行测试!) Private Card[] 卡片组:卡片组存储为卡片数组

到目前为止,我已经完成了所有工作。

它的作用: Public Deck():创建一副纸牌——数值范围为 2-14,每套一张 公共牌drawCard():从牌组中随机抽取一张尚未抽出的牌 Public String toString():根据您的测试目的进行设计

现在我已经在下面的 Quynh 先生的帮助下完成了公共套牌步骤,但是我对如何创建 drawCard 方法感到困惑。到目前为止,这是我所拥有的:

public Card drawnCard()
        int randNum = (int) Math.random()*13+2;
    

所以我知道上面的代码创建了一个介于 2 和 14 之间的随机数,但我如何使用它来绘制实体卡?比如我输入什么让程序知道要抽牌?抱歉,我知道您现在可能觉得我每一步都在询问您,但我真的迷路了,需要您的帮助!

在编程方面我是新手,因此如果这个问题对您来说太简单/新手,我深表歉意,但我真的需要您的帮助 :)

感谢您的宝贵时间!

【问题讨论】:

不,“以上”不正确。指令特别 告诉您需要一个Card 数组,而不是int 数组。如果我是你,我会按照你得到的指示开始。他们几乎说明了您的要求。 您好!感谢您的快速回复并使我的帖子更好:) 我再次阅读了说明,但这对我没有帮助?昨晚的作业是卡片课,几乎所有内容都在要点中说明,但今晚的 hw(甲板课),我发现这有点挑战性,即使在阅读了说明之后。这是我的第一门编程课程,所以我对这些东西的解释不是很快。 哦,所以我把它改成了 public Deck() Card[] deck = 2,3,4,5,6,7,8,9,10,11,12,13,14 ;但现在我收到一个语法错误,说它找到 int, required card.newpackage.Card 同样,您需要一个 Card 数组 Card[],而不是一个 int 数组 int[]。学习写好代码的关键是编写大量代码并用您的代码试验大量代码。坚持下去! 嗨!欢迎来到 ***。除了以前的建议,我建议你阅读其他人以前做过的事情。有几个初学者示例(如this one)可能会为您提供另一种解决问题的方法。阅读FAQ 以了解未来的问题也是一个好主意。祝你好运! ;) 【参考方案1】:

作为初学者,您的 Deck 构造函数应该类似于此

for(int i = 2; i <= 14; i++)
   for(int j = 0; j < suits.length; j++)
     Card card = new Card(i, suits[j]);
     card.isDrawn(false);
     //ADD CARD TO YOUR DECK HERE  
   

至于 drawCard 功能,只需从 1-52 随机化一个数字(假设您使用的是 52 张卡片组)然后从您的卡片组中抽取它并设置.isDrawn(true)

【讨论】:

除了 Quynh 所说的之外,还有一些提示:确保在抽牌时,仅当 .isDrawn()false 时才将其归还。另外,如果你调用.drawCard()时所有的牌都抽完了会怎样? 我想退出游戏?虽然我认为我的老师不会指望我知道这一点,所以希望她会在星期一告诉我该怎么做。感谢 Quynh 先生和 Kevin 提供的代码 :) 我非常感谢您提供的有用提示。不敢相信你们花了 10 分钟来回答这个问题,而我的朋友已经花了一个小时来解决这个问题告诉我在这个网站上发布这个问题。 ^阅读关于 Kelvin 提出的问题的异常处理。 @Quynh 你能解释一下我应该如何从牌堆中抽牌吗?我按照您的指示创建了一个随机数,但我不知道如何将它变成抽卡?我是否必须输入一个荒谬的 if 语句,说如果随机数等于 1,然后抽这张卡,依此类推,直到我到达最后一个数字?那需要我几个小时 您知道您有一个 Card[52] 数组,您可以使用索引从卡片数组中获取卡片。所以,如果你的随机数是 1 那么你可以通过 card = Card[randomNumber] 得到一张卡片。【参考方案2】:

这样的……

public class Deck 

    private Card[] cards = new Card[52];
    private int index = -1;

    public Deck() 
        // build deck
        for (int i=0; i<52; ++i) 
            if (i<13) cards[i] = new Card('s',i+2);
            else if (i<26) cards[i] = new Card('c',i-13+2);
            else if (i<39) cards[i] = new Card('d',i-26+2);
            else if (i<52) cards[i] = new Card('h',i-39+2);        
        
        // shuffle deck
        Collections.shuffle(Arrays.asList(cards));
    

    public Card drawCard() 
        ++index;
        cards[index].drawn();            
        return cards[index];
    


class Card 

    private char suit;
    private int value;
    private boolean drawn = false;

    Card(char s, int v) 
        suit = s;
        value = v;
    

    void drawn()  drawn = true; 

    boolean isDrawn()  return drawn; 

【讨论】:

我需要有关drawCard方法的帮助,我已经做了先生。 Quynh 在上面创建了套牌。【参考方案3】:

您应该为此使用数组列表以使洗牌更容易。由于这是作业,我不会给你确切的代码,但是,

ArrayList<Card> deck=new ArrayList<Card>();
        //add a loop with
        
            Card card=new Card("initilize card here");
            deck.add(card);
        

从长远来看,这应该可以帮助您入门并使其更容易。

【讨论】:

我想使用它,但我还没有学习数组列表的工作原理,所以我的老师不会接受我不完全理解的东西,但我非常感谢你的帮助! :) 尽管很好地使用了 ArrayLists,但我不会提出任何超出他任务要求的建议。这个项目强调的是数组的使用。

以上是关于Java Card Game: Deck Class 需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

CF1511C Yet Another Card Deck

CF1511C Yet Another Card Deck

CF1511C Yet Another Card Deck

CF1511C Yet Another Card Deck

CF1492B - Card Deck

如何使用 Scrollview(或最佳实践)进行 Card Deck 样式页面转换,垂直和水平