我正在制作一个扑克计划。我有一些问题想弄清楚如何洗牌。我必须使用数组。我不能使用枚举或列表。我知道有更好的方法来制作这个程序,但重点是理解数组。
我有一些问题想弄清楚如何洗牌。我试图保持这个尽可能简单,所以我有一个课程来获得卡片的卡片并将它们洗牌。
import java.util.Arrays;
import java.util.Random;
public class Card
{
String[] suits = { "Spades", "Clubs", "Hearts", "Diamonds" };
String[] values = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"};
public Card()
{
}
public void getCards()
{
for(int indexSuit = 0; indexSuit < suits.length; indexSuit++)
{
String suit = suits[indexSuit];
System.out.print(suit + " ");
for(int indexType = 0; indexType < values.length; indexType++)
{
String type = values[indexType];
System.out.print(type + " ");
}
}
}
public void shuffle(String[] suit, String[] value)
{
Random rndSuits = new Random();
Random rndType = new Random();
for(int indexSuit = suits.length - 1; indexSuit > 0; indexSuit--)
{
int index = rndSuits.nextInt(indexSuit + 1);
String temp = suits[indexSuit];
suits[indexSuit] = suit[index];
suit[index] = temp;
System.out.print(temp);
for(int indexType = values.length -1; indexType > 0; indexType--)
{
int index2 = rndType.nextInt(indexType + 1);
String temp2 = values[indexType];
values[indexType] = value[index2];
value[index2] = temp2;
System.out.print(temp2);
}
}
}
public void deal()
{
}
}
这是我的主要内容:
public class FiveCardPoker
{
public static void main(String[] args){
Card timsCards = new Card();
timsCards.getCards();
timsCards.shuffle(args, args);
}
}
我试图根据我在这里找到的另一个问题来编写shuffle方法,但它只适用于单个数组。我不确定shuffle方法的逻辑是否正确。我也不确定如何在我的main方法中调用它。
当我调用timsCards.shuffle时,如何将我的数组从Card类传到Main类?
编辑:所以我尝试过编辑它,但它似乎没有做任何事情。public void shuffle()
{
Collections.shuffle(Arrays.asList(suits));
Collections.shuffle(Arrays.asList(values));
System.out.println(Arrays.toString(values) + " of " + Arrays.toString(suits));
}
答案 0 :(得分:1)
我能想到的理想方式是,您可以从这些数组中创建一些Collection
并使用
Collections.shuffle()
方法。
代码 -
String[] suits = {"Spades", "Clubs", "Hearts", "Diamonds"};
List<String> list = Arrays.asList(suits);
Collections.shuffle(list);
System.out.println(list); //Prints shuffled list
答案 1 :(得分:1)
关于你的上一个问题,关于如何从shuffle函数内部将数组放入main函数,你应该让你的shuffle函数返回一个数组,并像这样调用它:
shuffledCards[] = timsCards.Shuffle(...);
我意识到其他人提供了其他解决方案,但你提到的目的是理解数组,所以我想我会提到这将完成同样的事情。
另外,虽然我承认没有测试过,但似乎你的随机阵列会在每个套装内部洗牌,但不是整个套牌。您可能想要考虑更具创造性的解决方案(如果您不打算使用Collections.shuffle()
)
答案 2 :(得分:0)
如果你想自己写一个shuffle方法,你可以这样做。
static Random rnd = new Random();
static void shuffle(Object[] array) {
for(int index1 = array.length - 1; index1 > 0; index1--) {
int index2 = rnd.nextInt(index1 + 1);
Object temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
}
public static void main(String[] args) {
String[] suits = { "Spades", "Clubs", "Hearts", "Diamonds" };
String[] values = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"};
shuffle(suits);
shuffle(values);
}
通过这种方式,您可以随机播放任意对象的数组,而不仅仅是字符串。您可能希望用表示卡片的对象填充数组,然后将其洗牌。
答案 3 :(得分:0)
在你的例子中有几点需要改进。
首先,西装(&#34;黑桃&#34;,&#34;俱乐部&#34;,&#34;心&#34;,&#34;钻石&#34;)和值应该是使用枚举类型而不是字符串进行操作。它将更容易阅读和调试。如果需要,可以实现一个枚举数组。
只有一个随机对象足够好。如果你希望不可预知的洗牌,你应该使用种子......
如何改组每个数组是正确的,但不是全局数组。在这里你穿着西装,在西装内你洗牌,但所有的钻石都在一起...... 如果你想要洗牌(如我想象的那样)那么你应该只实现一个集合/数组:一系列卡片,每张卡片都是一对一对的套装,价值。
对于你的上一个问题,我建议实施&#39; shuffle&#39;作为一个工厂(所以它应该是静态的)返回一个洗牌的牌。如果你更喜欢对象方法(NO STATIC),那么你应该实现一个Deck类,然后shuffle将意味着改组这个套牌。