我刚接触 Dart;然后,我创建了一个名为Deck的扑克牌对象列表。我想选择一张随机的牌,然后从牌库中删除该牌。但是,由于在缩小牌库之前可能会先选择后续的牌,导致我得到了重复的牌。如果我想从牌库中选出10张独特的随机牌,我应该如何处理?
class Card{
String face;
String suit;
String rank;
String imgSrc;
String holdImgSrc;
Card(
this.face,
this.suit,
this.rank,
this.imgSrc,
this.holdImgSrc
);
}
import 'dart:math' show Random;
Random indexGen = new Random();
getCard1(){
card1 = deck[indexGen.nextInt(deck.length)];
deck.removeWhere((item) => item == card1);
return card1;
}
getCard2(){
card2 = deck[indexGen.nextInt(deck.length)];
deck.removeWhere((item) => item == card2);
return card2;
}
当我尝试将Card对象作为future返回时,我会得到以下错误提示:
new Future((getCard1()))
.then((getCard2()))
.then((getCard3()));
类型'Card'不是'计算'的类型为'() => dynamic'的子类型。
当我尝试返回牌组列表时,我得到:
类型'List'不是'计算'的类型为'() => dynamic'的子类型。
我是否遗漏了正确的语法、逻辑上的错误或者需要以不同的方式处理列表,例如观察变化?
编辑后添加:Futures语法可行,但删除似乎没有正确地进行。我更改了代码,使用Jim-Y下面建议的代码,除了使用第二个命名构造函数从列表中预加载新的卡对象。改进后的代码和输出如下:
fullDeck[
...
var tenC = new Card.full(17,'10_of_clubs','c','10','10_of_clubs.png','10_of_clubs_h.png');
var tenD = new Card.full(18,'10_of_diamonds','d','10','10_of_diamonds.png','10_of_diamonds_h.png');
var tenS = new Card.full(19,'10_of_spades','s','10','10_of_spades.png','10_of_spades_h.png');
var tenH = new Card.full(20,'10_of_clubs','c','10','10_of_clubs.png','10_of_clubs_h.png');
...]
Deck<Card> deck = new Deck<Card>();
Random indexGen = new Random();
for(var c = 0; c < 20; ++c) {
var card = new Card(c);
deck.add(fullDeck[c]);//List of 52 full card objects
}
for(var i = 0; i < 10; ++i) {
var rnd = indexGen.nextInt(deck.size());
print('${deck.get(rnd).face} Deck size: ${deck.size()}');
}
}
4_of_clubs Deck size: 19
10_of_diamonds Deck size: 18
5_of_clubs Deck size: 17
4_of_spades Deck size: 16
5_of_spades Deck size: 15
10_of_clubs Deck size: 14
10_of_clubs Deck size: 13
3_of_spades Deck size: 12
5_of_diamonds Deck size: 11
3_of_diamonds Deck size: 10
正如您所看到的,十个梅花牌被打印了两次。因此,如果在第6步中删除了10,则为什么在第7步中仍然存在?
getCardX()
使用的card1
和card2
变量是什么? - Günter Zöchbauernew Future(getCard1).then((_)=>getCard2()).then((_)=>getCard3())
。它仍然不会记住已经移除的卡片。 - lrn