【发布时间】:2014-05-26 16:02:50
【问题描述】:
我是 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;
}
当我尝试将卡片对象作为未来返回时,我得到:
new Future((getCard1()))
.then((getCard2()))
.then((getCard3()));
'Card' 类型不是 'computation' 的 '() => dynamic' 类型的子类型。
当我尝试返回牌组列表时,我得到:
类型“列表”不是“计算”类型“()=>动态”的子类型。
我是否缺少正确的语法、我的逻辑缺陷,或者我是否需要通过观察变化来以不同的方式处理列表?
编辑添加:期货语法有效,但是,删除似乎没有正确发生。 我将代码更改为下面 Jim-Y 建议的代码,除了使用第二个命名构造函数从 List 预加载新 Card 对象。修改后的代码和打印输出如下:
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
如您所见,Clubs 的 10 被打印了两次。那么,如果 10 在第 6 关中被删除了,为什么它在第 7 关中仍然存在?
【问题讨论】:
-
你在
getCardX()中使用的card1和card2变量是什么 -
它们是卡片对象。列表牌组中充满了卡片对象。
-
您直接调用 getCard1,并使用返回的 Card 对象作为 new Future() 的参数。对于正确的类型,你需要写
new Future(getCard1).then((_)=>getCard2()).then((_)=>getCard3())。它仍然不会记住被移除的卡片。 -
Irn:关于记住卡片,你是正确的。它们被声明为全局变量,但不会更新。未来还有更多的学习曲线:)
标签: dart dart-async