【问题标题】:Deck of cards using a 3 dimensional array in Java在 Java 中使用 3 维数组的卡片组
【发布时间】:2015-02-01 06:16:03
【问题描述】:

我正在制作一副带有 3 维数组的纸牌。但是当我调用随机卡片方法时,它说卡片数组有一个空值,即使我应该用双循环填充它?

我查看了卡片上的其他帖子,但它们通常是 2D 或两个不同的数组,而不是 3D。感谢你们的任何时间。如果我的编码/想法/帖子有问题,请告诉我,我对 Java 和堆栈还很陌生。

import java.util.Random;
import java.util.Arrays;
public class Deck {

    String Hearts, Diamonds, Spades, Clubs;
    private String Suit;
    private int Deck [][][];
    private int card [][];


    public void FreshDeck()
    {
        Deck = new int [][][]
                   {{{1,1},{2,1},{3,1},{4,1},{5,1},{6,1},{7,1},{8,1},{9,1},{10,1},{11,1},{12,1}},       //Hearts 
                    {{1,2},{2,2},{3,2},{4,2},{5,2},{6,2},{7,2},{8,2},{9,2},{10,2},{11,2},{12,2}},       //Diamonds 
                    {{1,3},{2,3},{3,3},{4,3},{5,3},{6,3},{7,3},{8,3},{9,3},{10,3},{11,3},{12,3}},       //Spades
                    {{1,4},{2,4},{3,4},{4,4},{5,4},{6,4},{7,4},{8,4},{9,4},{10,4},{11,4},{12,4}}        //Clubs
                   };   
    }

    private void setValue(int index, int value)
        {
            card[index][0] = value;
        }
    private void setSuit(int index, int suit)
        {
            card[index][1] = suit;
        }
    public int Value(int index)
        {
        return card[index][0];
        }
    public int Suit(int index)
        {
        return card[index][1];
        }

    public void setRandomCard()
    {
    Random randomCard = new Random();
    int randomInt = randomCard.nextInt(51);
        for (int i=0; i<12; i++) 
        {
            for (int j=0; j<4; ++j)
            {
                card[i][j] = Deck[randomInt][i][j];
            }
        }       

    }
}

【问题讨论】:

  • 为什么 2D 不适合你?
  • 请尊重 Java 命名约定,对于您和必须阅读您的代码的人。变量或方法的开头没有大写,仅适用于类和接口。
  • 我看不出有任何理由拥有 3D Deck 或 2D card。如果出于某些关系目的,请考虑编写另一个类。

标签: java for-loop random


【解决方案1】:

好的,所以根据您声明和初始化Deck 的方式,您有:

  • 代表套件的数组:索引从 0 到 3

  • 在其中,您有一个表示套件中卡片的数组:索引从 0 到 12,

  • 在其中,每张卡片都表示为一个数组,其中包含 2 个元素,分别代表套件编号和套件中的卡片。

然后您尝试按如下方式随机选择一张卡片:

    card[i][j] = Deck[randomInt][i][j];

但是randomInt 是一个介于 0 和 51 之间的数字。那是行不通的。而card 是一个二维整数数组...不是int[] 的二维数组,如Deck

只是一团糟。


坦率地说,你最好重新开始。

我的建议:

  • 不要为此使用数组。 Java 是一种面向对象的语言,如果您按照 O-O 范式进行设计和编码,则效果最佳。

  • 声明一个Card 类来表示一张卡片。它有两个不可变字段;即套房和价值。

  • 使用标准列表类之一,并创建一个List&lt;Card&gt; 来表示每一副牌(或手牌)。

另外,使用标准 Java 标识符约定。

【讨论】:

  • 好的,感谢您的帮助!我想我会重新开始。
【解决方案2】:

如果必须使用数组,请使用二维数组。您的 3D 数据结构是多余的,因为您已经通过第一个维度指示花色,但是您在第三个维度中再次包含了一个花色指示符。

int[][] hearts = Deck[0]; // first element in first dimension is hearts suit
int[] aceOfHearts = hearts[0]; // first element in second dimension is ace
int heartsIndicator = aceOfHearts[1]; // redundant hearts indicator in 3rd dimension

顺便说一句,你的套牌没有国王。

【讨论】:

  • 啊,我明白了。谢谢朋友!
【解决方案3】:

您的 3D 数组的第一个维度是花色(0 到 3),第二个维度是一张牌(0 到 11,没有 K?),第三个维度是牌(0 代表价值,1 代表花色) .

如果你想抓一张牌,它应该是这样的:card[] = deck[0-3][0-11];(你会得到一个card,其中card[0]是价值,card[1]是花色)。你需要将这两个参数随机化,才能得到一张随机卡片。

您应该使用对象而不是使用多维数组(例如,为卡片创建一个类,为套牌创建一个类)。代码会更容易理解(+ 面向对象编程的所有好处!)。

【讨论】:

  • 不同的类。知道了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 2016-01-28
  • 2013-02-01
相关资源
最近更新 更多