使用 for 循环的方法不会打乱我的数组元素或重写所有元素
method using for-loop wont shuffle my array elements or rewrites all of them
我有一个 class、Deck_of_Cards,它有一个默认构造函数,它将新定义的大小为 52 的数组分配给 'deck',然后激活 class 刷新方法。
refresh 方法使用嵌套的 for 循环将卡片分配到牌组中,然后激活 class shuffle 方法,正如您可能猜到的那样,它使用 for 循环随机化所有元素的位置 'deck'数组。执行测试代码应该会产生五张不同的卡片,而不是我五次得到一张卡片,示例如下所示。
Jack of Diamonds
Jack of Diamonds
Jack of Diamonds
Jack of Diamonds
Jack of Diamonds
测试代码
public class test {
Deck_of_Cards X = new Deck_of_Cards();
int drawCount = 5;
for(int i = 0; i<drawCount; i++)
{
printCard(X.drawCard());
}
//Outputs the given card's data as "<rank> of <suit>".
public static void printCard(Card c) {
String st;
if (c.getRank() == '1')
st = c.getRank() + "0 of " + c.getSuit();
else if (c.getRank() == 'A')
st = "Ace of " + c.getSuit();
else if (c.getRank() == 'J')
st = "Jack of " + c.getSuit();
else if (c.getRank() == 'Q')
st = "Queen of " + c.getSuit();
else if (c.getRank() == 'K')
st = "King of " + c.getSuit();
else
st = c.getRank() + " of " + c.getSuit();
switch (c.getSuit()) {
卡片Class
public class Card {
private char suit;
private char rank;
//Constructor
public Card(char s, char r)
{
// Suit if-statement
if (s == 'C' || s == 'D' || s == 'H' || s == 'S' )
{
s = suit;
}
else
{
throw new IllegalArgumentException("Not a valid suit!");
}
// Rank if-statement
if (r == 'A' || r == '2' || r == '3' || r == '4' || r == '5' || r == '6' || r == '7' || r == '8' || r == '9' || r == 'J' || r == 'Q' || r == 'K')
{
r = rank;
}
else
{
throw new IllegalArgumentException("Not a valid rank!");
}
}
// Accessors
public char getRank()
{
return rank;
}
public char getSuit()
{
return suit;
}
Deck_of_Cards class
import java.util.*;
public class Deck_of_Cards {
private Card deck [];
private int position;
Random rng = new Random();
public Deck_of_Cards ()
{
deck = new Card[51];
refresh();
}
public void refresh()
{
char suit[] = {'C', 'D', 'H', 'S'};
char rank[] = {'A', '2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K'};
int index = 0;
for (int i = 0; i < suit.length; i++)
{
for (int j = 0; j < rank.length; j++)
{
deck[index] = new Card(suit[i], rank[j]);
index++;
}
}
shuffle();
}
public void shuffle()
{
for (int x = deck.length; x >= 0; x--)
{
position = rng.nextInt(x+1);
Card g = deck [x];
deck[x] = deck[position];
deck[position] = g;
//Reseting position back to zero
if(x == 0)
{
position = 0;
}
}
}
public Card drawCard()
{
return deck[position];
}
}
问题是在 drawCard
:
public Card drawCard()
{
return deck[position];
}
你不会改变position
,所以每次调用它时,你都会一遍又一遍地抽同一张牌。将其更改为:
public Card drawCard()
{
return deck[position++];
}
增加 position
(或 position--
,具体取决于您对 "deck" 的可视化方式)
我有一个 class、Deck_of_Cards,它有一个默认构造函数,它将新定义的大小为 52 的数组分配给 'deck',然后激活 class 刷新方法。
refresh 方法使用嵌套的 for 循环将卡片分配到牌组中,然后激活 class shuffle 方法,正如您可能猜到的那样,它使用 for 循环随机化所有元素的位置 'deck'数组。执行测试代码应该会产生五张不同的卡片,而不是我五次得到一张卡片,示例如下所示。
Jack of Diamonds
Jack of Diamonds
Jack of Diamonds
Jack of Diamonds
Jack of Diamonds
测试代码
public class test {
Deck_of_Cards X = new Deck_of_Cards();
int drawCount = 5;
for(int i = 0; i<drawCount; i++)
{
printCard(X.drawCard());
}
//Outputs the given card's data as "<rank> of <suit>".
public static void printCard(Card c) {
String st;
if (c.getRank() == '1')
st = c.getRank() + "0 of " + c.getSuit();
else if (c.getRank() == 'A')
st = "Ace of " + c.getSuit();
else if (c.getRank() == 'J')
st = "Jack of " + c.getSuit();
else if (c.getRank() == 'Q')
st = "Queen of " + c.getSuit();
else if (c.getRank() == 'K')
st = "King of " + c.getSuit();
else
st = c.getRank() + " of " + c.getSuit();
switch (c.getSuit()) {
卡片Class
public class Card {
private char suit;
private char rank;
//Constructor
public Card(char s, char r)
{
// Suit if-statement
if (s == 'C' || s == 'D' || s == 'H' || s == 'S' )
{
s = suit;
}
else
{
throw new IllegalArgumentException("Not a valid suit!");
}
// Rank if-statement
if (r == 'A' || r == '2' || r == '3' || r == '4' || r == '5' || r == '6' || r == '7' || r == '8' || r == '9' || r == 'J' || r == 'Q' || r == 'K')
{
r = rank;
}
else
{
throw new IllegalArgumentException("Not a valid rank!");
}
}
// Accessors
public char getRank()
{
return rank;
}
public char getSuit()
{
return suit;
}
Deck_of_Cards class
import java.util.*;
public class Deck_of_Cards {
private Card deck [];
private int position;
Random rng = new Random();
public Deck_of_Cards ()
{
deck = new Card[51];
refresh();
}
public void refresh()
{
char suit[] = {'C', 'D', 'H', 'S'};
char rank[] = {'A', '2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K'};
int index = 0;
for (int i = 0; i < suit.length; i++)
{
for (int j = 0; j < rank.length; j++)
{
deck[index] = new Card(suit[i], rank[j]);
index++;
}
}
shuffle();
}
public void shuffle()
{
for (int x = deck.length; x >= 0; x--)
{
position = rng.nextInt(x+1);
Card g = deck [x];
deck[x] = deck[position];
deck[position] = g;
//Reseting position back to zero
if(x == 0)
{
position = 0;
}
}
}
public Card drawCard()
{
return deck[position];
}
}
问题是在 drawCard
:
public Card drawCard()
{
return deck[position];
}
你不会改变position
,所以每次调用它时,你都会一遍又一遍地抽同一张牌。将其更改为:
public Card drawCard()
{
return deck[position++];
}
增加 position
(或 position--
,具体取决于您对 "deck" 的可视化方式)