你如何洗牌非标准牌?

时间:2012-05-19 16:01:54

标签: java

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

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

  1. 完全避免使用LinkedList,只使用ArrayList
  2. 使用ArrayList或类似的,shuffle,然后将内容放入LinkedList
  3. 构建一个ArrayList,然后制作我自己的洗牌例程(又名不使用Random),在我们去的时候添加到LinkedList
  4. 无论如何都要对LinkedList进行随机播放(例如,它并不是那么糟糕)
  5. 这不适合做作业;它是为了帮助玩得开心:)

3 个答案:

答案 0 :(得分: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个数据项,除非你做了一些非常愚蠢的事情,否则它会比人们快。但我的座右铭是:如果简单的工作,坚持简单。

答案 1 :(得分:2)

一些想法:

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

在我看来,使用数组(列表)会让它变得最容易。这里的区别在于使用数组的来进行游戏,而不是使用来确定卡片的内容。

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

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

答案 2 :(得分:0)

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

一种洗牌的方法是随机地将第一张卡与另一张卡进行置换。对于LinkedList,这不是 慢。另一方面,将它复制到ArrayList或从ArrayList复制它需要一些时间。

相关问题