【问题标题】:Card Class java卡片类java
【发布时间】:2013-12-22 19:08:48
【问题描述】:

我正在制作一个卡片和一副卡片类,它制作一副 52 张卡片,而 cardProgram 类是驱动程序。卡片类具有卡片花色的属性和价值的属性(Ace,King,10,9 , 等等)。它还有一个用于属性的构造函数和一个用于卡片的 toString 表示。卡片组类有一个属性来表示卡片组中的卡片,并且没有参数的构造函数将创建 52 张卡片并将它们添加到卡片组,随机删除卡片并返回已绘制卡片对象的方法,以及 toString 到显示包含在套牌中的卡片。 Tha main 将创建纸牌。用户输入他们想要绘制的数字。他们抽出的每张牌都会被打印出来,然后牌组中剩余的牌也会被打印出来。我正在使用 ArrayList 来执行此操作,我只想知道我是否朝着正确的方向前进。我不断收到错误,我知道我的课程有问题。我以前从未使用过 ArrayList,所以任何信息都将不胜感激

public class Card 
{
    private int type, value;
    private String[] cardType = {"Clubs", "Spades", "Diamonds", "Hearts"};
    private String[] cardValue = {"Ace", "King", "Queen", "Jack", "10",
                                   "9", "8", "7", "6", "5", "4", "3", "2"};

    public Card(int types, int values)
    {
        type = types; 
        value = values;
        //this.value = value;
    }

    public String toString()
    {
        String finalCard = cardValue[value] + " of " + cardType[type];

        return finalCard;
    }

}

import java.util.Random;
import java.util.ArrayList;

public class Deck 
{
    private ArrayList<Card> cards;

    public Deck()
    {
        for(int a =0; a<=3; a++)
        {
            for(int b =0; b<=12;b++)
            {
                cards.add(drawRandomCard());
            }
            cards.addAll(cards);
        }

    }

    public Card drawRandomCard()
    {
        Random generator = new Random();
        int index = generator.nextInt(cards.size());
        return cards.remove(index);
    }

    public String toString()
    {
        String result = "Cards remaining in deck: " + cards;

        return result;

    }    
}


import java.util.Scanner;

public class CardProgram 
{
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        Card C;
        Deck deck = new Deck();

        System.out.println("Enter number of cards to be dealt: ");
        int numberCards = scan.nextInt();

        System.out.println("Cards drawn: ");
        C = deck.drawRandomCard();

        System.out.println(C.toString());


    }

}

【问题讨论】:

  • 嗯,什么样的错误?
  • 您遇到了什么错误?请具体,并编辑您的问题以包含堆栈跟踪/错误消息
  • 欢迎来到 stackoverflow.com。我是否正确,您没有具体问题,但只想知道您的代码是否可以改进?在这种情况下,您应该将其发布在我们的合作伙伴网站 codereview.stackexchange.com 上。
  • cards.addAll(cards); 你知道你在这里添加了卡片列表吗? (这意味着您复制了列表中的所有条目)
  • @knoight "这意味着如果指定的集合是这个列表,并且这个列表是非空的,那么这个调用的行为是未定义的。)" 确实。它可能会复制列表,也可能会陷入无限循环,试图一遍又一遍地添加最后一个元素。

标签: java arrays object arraylist


【解决方案1】:

查看您的代码,我认为您正在谈论 NullPointerException,因为您正在谈论 error

您已经定义了private ArrayList&lt;Card&gt; cards;,但您从未在您的Deck 类中初始化它。

应该是这样的

private ArrayList<Card> cards; // currently its null
cards = new ArrayList<Card>(); // initializing here and no more null

【讨论】:

  • 我知道了,谢谢!
  • 我很高兴你知道了。祝你好运。
【解决方案2】:

在设计指南方面,我有几点建议:

1) 保持局部变量小写 (Card c)

2) 考虑为等级和花色创建 Java Enum。 您的循环甲板创建将如下所示:

cards = new ArrayList<Cards>();
for(Rank k : Rank.values())
   for(Suit s: Suit.values())
      cards.add(new Card(k,s));

3) 您将得到的错误可能是ArrayOutOfBoundsException,因为您的 Deck 构造函数在初始卡片为空时调用 drawRandomCards()。祝你好运!

4) 正如所指出的,您还没有初始化卡片。

【讨论】:

    【解决方案3】:

    我认为这就是你所需要的。那我改变了什么?

    1。 初始化牌组时,您需要为每个数字组合填充一张卡片 ArrayList。这是通过cards.add(new Card(a,b)); 实现的。我还删除了cards.addAll(cards),因为您将整个列表添加到自身。

    编辑:哦,是的,我也初始化了 ArrayList。这一点很重要!

    2。 在你的CardProgram 中,你得到了你想要抽的牌张数,所以我循环了很多次调用drawRandomCard()

    3。 剩下的卡片我还没打印,你自己想办法吧。

    public class Card 
    {
    private int type, value;
    private String[] cardType = {"Clubs", "Spades", "Diamonds", "Hearts"};
    private String[] cardValue = {"Ace", "King", "Queen", "Jack", "10",
                                   "9", "8", "7", "6", "5", "4", "3", "2"};
    
    public Card(int types, int values)
    {
        type = types; 
        value = values;
        //this.value = value;
    }
    
    public String toString()
    {
        String finalCard = cardValue[value] + " of " + cardType[type];
    
        return finalCard;
    }
    
    }
    
    import java.util.Random;
    import java.util.ArrayList;
    
    public class Deck 
    {
    private ArrayList<Card> cards;
    
    public Deck()
    {
        cards = new ArrayList(52);
        for(int a =0; a<=3; a++)
        {
            for(int b =0; b<=12;b++)
            {
                cards.add(new Card(a,b));
            }
        }
    
    }
    
    public Card drawRandomCard()
    {
        Random generator = new Random();
        int index = generator.nextInt(cards.size());
        return cards.remove(index);
    }
    
    public String toString()
    {
        String result = "Cards remaining in deck: " + cards;
    
        return result;
    
    }    
    }
    
    
    import java.util.Scanner;
    
    public class CardProgram 
    {
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        Card C;
        Deck deck = new Deck();
    
        System.out.println("Enter number of cards to be dealt: ");
        int numberCards = scan.nextInt();
    
        System.out.println("Cards drawn: ");
        for (int i = 0; i < numberCards; i++) {
          C = deck.drawRandomCard();
          System.out.println(C.toString());
        }
    
        System.out.println(C.toString());
    
    
    }
    
    }
    

    【讨论】:

    • 我仍然收到错误:Deck.(Deck.java:19) at CardProgram.main(CardProgram.java:14) 处的线程“main”java.lang.NullPointerException 异常我运行它。这是 Deck 中的行:cards.add(new Card(a,b));主要是:Deck deck = new Deck();
    • @user1807844 你从未初始化过crads 实例,所以默认情况下它的null 会导致你NullPointerException。我已经更新了我的答案,但这并不能解决其他问题。
    • 我说我已经完成了,我在我的本地副本中,只是没有将它粘贴回这里。已经更新了上面的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多