【问题标题】:Assign random class object (image) to ImageView将随机类对象(图像)分配给 ImageView
【发布时间】:2022-01-10 18:02:55
【问题描述】:

我正在开发一款基于更高胜率的纸牌游戏。 从我在这里assign int value to image for compare 的第一个问题开始,我已经重写了我的代码,但现在我被卡在卡片的随机化和分配给 ImageView 上。

我有一张班级卡片。

public class Card{
private int cardValue;
@DrawableRes
private int image;

public Card(int cardValue, @DrawableRes int image){
    this.cardValue = cardValue;
    this.image = image;
}

public int getCardValue()
{
    return cardValue;
}
@DrawableRes
public int getCardImage()
{
    return image;
}

//Cards
Card ash = new Card(20, R.drawable.ash_card);
Card atlas = new Card(23, R.drawable.atlas_card);
Card banshee = new Card(14, R.drawable.banshee_card);
and so on....

在 MainActivity 中: 我有很多这样的卡片:

//Creating array of the cards
ArrayList<Card> cards = new ArrayList<>();

现在我需要从这个数组中随机化四张牌,并将每张牌分配给 IV。

 final Random random1 = new Random();
 //Generate random indexes for cards
 int RandomCard1 = random1.nextInt(cards.size());
 int RandomCard2 = random1.nextInt(cards.size());
 int RandomCard3 = random1.nextInt(cards.size());
 int RandomCard4 = random1.nextInt(cards.size());
 //Generate the card from RandomCard
 Card drawableCard1 = cards.get(RandomCard1);
 Card drawableCard2 = cards.get(RandomCard2);
 Card drawableCard3 = cards.get(RandomCard3);
 Card drawableCard4 = cards.get(RandomCard4);

我正在使用它,因为我为每张卡片设置了翻转动画(也许有更好的方法,但它对我有用)。所以现在我只需要给 IV 分配一张卡片,但这不起作用。

//Deal my cards
card1.setImageResource(drawableCard1);
card2.setImageResource(drawableCard2);
card3.setImageResource(drawableCard3);
card4.setImageResource(drawableCard4);

我不能将 setImageResource 用于类对象。我已经被困在这里好几天了,试图弄清楚但没有运气。我应该以不同的方式进行随机化(例如,使用 Collections.shuffle?)。或者有什么办法吗? 谢谢。

【问题讨论】:

    标签: java android


    【解决方案1】:

    你实际上有两个不同的问题:
    最简单的是您的卡片没有显示,因为 setImageResource 需要代表资源 ID 的 int 作为参数,您只需要调用:

    //Deal my cards
    card1.setImageResource(drawableCard1.getCardImage());
    card2.setImageResource(drawableCard2.getCardImage());
    card3.setImageResource(drawableCard3.getCardImage());
    card4.setImageResource(drawableCard4.getCardImage());
    

    现在,如果用户界面设置正确,您将看到图像。

    第二个问题(我不知道这是否是预期行为)是某些卡片可能会重复给出,因为算法只会在边界内生成一个数字并且可能会发生重复。
    正如您所建议的那样,一个可能的解决方案是在开始时在牌组上使用Collections.shuffle(),这样它就可以模拟最初的牌组洗牌,并按照它们在洗牌牌组中包含的确切顺序开始处理牌。

    如何发牌
    目前,如果我们认为我们的牌组是Card 对象中的整个List,那么庄家挑选下一张牌的方式是在牌组(列表)的任何位置选择一张随机牌并放置它在桌子上(例如)。这个想法可以通过从牌组中移除选中的牌来扩展(目前尚未实现),但发牌方式不能代表现实中发生的情况。
    解决方案
    解决方案是在游戏开始时洗牌 (Collections.shuffle()) 并按照它们在列表中的确切顺序开始挑选卡片。其实既然已经洗牌了,庄家可以挑0-th,1-st,2-nd 等卡并将它们放在桌子上(或将它们交给玩家)。在这种情况下,不需要Random 对象。可以实现一个简单的循环来选择庄家将选择的下一张牌。

    【讨论】:

    • 您好,谢谢您的回答!可悲的是,在此之后我的应用程序崩溃了。我发现,问题出在这一行: int RandomCard5 = random2.nextInt(cards.size());我收到一个错误 IllegalArgumentException: bound must be positive,这意味着cards.size 是空的。我重新检查了所有对象,一切都应该返回正确的图像。现在我很困惑,如果我在 Card 类或 MainActivity 中缺少某些东西,为什么它会返回零。
    • 嗨@Sandman,我昨天测试了你的代码,它正在使用这个修复程序。您是否在生成随机整数之前将卡片添加到列表中?
    • 该死,我不应该在编码的时候,感觉 sic。将卡片添加到列表中是什么意思?我知道这是一个愚蠢的问题,但我认为当定义 ArrayList 时: ArrayList cards = new ArrayList();它需要我在 Card 类中创建的对象(Card ash = new Card(20, R.drawable.ash_card); 等等......)。我必须在 MainActivity 中手动添加它吗?因为像cards.add(ash);不管用。我错过了一些明显的东西吗?谢谢。
    • 当您创建一个完全为空的new ArrayList 时,您需要的所有内容都必须添加到其中。 &lt;&gt; 之间的Card 表示它将包含Card 类型的对象。现在要将ash 添加到您必须执行list.add(ash) 的列表中。您可以在 MainActivity 或任何合适的地方进行。也许添加不起作用,因为您必须在要添加它们的同一类中实例化对象。尝试在 MainActivity 中创建卡片。我建议在 Internet 上搜索有关如何在 Java 中使用数据结构的信息,因为它们对您正在做的事情很有用。没问题。
    • 该死,你说得对,对象必须在 MainActivity 中,它现在可以工作了,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多