image.png
    最好将这种重复代码封装成方法
    image.png

    1. package com.itheima.d4_collection_test;
    2. import javax.swing.plaf.SliderUI;
    3. import java.util.ArrayList;
    4. import java.util.Collections;
    5. import java.util.Comparator;
    6. import java.util.List;
    7. /**
    8. * 功能:
    9. * 1.做牌
    10. * 2.洗牌
    11. * 3.定义三个玩家
    12. * 4.发牌
    13. * 5.排序
    14. * 6.看牌
    15. */
    16. public class GameDemo {
    17. /**
    18. * 1.定义一个静态的集合存储54张牌对象
    19. */
    20. public static List<Card> allCards = new ArrayList<>();
    21. /**
    22. * 2. 做牌:定义静态代码块初始化牌数据 ( 加载类之后,就会加载静态代码块)
    23. * @param args
    24. */
    25. // ( 加载类之后,就会加载静态代码块)
    26. static {
    27. // 3. 定义点数:个数确定,类型确定,使用数组
    28. String[] sizes = {"3","4","5","6","7","8","9","10","J","" +
    29. "Q","K","A","2"};
    30. // 4 定义花色:个数确定,类型确定,使用数组
    31. String[] colors = {"♠","❤","♣","♦"};
    32. // 5. 组合点数和花色
    33. int index = 0; // 记录牌的大小
    34. // 这里可以使用foreach(增强for) 遍历数组 数组名.for
    35. for (String size : sizes) {
    36. index ++ ; // 每遍历一次牌的点数 大小就 + 1
    37. // 数组名.for
    38. for (String color : colors) { // 一个点数,对应虽有的花色(4种)
    39. // 6 封装成一个牌的对象
    40. Card c = new Card(size,color,index); // 每次遍历到的点数和花色都创建一个Card对象
    41. // 7. 存入到集合容器中去
    42. allCards.add(c);
    43. }
    44. }
    45. // 8 .由于大小王特殊没有点数和花色,所以不加入for循环中,单独创建对象
    46. Card c1 = new Card("🃏","",++index); // 没有花色,直接定义为空字符串
    47. Card c2 = new Card("🤡","",++ index); // 先加1 在返回
    48. //使用 Collections工具类的addAll方法将所有对 象加入到集合中去
    49. Collections.addAll(allCards,c1,c2);
    50. System.out.println("新牌:" + allCards); // 写在静态类中,直接加载
    51. }
    52. public static void main(String[] args) {
    53. // 9. 洗牌:
    54. Collections.shuffle(allCards); // 使用Collections工具类的随机排序Api
    55. System.out.println("洗牌后:" + allCards);
    56. // 10. 发牌:(定义三个玩家加,每个玩家的牌也是一个集合容器
    57. List<Card> linhuchong = new ArrayList<>();
    58. List<Card> jiumozhi = new ArrayList<>();
    59. List<Card> renyingying = new ArrayList<>();
    60. // 11. 开始发牌(从牌集合中发出51张牌给三个玩家,剩余三个牌作为底牌)
    61. // allCards = [[♣9, ♦9, ♣K, ♣A, ❤6, ♦K, ♣3, ♦Q, ♣5]
    62. // i 0 1 2 3 4 5 6 // 轮询的方法:对3求余:余数为0,发给第一个人为1发给第二个人
    63. for (int i = 0; i < allCards.size() -3; i++) { // 因为要留三张牌作为底牌所以 长度减三
    64. // 先拿到当前玩家对象
    65. Card c = allCards.get(i);
    66. if (i % 3 == 0){
    67. // 请阿冲接牌
    68. linhuchong.add(c); // 由于把玩家定义为了集合容器(负责接牌的对象)
    69. }else if (i % 3 == 1) {
    70. // 请阿jiu接牌
    71. jiumozhi.add(c);
    72. }else if (i % 3 == 2){
    73. // 请盈盈接牌
    74. renyingying.add(c);
    75. }
    76. }
    77. // 12. 拿到最后三张牌 这里用get方法比较低级low,用高级的sublist方法可以将集合截取
    78. // 参数意思:从倒数第51张牌开始截取(原来总数是54张牌,-3剩54,),一直到最后一张54-- 计算机包前不包后
    79. List<Card> lastThreeCards = allCards.subList(allCards.size() - 3,allCards.size());
    80. // 13. 给玩家的牌排序(从小到大 可以自己先试试怎么实现)
    81. sortCards(linhuchong);
    82. sortCards(jiumozhi);
    83. sortCards(renyingying);
    84. // 14. 输出玩家的牌[♣A, ♣5, ♠3, ❤5, ♦4, ❤2]
    85. System.out.println("阿冲" + linhuchong);
    86. System.out.println("阿jiu" + jiumozhi);
    87. System.out.println("盈盈" + renyingying);
    88. System.out.println("三张底牌" + lastThreeCards);
    89. }
    90. private static void sortCards(List<Card> cards) {
    91. // cards = [♣A, ♣5, ♠3, ❤5, ♦4, ❤2]
    92. Collections.sort(cards, new Comparator<Card>() { // 创建一个比较器,比较cards集合
    93. @Override
    94. public int compare(Card o1, Card o2) {
    95. // o1 = J
    96. // o2 = A
    97. // 知道牌的大小,才可以指定规则
    98. return o2.getIndex() - o1.getIndex(); // 降序
    99. }
    100. });
    101. }
    102. }
    1. package com.itheima.d4_collection_test;
    2. public class Card {
    3. private String size; // 这个是牌的点数
    4. private String color; // 这是牌的花色
    5. private int index; // 牌的真正的大小
    6. public Card() {
    7. }
    8. public Card(String size, String color, int index) {
    9. this.color = color;
    10. this.size = size;
    11. this.index = index;
    12. }
    13. public String getColor() {
    14. return color;
    15. }
    16. public void setColor(String color) {
    17. this.color = color;
    18. }
    19. public String getSize() {
    20. return size;
    21. }
    22. public void setSize(String size) {
    23. this.size = size;
    24. }
    25. public int getIndex() {
    26. return index;
    27. }
    28. public void setIndex(int index) {
    29. this.index = index;
    30. }
    31. // 重写一个toString方法,让他打印内容
    32. @Override // 在开发中不一定会用默认给的toString方法的格式
    33. public String toString() {
    34. return size + color; // 直接返回点数和花色
    35. }
    36. }