• 边学边记——ArrayList的使用示例☞扑克牌


    目录

    如想了解并学习顺序表,请查阅:ArrayList(顺序表)的介绍及自我实现(包括ArrayList如何扩容)

    一.题目要求

    二.解题思路

    1.扑克牌类(Card)

    2.操作扑克牌类(TestCard)

    (1).初始化

    (2).洗牌

    (3).发牌

    (4).收牌

    三.具体代码

    1.扑克牌类(Card)

     2.操作扑克牌类(TestCard)

    四.运行截图

    1.测试

    2.操作扑克牌


    如想了解并学习顺序表,请查阅:ArrayList(顺序表)的介绍及自我实现(包括ArrayList如何扩容)

    一.题目要求

            我们学习了顺序表ArrayList之后,那我们具体如何在实际中运用起来这个结构呢?

            有如下问题:在日常生活中,我们都玩过扑克牌,那现在能否自己定义一个扑克牌类,并实现4个人玩扑克牌这样的操作(包括发牌,洗牌,展示牌)?

    二.解题思路

    1.扑克牌类(Card)

            先定义一个扑克牌类(Card),其中包括两个属性:数值范围(rank(1~13)代表A~K),花色(suit);还包括重写的toString方法和数值转换方法(因为在扑克牌中没有1,11,12,13,要将这几个数字转换成A,J,Q,K)。

    2.操作扑克牌类(TestCard)

    (1).初始化

            首先要初始化一副牌,我们可以将其定义为一个顺序表ArrayList,其中的元素为Card,然后通过遍历的方式,把所有花色和数字的牌都添加到这副牌中,就是初始化完成了。

    (2).洗牌

            现在,在这副牌中所有牌都是按顺序的,所以在给玩家发牌之前我们要先进行洗牌操作,可以通过官方定义好的shuffle方法完成洗牌操作。

    四名玩家也是分别用四个顺序表来表示,表中存储的牌即代表他们手中的牌。

    (3).发牌

    利用顺序表中的remove和add方法,将牌堆中的牌发给玩家。

    (4).收牌

    利用addAll和clear方法,将牌返还牌堆,并将玩家手中的牌清空。

    最后,结合洗牌,发牌,收牌操作,完成操作扑克牌。

    三.具体代码

    1.扑克牌类(Card)

    1. public class Card {
    2. private int rank; //值1->13 代表A->k
    3. private String suit; //花色♥、♣、♦、♠
    4. public Card(String suit,int rank) {
    5. this.suit = suit;
    6. this.rank = rank;
    7. }
    8. @Override
    9. public String toString() {
    10. return String.format("扑克[%s %s]",this.suit,rankStr());
    11. }
    12. private String rankStr(){
    13. if(rank==1){
    14. return "A";
    15. }
    16. else if(rank>=2&&rank<=10){
    17. return String.valueOf(rank);
    18. }else if(rank==11){
    19. return "J";
    20. }else if(rank==12){
    21. return "Q";
    22. }else{
    23. return "K";
    24. }
    25. }
    26. //用于测试
    27. public static void main(String[] args) {
    28. Card card = new Card("♥", 11);
    29. System.out.println(card); // card.toString()
    30. }
    31. }

     2.操作扑克牌类(TestCard)

    为了方便理解,这里有些名称使用了中文,如有需要可以自己进行更改。

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. import java.util.Collections;
    4. public class TestCard {
    5. public static void main(String[] args) {
    6. // 定义一副牌,元素是 Card 对象
    7. List 一副牌 = new ArrayList<>();
    8. // 这副牌现在的空的(empty)
    9. // 初始化这副牌,一共 52 张
    10. String[] 所有的花色 = { "♥", "♠", "♦", "♣" };
    11. // 遍历所有的花色
    12. for (String suit : 所有的花色) { // 循环 4 次
    13. // 遍历 A -> K
    14. for (int rank = 1; rank <= 13; rank++) { // 循环 13 次
    15. // 定义一张牌
    16. Card card = new Card(suit, rank); // 执行 52 次
    17. // 把牌添加到 这副牌中
    18. 一副牌.add(card);
    19. }
    20. }
    21. // 打印
    22. System.out.println(一副牌); // 一副牌.toString()
    23. // 进行洗牌(shuffle)操作,直接使用官方定义的方法
    24. // Collections 和 Collection
    25. // 类似
    26. // Arrays 和 Array 的关系
    27. // Collections 提供了很多方便操作 Collection 的工具方法(静态的)
    28. // Arrays 提供了很多方便操作 数组(Array)的工具方法(静态的)
    29. Collections.shuffle(一副牌);
    30. // 打印,洗牌后
    31. System.out.println("洗牌后:"+一副牌); // 一副牌.toString()
    32. //发牌
    33. //定义四名玩家
    34. List playerA=new ArrayList<>();
    35. List playerB=new ArrayList<>();
    36. List playerC=new ArrayList<>();
    37. List playerD=new ArrayList<>();
    38. //发牌
    39. System.out.println("发牌前:"+一副牌.size());
    40. for (int i=0;i<5;i++){
    41. //按照A->B->C->D发牌
    42. //顺序表的头部就是牌堆顶部
    43. //从顺序表头部取出一张牌->顺序表的头删操作
    44. Card card=一副牌.remove(0);
    45. //发给对应的玩家A
    46. playerA.add(card);
    47. //发牌给B
    48. card=一副牌.remove(0);
    49. playerB.add(card);
    50. //发牌给C
    51. card=一副牌.remove(0);
    52. playerC.add(card);
    53. //发牌给D
    54. card=一副牌.remove(0);
    55. playerD.add(card);
    56. }
    57. System.out.println("发牌后:"+一副牌.size());
    58. //分别打印每个人手中的牌
    59. System.out.println(playerA);
    60. System.out.println(playerB);
    61. System.out.println(playerC);
    62. System.out.println(playerD);
    63. //收牌
    64. 一副牌.addAll(playerB);
    65. playerB.clear();
    66. 一副牌.addAll(playerB);
    67. playerB.clear();
    68. 一副牌.addAll(playerB);
    69. playerB.clear();
    70. 一副牌.addAll(playerB);
    71. playerB.clear();
    72. System.out.println(一副牌);
    73. System.out.println("收完牌:"+一副牌.size());
    74. Collections.shuffle(一副牌);
    75. System.out.println(一副牌);
    76. }
    77. }

    四.运行截图

    1.测试

    2.操作扑克牌

    由于截图无法左右滚动,未显示完全。

    如有建议或想法,欢迎一起讨论学习~

  • 相关阅读:
    英国访问学者出境前推荐书籍有哪些?
    【OpenVINO™】使用OpenVINO™ C# API 部署 YOLO-World实现实时开放词汇对象检测
    Simplify Calculations with Formulas
    HDD-FAT32 ZIP-FAT32 HDD-FAT16 ZIP-FAT16 HDD-NTFS
    R语言使用timeROC包计算无竞争情况下的生存资料多时间AUC值、使用cox模型、并添加协变量、可视化无竞争情况下的生存资料多时间ROC曲线
    驱动day4作业
    如何理解springboot的自动注入
    go gorm查询表名缓存问题,分表动态查询处理
    three.js之访问几何体数据与几何体的旋转平移
    git使用
  • 原文地址:https://blog.csdn.net/lil_ghost_/article/details/127357927