2

我正在制作一个玩 UNO 游戏的程序。在 UNO 牌组中,有些牌是重复的,因此我不能只列出整数列表;我必须使用对象。我计划在牌组中使用 LinkedList,但我知道 LinkedList 上的洗牌速度非常慢。

我的问题是,我应该......

  1. 完全避免使用 LinkedList,只使用 ArrayList
  2. 使用 ArrayList 或类似的,随机播放,然后将内容放入 LinkedList
  3. 构造一个 ArrayList,然后制作我自己的 shuffle 例程(也就是不使用 Random),在我们进行时添加到 LinkedList
  4. 无论如何洗牌LinkedList(如,它并不是那么糟糕)

这不是家庭作业;这是为了帮助玩得开心:)

4

3 回答 3

2

您可以用纯整数表示卡片。如果一个整数代表一种卡牌,而Uno拥有多张相同类型的卡牌,只需多次使用该卡牌对应的整数即可。

洗牌和交易很容易。

要开始游戏,请设置一个固定大小的整数类型的哑数组(不需要应用花哨的链表或 Arraylist),它可以容纳整个牌组(大小 = N)。用表示 Uno 牌组的整数填充此数组,包括表示重复卡片的重复整数。将 UNDEALT 设置为 N。

要随机播放,请执行以下代码一些适度(100?)次:

 1)  Pick a random number from 1 to UNDEALT, R.
 2)  Exchange the the first array slot with the Rth slot.

交易,处理:

 1) Give out the card in the UNDEALT slot.
 2) Decrement UNDEALT.

您也可以使用更高级的数据结构来完成所有这些工作,但没有任何意义。鉴于所涉及的总信息是 100 个数据项,除非你做一些非常愚蠢的事情,否则它会比人快。但我的座右铭是:如果简单有效,就坚持简单。

于 2012-05-19T16:11:26.103 回答
2

一些想法:

cards[] = {1, 1, 1, 1, 2, 3, 4, 5, 6, 6},其中 1 = "Wild",2 = "Draw Four",或者你有什么。

在我看来,使用 Array(List) 会更容易做到这一点。这里的区别在于使用数组的进行游戏,而不是使用它们的来确定卡片是什么。

如果你愿意,你可以对对象做同样的事情;您根据数组索引对数组进行洗牌,但使用数组中的值(表示卡片的对象)来了解卡片的实际含义。

编辑:显然Java会为你洗牌!http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle(java.util.List)

于 2012-05-19T16:19:45.057 回答
0

如果你不经常洗牌,它不会那么慢。

洗牌的一种方法是将第一张牌与另一张牌随机排列。使用 LinkedList并没有那么慢。另一方面,将它复制到/从 ArrayList 将需要一些时间。

于 2012-05-19T16:04:46.670 回答