首页 > 技术文章 > 简单斗地主实现

kushulaoya 2021-03-02 18:16 原文

  1 import java.util.*;
  2 
  3 /*
  4    4人斗地主
  5     分析:
  6         1.斗地主首先要有一副牌,用什么定义一副牌,牌又有那些种类比如花色和符号
  7         2.牌的顺序是乱的,怎么让他变乱序的
  8         3.最后会留下三张归地主所有
  9         4.个人会整理牌,如何使用Java实现
 10     实现:
 11           初始化牌即生成一副扑克牌
 12         1.一副牌,相当于一个集合,集合的顺序是乱的,使用HashMap集合,键是编号,值是牌
 13         2.一共52张牌,52个号,使用ArrayList集合
 14         3.创建牌的花色和点数数组
 15         4.从0开始向HashMap里存入编号,储存对应的牌,向Arraylist集合中存储编号
 16           洗牌动作
 17         5.以上步骤是初始化生成的牌,接下来要进行洗牌动作,洗牌就是打乱顺序,也就是打乱编号
 18           可以使用Collections的shuffle方法来实现
 19           发牌动作
 20         6.发牌即为给每个人发编号,为保证编号是排序的,创建TreeSet集合用来接受变好
 21           个人看牌
 22         7.因为总人数是固定的,且程序需要的功能就是可以自己看到个人牌,不同人的牌是不一样的
 23           可以定义一个方法来实现看牌的过程
 24         8.直接调用方法显示个人获得牌
 25  */
 26 public class CollectionTest01 {
 27     public static void main(String[] args) {
 28         //创建HashMap集合用来存放牌的编号和牌的花色点数
 29         HashMap<Integer, String> hashMap = new HashMap<Integer, String>();
 30         //创建ArrayList集合用来存储编号
 31         ArrayList<Integer> list = new ArrayList<Integer>();
 32         //生成花色和点数,花色即4种,点数13种
 33         String[] colors = {"♦", "♣", "♥", "♠"};
 34         String[] numbers = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
 35         //从0开始向HashMap集合中添加编号
 36         int index = 0;
 37         //使用增强for循环来进行添加操作,因为我们是要对点数进行排列所以先进行点数的循环
 38         for (String number : numbers) {  //String color : colors
 39             for (String color : colors) {  //String number : numbers
 40                 //将编号即键和值即花色点数添加到HashMap集合中
 41                 hashMap.put(index, color + number);
 42                 //将编号添加到ArrayList集合中
 43                 list.add(index);
 44                 //编号加一
 45                 index++;
 46             }
 47         }
 48         //两张特殊的牌大王小王
 49         hashMap.put(index, "小王");
 50         //同理编号添加到ArrayList集合中
 51         list.add(index);
 52         //编号加一
 53         index++;
 54         hashMap.put(index, "大王");
 55         //同理编号添加到ArrayList集合中
 56         list.add(index);
 57         // 洗牌   使用Collections中shuffle方法,随机排列编号,
 58         Collections.shuffle(list);
 59         // 创建接受对象,使用treeset集合自动排序
 60         TreeSet<Integer> aaaaa = new TreeSet<Integer>();
 61         TreeSet<Integer> bbbbb = new TreeSet<Integer>();
 62         TreeSet<Integer> ccccc = new TreeSet<Integer>();
 63         TreeSet<Integer> ddddd = new TreeSet<Integer>();
 64         // 创建底牌对象,即最后三张牌,需展示
 65         TreeSet<Integer> dipai = new TreeSet<Integer>();
 66         // 进行发牌动作,循环遍历集合list
 67         for (int i = 0; i < list.size(); i++) {
 68             // 创建新对象获取索引值编号
 69             int x = list.get(i);
 70             //判断最后三张牌
 71             if (i >= list.size() - 3) {
 72                 // 将对应的索引值添加到底牌集合中
 73                 dipai.add(x);
 74                 // 分发牌,有个规律
 75 //                52/4   ==0
 76 //                51/4   ==3  第一个人拿到一张牌
 77 //                50/4   ==2  第二个人拿到一张牌
 78 //                49/4   ==1  第三个人拿到一张牌
 79 //                48/4   ==0  第四个人拿到一张牌
 80 //                47/4   ==3  第一个人拿到二张牌
 81 //                46/4   ==2  第二个人拿到二张牌
 82 //                45/4   ==1  第三个人拿到二张牌
 83                 //依次可推,当余数是0是第四个拿到了牌,简而言之,余数就对应拿牌的人
 84             } else if (i % 4 == 0) {
 85                 aaaaa.add(x);
 86             } else if (i % 4 == 1) {
 87                 bbbbb.add(x);
 88             } else if (i % 4 == 2) {
 89                 ccccc.add(x);
 90             } else if (i % 4 == 3) {
 91                 ddddd.add(x);
 92             }
 93         }
 94         // 调用方法,显示结果
 95         lookPoker("农民1", aaaaa, hashMap);
 96         lookPoker("农民2", bbbbb, hashMap);
 97         lookPoker("农民3", ccccc, hashMap);
 98         lookPoker("农民4", ddddd, hashMap);
 99         lookPoker("低排有", dipai, hashMap);
100     }
101 
102     // 创建看牌方法,将看派人的姓名,个人拿到的牌集合,牌的集合作为参数
103     private static void lookPoker(String name, TreeSet<Integer> qw, HashMap<Integer, String> hashMap) {
104         // 打印姓名不换行
105         System.out.print(name + " 的牌是 ");
106         // 增强for循环,遍历Treeset集合,获取个人的牌
107         for (Integer key : qw) {
108             // 通过get方法取出在根据键取出对应的值即花色和点数,给到字符串对象
109             String poker = hashMap.get(key);
110             // 不换行打印输出
111             System.out.print(poker + "   ");
112         }
113         // 换行
114         System.out.println();
115     }
116 }

 

推荐阅读