我正在制作一个玩UNO游戏的程序。在UNO套牌中,有些牌是重复的,因此我不能只列出整数;我必须使用对象。我计划在deck上使用LinkedList,但我知道LinkedList上的shuffle非常慢。
我的问题是,我应该......
这不适合做作业;它是为了帮助玩得开心:)
答案 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)
一些想法:
没有理由坚持使用LinkedList;您可以轻松使用ArrayList获取第一张和最后一张牌。事实上,它似乎是ArrayList's performance is better for removing single elements。
您也可以随机播放具有相同整数的元素数组。如同,没有理由不能将shuffling algorithm用于具有如下所示的数组:
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复制它需要一些时间。