单人纸牌(Elevens Lab)活动2:class Deck的初步设计

陈 欣发布

导言

考虑一副扑克牌。你如何描述它呢?当你打扑克的时候,这些游戏需要一副牌执行什么操作?

探索

现在考虑实现表示扑克牌组的class。描述它的实例变量和method,与同学讨论你的设计。

阅读目录里已经部分完成的class Deck框架。这个文件包含实例变量以及构造函数和method的签名,这些设计足够通用,可以实现不少扑克游戏。与同学讨论class Deck,尤其要确保你理解Deck构造函数中每个参数以及每个private实例变量所扮演的角色。

练习

  1. 完成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有双重作用,既决定了发的是哪张牌,又表示了牌组中剩余的牌数。这是你应当实现的算法。
  2. 在完成class Deck之后,找到同一目录中的DeckTester.java,利用其main method来创建三个Deck的object,并测试它们的每个method。

问题

  1. 用你自己的话来解释deckcard间的关系。
  2. 思考用下列语句初始化的牌组。牌组里有多少张牌?
    String[] ranks = {"jack", "queen", "king"};
    String[] suits = {"blue", "red"};
    int[] pointValues = {11, 12, 13};
    Deck d = new Deck(ranks, suits, pointValues);
  3. 名为二十一点的扑克游戏使用除去大小王的52张扑克牌。大小从A(最大)到2(最小)。花色和其他类似的游戏一样有黑桃、红桃、方块、梅花。JKQ的点数记为10,A的点数记为11,2-10的点数记为2-10。提供适当的rankssuitspointValues,让
    Deck d = new Deck(ranks, suits, pointValues);
    能够初始化二十一点的游戏牌组。
  4. rankssuitspointValues数组中元素的顺序重要么?

陈 欣

AADPS创始人

1 条评论

AP计算机科学实验:单人纸牌(Elevens Lab) – AP Computer Science · 2018年5月14日 下午3:18

[…] 活动2:class Deck的初步设计 […]

发表回复