用Java从一副牌中随机抽取5张牌

用Java从一副牌中随机抽取5张牌,java,Java,我正在尝试学习Java,我想创建一个非常简单的类,从随机生成的一副牌中随机选择5张牌。我遇到了一些我觉得应该很简单的问题来解决。另外,这是我就读的大学的一个实验室,如果你能在不给我代码块的情况下指导我,那就更好了 这是我收到的错误,我理解我收到它的原因: 表达式的类型必须是数组类型,但已解析为Deck 这是我的密码: public static void main(String[] args) { System.out.println(select(5)); } public stat

我正在尝试学习Java,我想创建一个非常简单的类,从随机生成的一副牌中随机选择5张牌。我遇到了一些我觉得应该很简单的问题来解决。另外,这是我就读的大学的一个实验室,如果你能在不给我代码块的情况下指导我,那就更好了

这是我收到的错误,我理解我收到它的原因:

表达式的类型必须是数组类型,但已解析为Deck

这是我的密码:

public static void main(String[] args) {
    System.out.println(select(5));
}

public static Card[] select(int k)
{
    Random rand = new Random(52);
    Deck deck = new Deck(52);
    Card[] hand = new Card[5];
    for (int j = 0; j < 5; j += 1)
    {
        int index = rand.nextInt(52-j);
        hand[j] = deck[index];
    }
    return hand;
}
publicstaticvoidmain(字符串[]args){
System.out.println(选择(5));
}
公共静态卡[]选择(整数k)
{
随机随机数=新随机数(52);
甲板=新甲板(52);
卡片[]手=新卡片[5];
对于(int j=0;j<5;j+=1)
{
国际指数=兰特·奈克斯汀(52-j);
手[j]=甲板[索引];
}
回手;
}
java和Card.java课程是由我的讲师提供的(他在实验期间不在)

我最近还意识到这段代码并不能满足我的要求,但是我仍然需要找出上面的错误。如果你想帮助解决我的另一个问题,请随时回答我下面的解释,但这不是我来这里的原因

我想随机选择5张牌。假设一张随机选择的卡片位于我的牌组对象的索引27处。然后我想把这张卡片移动到索引51,重复4次。这样,我的牌组对象的最后五张牌都是随机选择的,不可能选择两次。我认为最简单的方法(我还没有尝试过)是创建一个变量来保存我的一个组索引的值,这样我就可以交换它们了。你们谁会同意

非常感谢您的帮助

你应该这样做

int index = (52 -rand.nextInt(51)+1);
您还需要一个
52的
Deck[]

  Deck[] deck = new Deck[52];
  for(i to 52)
  //Initalize deck[i] here 
  end.
  Now you can access like deck[index]
我认为使用
enum
可以更好地实现
Card
游戏

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

// This is just sample example  and it is just to show an approach. I had not enough time    to make code perfect but it works fine.
public enum Deck
{
DECK;
enum Rank
{
    DEUCE(2), THREE(3), FOUR(4), FIVE(5), SIX(6),
    SEVEN(7), EIGHT(8), NINE(9), TEN(10), JACK(10), QUEEN(10), KING(10), ACE(11);

    Rank(int rank)
    {
        this.rank = rank;
    }

    private final int rank;

}

enum Type
{
    SPADES,
    HEARTS,
    DIAMONDS,
    CLUBS;
}

class Card
{
    private final Rank rank;
    private final Type type;

    Card(Rank rank, Type type)
    {
        this.rank = rank;
        this.type = type;
    }

