在 Java 中使用 3 维数组的卡片组
Deck of cards using a 3 dimensional array in Java
我正在用 3 维数组制作一副纸牌。但是当我调用随机卡片方法时,它说卡片数组有一个空值,即使我应该用双 for 循环填充它?
我查过其他关于卡片的帖子,但它们通常是 2D 或两个不同的数组,而不是 3D。谢谢你们的任何时间。如果我在我的 coding/thoughts/post 中偏离了方向,请告诉我,我是 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];
}
}
}
}
如果必须使用数组,请使用二维数组。您的 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
顺便说一句,你的套牌没有国王。
三维数组的第一维是花色(0 到 3),第二维是一张牌(0 到 11,没有 K?),第三维是牌(0 代表点数,1 代表点数)西装)。
如果你想抽一张牌,它会是这样的:card[] = deck[0-3][0-11];
(你会得到一张card
,其中card[0]
是价值,card[1]
西装)。你需要随机化这2个参数来得到一张随机卡。
不应使用多维数组,而应使用对象(例如,class 用于纸牌,一个用于纸牌)。代码会更容易理解(+ 面向对象编程的所有好处!)。
好的,根据您声明和初始化的方式 Deck
,您有:
表示套房的数组:索引从 0 到 3
其中,您有一个数组表示套件中的卡片:索引从 0 到 12,
其中,每张卡片都表示为一个数组,其中包含 2 个元素,分别代表套房号和套房内的卡片。
然后你尝试select一张随机卡如下:
card[i][j] = Deck[randomInt][i][j];
但是 randomInt
是一个介于 0 和 51 之间的数字。这行不通是吧。并且 card
是一个二维整数数组......而不是像 Deck
.
这样的 int[]
的二维数组
简直一团糟。
坦率地说,你最好重新开始。
我的推荐:
不要为此使用数组。 Java 是一种面向对象的语言,如果您按照 O-O 范式进行设计和编码,则效果最佳。
声明一张Card
class来表示一张牌。它有两个不可变字段;即套房和价值。
使用其中一个标准列表 classes,并创建一个 List<Card>
来表示每副牌(或手牌)。
此外,使用标准 Java 标识符约定。
我正在用 3 维数组制作一副纸牌。但是当我调用随机卡片方法时,它说卡片数组有一个空值,即使我应该用双 for 循环填充它?
我查过其他关于卡片的帖子,但它们通常是 2D 或两个不同的数组,而不是 3D。谢谢你们的任何时间。如果我在我的 coding/thoughts/post 中偏离了方向,请告诉我,我是 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];
}
}
}
}
如果必须使用数组,请使用二维数组。您的 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
顺便说一句,你的套牌没有国王。
三维数组的第一维是花色(0 到 3),第二维是一张牌(0 到 11,没有 K?),第三维是牌(0 代表点数,1 代表点数)西装)。
如果你想抽一张牌,它会是这样的:card[] = deck[0-3][0-11];
(你会得到一张card
,其中card[0]
是价值,card[1]
西装)。你需要随机化这2个参数来得到一张随机卡。
不应使用多维数组,而应使用对象(例如,class 用于纸牌,一个用于纸牌)。代码会更容易理解(+ 面向对象编程的所有好处!)。
好的,根据您声明和初始化的方式 Deck
,您有:
表示套房的数组:索引从 0 到 3
其中,您有一个数组表示套件中的卡片:索引从 0 到 12,
其中,每张卡片都表示为一个数组,其中包含 2 个元素,分别代表套房号和套房内的卡片。
然后你尝试select一张随机卡如下:
card[i][j] = Deck[randomInt][i][j];
但是 randomInt
是一个介于 0 和 51 之间的数字。这行不通是吧。并且 card
是一个二维整数数组......而不是像 Deck
.
int[]
的二维数组
简直一团糟。
坦率地说,你最好重新开始。
我的推荐:
不要为此使用数组。 Java 是一种面向对象的语言,如果您按照 O-O 范式进行设计和编码,则效果最佳。
声明一张
Card
class来表示一张牌。它有两个不可变字段;即套房和价值。使用其中一个标准列表 classes,并创建一个
List<Card>
来表示每副牌(或手牌)。
此外,使用标准 Java 标识符约定。