单人纸牌(Elevens Lab)活动2:class Deck的初步设计
导言
考虑一副扑克牌。你如何描述它呢?当你打扑克的时候,这些游戏需要一副牌执行什么操作?
探索
现在考虑实现表示扑克牌组的class。描述它的实例变量和method,与同学讨论你的设计。
阅读目录里已经部分完成的class Deck
框架。这个文件包含实例变量以及构造函数和method的签名,这些设计足够通用,可以实现不少扑克游戏。与同学讨论class Deck
,尤其要确保你理解Deck
构造函数中每个参数以及每个private
实例变量所扮演的角色。
练习
- 完成
class Deck
的实现,编写以下这些部分:Deck
构造函数——其接受三个数组作为参数。数组们分别包含牌组中每张卡片的大小、花色和点数值。构造函数将创建一个ArrayList
,之后创建每张卡片并将其加入到列表中。
例如,当rank = {"A", "B", "C"}, suits = {"Giraffes", "Lions"}, values = {2, 1, 6}
时,构造函数会创建以下这些牌:
["A", "Giraffes", 2], ["B", "Giraffes", 1], ["C", "Giraffes", 6], ["A", "Lions", 2], ["B", "Lions", 1], ["C", "Lions", 6]
并把它们添加到ArrayList cards
中。参数size
会被设为cards
的大小,在这个例子中是6
。
最后,构造函数会通过调用shuffle
method来洗牌。你会在活动4中实现shuffle
。isEmpty
——该方法在Deck
大小为0
时返回true
,否则返回false
。size
——该方法返回牌组中剩余待发牌的张数。deal
——该方法“发”一张牌,即牌组中还有余牌的话,将一张牌从deck
中移除并返回。牌组为空时返回null
。实现这个任务有好几种方案。两种可能的算法是:
算法1:因为扑克牌存放在ArrayList
中,可以调用List
的根据索引移除并返回元素的method。
这时,从列表尾部删除元素会比从头部删除更有效率。注意使用这种算法还需要额外的“弃牌”列表来追踪已发出的牌。这是为了在最后可以重新把已发出的牌洗到牌组中并再次发牌。
算法2:将扑克牌保留在列表中会更加有效率。不用直接移除牌,而是单纯减小size
并将其作为索引来返回对应的牌。在这个算法中,size
有双重作用,既决定了发的是哪张牌,又表示了牌组中剩余的牌数。这是你应当实现的算法。
- 在完成
class Deck
之后,找到同一目录中的DeckTester.java
,利用其main
method来创建三个Deck
的object,并测试它们的每个method。
问题
- 用你自己的话来解释
deck
和card
间的关系。 - 思考用下列语句初始化的牌组。牌组里有多少张牌?
String[] ranks = {"jack", "queen", "king"};
String[] suits = {"blue", "red"};
int[] pointValues = {11, 12, 13};
Deck d = new Deck(ranks, suits, pointValues);
- 名为二十一点的扑克游戏使用除去大小王的52张扑克牌。大小从A(最大)到2(最小)。花色和其他类似的游戏一样有黑桃、红桃、方块、梅花。JKQ的点数记为10,A的点数记为11,2-10的点数记为2-10。提供适当的
ranks
,suits
和pointValues
,让
Deck d = new Deck(ranks, suits, pointValues);
能够初始化二十一点的游戏牌组。 ranks
,suits
和pointValues
数组中元素的顺序重要么?
1 条评论
AP计算机科学实验:单人纸牌(Elevens Lab) – AP Computer Science · 2018年5月14日 下午3:18
[…] 活动2:class Deck的初步设计 […]