    @Override
    public String toString()
    {
        return type.name() + rank.name();
    }

}

static List<Deck.Card> cards = new ArrayList<Deck.Card>();
static
{
    for (Rank rank : Deck.Rank.values())
    {
        for (Type type : Deck.Type.values())
        {
            cards.add(DECK.new Card(rank, type));
        }
    }

}

List<Deck.Card> shuffle()
{
    Collections.shuffle(cards);//Once it is shuffled you can use it to draw first five cards same way we play
    System.out.println(cards);
    System.out.println(cards.size());
    return Collections.unmodifiableList(cards);
}

public static void main(String[] args)
{
    DECK.shuffle();
}
}
import java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
//这只是一个示例,只是为了展示一种方法。我没有足够的时间来完善代码,但它工作得很好。
公共枚举组
{
甲板
枚举秩
{
平分(2)、三(3)、四(4)、五(5)、六(6),
七(7)、八(8)、九(9)、十(10)、杰克(10)、女王(10)、国王(10)、王牌(11);
秩(整数秩)
{
这个.等级=等级;
}
私人最终整数等级;
}
枚举类型
{
黑桃,
心,
钻石,
俱乐部;
}
班级卡
{
私人最终职级;
私有最终类型;
卡片(等级、类型)
{
这个.等级=等级;
this.type=type;
}
@凌驾
公共字符串toString()
{
返回类型.name()+秩.name();
}
}
静态列表卡=新的ArrayList();
静止的
{
for(秩:Deck.Rank.values())
{
对于(类型:Deck.Type.values())
{
卡片。添加(卡片组。新卡片(等级,类型));
}
}
}
列表洗牌()
{
收集。洗牌(牌);//洗牌后,你可以用它来抽前五张牌,方法和我们玩的一样
系统输出打印项次(卡片);
System.out.println(cards.size());
返回收款。不可修改列表(卡片);
}
公共静态void main(字符串[]args)
{
洗牌();
}
}

您将您的
deck
作为类
deck
的引用,指向一个实例:-

Deck deck = new Deck(52);
因此,您不能在类似索引的数组上访问它:-

deck[index];  // Cannot do this on a reference pointing to object of `Deck`
我认为您可能需要在类中提供一些方法,比如
get(index)
,并像这样访问它:-
deck.get(index)

或可能是您想将您的
甲板
声明为:-

Deck[] deck = new Deck[52];
然后(
deck[index]
)就可以工作了。

公共静态卡[]选择(int k)
public static Card[] select(int k)
{
  Random rand = new Random(52); // mistake 1
  Deck deck = new Deck(52);     // mistake 2
  Card[] hand = new Card[5];
  for (int j = 0; j < 5; j += 1)
  {
    int index = rand.nextInt(52-j);
    hand[j] = deck[index];     // mistake 2
  }
  return hand;
}
{ Random rand=新随机数(52);//错误1 甲板=新甲板(52);//错误2 卡片[]手=新卡片[5]; 对于(int j=0;j<5;j+=1) { 国际指数=兰特·奈克斯汀(52-j); 手牌[j]=牌组[index];//错误2 } 回手; }
错误1:不要使用常量初始化
随机
。这将使伪随机序列始终完全相同

错误2:要么您的声明
Deck
错误,要么您尝试访问
Deck[index]
的方式错误,因为
Deck
未声明为数组。由于
Deck
是一个表示卡片集合的类,因此更符合逻辑的罪魁祸首是后一行。更改为调用适当的
Deck
方法


如果不知道
Deck
的实现,就不可能知道正确的代码。如果
牌组
本质上是一副随机的牌组,那么你应该只选前5张。如果它是完全分类的(我应该补充说,这不是一个真实的牌组),那么你需要从中随机挑选牌。
Deck
类至少应该有一个
remove
方法,该方法将立即解决您的重复问题。

在牌上洗牌并拾取,这比使用随机选择要好,因为会有重复的机会,但如果使用洗牌,则不会。您可以使用
Collections#shuffle

来添加前面提到的其他建议

Card[] hand = new Card[5]; 
应该读

Card[] hand = new Card[k]; 
对于for循环也是如此:

for (int j = 0; j < 5; j += 1) 
for(int j=0;j<5;j+=1)
应该读

for (int j = 0; j < k; j += 1)
for(int j=0;j
您的问题很难理解。你到底在问什么?如果你发布了一些你不想被回答的问题,那就很混乱了。最好不要在你的问题中包含这一部分。把你的问题贴出来,说清楚就行了。作为旁白,问问你的老师他课堂上的理由。甲板d=新甲板(52)对我来说没有多大意义。我能得到什么?