2012-05-19 79 views
2

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

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

  1. 完全避免一个LinkedList,只是用一个ArrayList
  2. 使用ArrayList或相似,随机走,然后把内容插入到LinkedList的
  3. 构建一个ArrayList,然后做出自己的洗牌程序(又名不使用随机),增加了,我们去
  4. 洗牌LinkedList的(就像,这不是真的那么坏)LinkedList的

这不是作业;它是帮助有乐趣:)

+1

你为什么要使用一个LinkedList的一副牌?为什么不直接使用ArrayList作为套牌? –

+1

因为您需要绘制第一张牌,并将牌添加到底部。 LinkedLists对此很酷。 – Gyscos

+4

我会完全避免链接列表。使用get/set first/last也是np与其他任何数据类型。而且,因为您需要随机播放,所以链表只适合一个要求 – keyser

回答

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个数据项,除非您做出一些愚蠢的事情,否则会比人们更快。但我的座右铭是:如果简单的作品,坚持简单。

0

如果不洗牌太频繁,也不会慢。

一个重新洗牌的方式是随机置换与另一个的第一张牌。这不是慢与一个LinkedList。另一方面,将其复制到ArrayList或从ArrayList复制它需要一些时间。

+1

转储到数组,排序和转储回链表比使用链表进行排序要快得多。这样,java.util.Collections.sort(List)中的默认实现将转储到一个数组进行排序。 – corsiKa

+0

通过避免需要复制数据而不倾销阵列的速度更快。 “用另一个排列第一张牌”我同意是正确的“洗牌”步骤,但是在一个固定大小的数组中执行两个槽的交换是更少的代码,并且比链接列表更快。而且你甚至可能在第一次尝试时就编码。 –

2

的一点想法:

cards[] = {1, 1, 1, 1, 2, 3, 4, 5, 6, 6},其中1 =“江湖”,2 =“得出四点”,或者你有什么。

在我看来,使用数组(列表)将使它最容易这样做。这里的区别是使用阵列的来玩游戏,而不是他们的密钥来确定卡是什么。

如果你愿意,你可以用对象做同样的事情;您基于数组索引对数组进行混洗,但使用数组中的值(表示卡的对象)知道卡实际是什么。

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

+0

我们不是在谈论任意删除;只从列表顶部清除。另外,你最后两段很混乱,只是重复一些应该相当明显的事情。 – Riking