2

我正在做一个个人项目。这将是一个纸牌游戏,例如,您可以将其与口袋妖怪进行比较。不幸的是,我遇到了一个错误,我不知道是什么原因造成的。我会很感激任何帮助!

好的,所以我有了带有构造函数的卡片类(我省略了不必要的属性)

public class Card 
{
    String name;
    String cardID;
    int strFire;
    int strEarth;

    public Card(String n, String id, int fire, int earth)
    {
        name = n;
        cardID = id;
        strFire = fire;
        strEarth = earth;
    }
}

然后我有了 Deck 类,它应该创建所有卡片的实例。

public class Deck 
{
    static void createDeck()
    {
        Card hoax06 = new Card("Nirwadas the Traveler", "hoax06", 3, 2);
        System.out.println(hoax06.name); // this works
    }
}

最后,我得到了包含 main 的 Game 类。

public class Game 
{
    public static void main(String[] args) 
    {
        Deck.createDeck();
        System.out.println(hoax06.name); // hoax06 cannot be resolved to a variable
    }
}

我知道答案可能很简单,但 java 的访问系统仍然让我感到困惑。我还浏览了论坛以查找类似的错误,但无法将它们应用于我的案例。我应该如何从 main 中引用一张卡片?

4

4 回答 4

2

卡片实例是在 Deck 类中创建的,因此 Game 类对它没有直接的了解。此外,一旦 createDeck() 方法结束,您就会失去对卡片的引用,并且实例消失了。

这是一个简单的例子:

public class Deck 
{
    public Card hoax06;

    static Deck createDeck()
    {
        Deck deck = new Deck();
        deck.hoax06 = new Card("Nirwadas the Traveler", "hoax06", 3, 2);
        return deck;
    }
}

public class Game 
{
    public static void main(String[] args) 
    {
        Deck deck = Deck.createDeck();
        System.out.println(deck.hoax06.name); // this is where the error occurs
    }
}
于 2013-02-09T13:56:17.523 回答
1

你从来没有做过hoax06。这就是发生错误的原因。

Deck.createDeck();
System.out.println(hoax06.name);

以下是一些选项:

  1. 使createDeck()退卡
  2. 做一个静态CardDeck,所以你可以使用Deck.hoax06.name
于 2013-02-09T13:55:16.403 回答
1

试试这个:

public class Deck 
{
    static Card createDeck()
    {
        Card hoax06 = new Card("Nirwadas the Traveler", "hoax06", 3, 2);
        System.out.println(hoax06.name); // this works
        return hoax06;    //return the object
    }
    }
public class Game 
{
    public static void main(String[] args) 
    {
        Card c=Deck.createDeck();  //get the object
        System.out.println(c.name); // use it here
    }
}
于 2013-02-09T13:58:28.553 回答
0

您可以创建一个枚举(可能称为 Cards),列出所有卡片,然后使用 Cards.HOAX06.name 从您的 Game 类(或其他任何地方)中访问它们

例如这样的:

    enum Cards {
        HOAX06("Nirwadas the Traveler", 3, 2),
        HOAX07("Something else", 5, 2) 
        //list all your cards here in the same way
        ;

        String name;
        int strFire;
        int strEarth;

        Cards(String name, int fire, int earth){
           this.name = name;
           this.strFire = fire;
           this.strEarth = earth;
        }
    }

然后从另一个类调用它:

public static void main(String[] args) {     
     System.out.println(Cards.HOAX06.name);
     System.out.println(Cards.HOAX07.strEarth);
     System.out.println(Cards.HOAX06.strFire);
     }

默认情况下,所有枚举都是静态的和最终的,一旦创建它们就无法更改值,但是我猜测对于一副牌,您可能不想这样做。

于 2013-02-09T14:07:43.840 回答