模拟斗地主洗牌发牌
Posted snoopy-gjt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟斗地主洗牌发牌相关的知识,希望对你有一定的参考价值。
(一)案例介绍:
按照斗地主的规则,完成洗牌发牌的动作。
具体规则:
1.组装54张扑克牌
2.将54张扑克牌的顺序打乱
3.三个玩家参与游戏,三人交替摸牌,没人17张牌,最后三张留作底牌。
4.查看三人各自手中的牌(按照牌的大小排序)、底牌
手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
(二)案例需求分析
1.准备牌
完成数字与牌的映射关系
使用双列Map(HashMap)集合,完成一个数字与字符串字牌的对应关系(相当于一个字典)。
2.洗牌
通过数字完成洗牌发牌
3.发牌
将每个人以及底牌设计为ArrayList,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。
存放的过程中要求数字大小与斗地主规则的大小对应。
将代表不同字牌的数字分配给不同的玩家与底牌。
4.看牌
通过Map集合找打对应字符展示。
通过查询字牌与数字的对应关系,由数字转成纸牌字符串再进行展示。
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.HashMap; 4 import java.util.TreeSet; 5 6 public class Porker { 7 8 public static void main(String[] args) { 9 //声明一个索引用于存储牌 10 int index = 0; 11 //声明花色集合 12 String [] color = {"方块","红桃","梅花","黑桃"}; 13 //声明牌数字集合 14 String [] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; 15 //创建一个集合用于存储54张牌 16 HashMap<Integer, String> SumPorker = new HashMap<Integer, String>(); 17 for (String c : num) { 18 for (String n : color) { 19 String value = n + c; 20 SumPorker.put(index, value); 21 index++; 22 } 23 } 24 //添加大小王 25 SumPorker.put(index++, "Lk"); 26 SumPorker.put(index, "BK"); 27 printporker(SumPorker); 28 //创建一个集合,存储54张牌的序号 29 ArrayList<Integer> SPindex = new ArrayList<Integer>(); 30 for (int i = 0; i < 54; i++) { 31 SPindex.add(i); 32 } 33 //打乱牌--洗牌 34 Collections.shuffle(SPindex); 35 //新建3个玩家和一个底牌,即TreeSet集合 36 TreeSet<Integer> play_1 = new TreeSet<Integer>(); 37 TreeSet<Integer> play_2 = new TreeSet<Integer>(); 38 TreeSet<Integer> play_3 = new TreeSet<Integer>(); 39 TreeSet<Integer> endPorker = new TreeSet<Integer>(); 40 for (int i = 0; i < SPindex.size(); i++) { 41 if (i>=SPindex.size()-3) 42 endPorker.add(SPindex.get(i)); 43 else if(i%3 == 1) 44 play_3.add(SPindex.get(i)); 45 else if(i%3 ==0) 46 play_2.add(SPindex.get(i)); 47 else 48 play_1.add(SPindex.get(i)); 49 } 50 System.out.println("玩家1:"); 51 END_1(play_1,SumPorker); 52 System.out.println("玩家2:"); 53 END_1(play_2,SumPorker); 54 System.out.println("玩家3:"); 55 END_1(play_3,SumPorker); 56 System.out.println("底牌:"); 57 END_1(endPorker,SumPorker); 58 } 59 //获取洗牌后的牌 60 public static void END_1(TreeSet<Integer> gamer,HashMap<Integer,String> sumHashMap){ 61 for (int i : gamer) { 62 System.out.print(sumHashMap.get(i)+" "); 63 } 64 System.out.println(); 65 } 66 //输出扑克牌 67 public static void printporker(HashMap<Integer, String> SumPorker){ 68 System.out.println("扑克牌:"); 69 for (int i = 0; i < SumPorker.size(); i++) { 70 if (i % 4 == 0) { 71 System.out.println(); 72 } 73 System.out.print(SumPorker.get(i)+" "); 74 } 75 System.out.println(); 76 } 77 78 }
运行结果:
1 扑克牌: 2 3 方块3 红桃3 梅花3 黑桃3 4 方块4 红桃4 梅花4 黑桃4 5 方块5 红桃5 梅花5 黑桃5 6 方块6 红桃6 梅花6 黑桃6 7 方块7 红桃7 梅花7 黑桃7 8 方块8 红桃8 梅花8 黑桃8 9 方块9 红桃9 梅花9 黑桃9 10 方块10 红桃10 梅花10 黑桃10 11 方块J 红桃J 梅花J 黑桃J 12 方块Q 红桃Q 梅花Q 黑桃Q 13 方块K 红桃K 梅花K 黑桃K 14 方块A 红桃A 梅花A 黑桃A 15 方块2 红桃2 梅花2 黑桃2 16 Lk BK 17 玩家1: 18 红桃4 方块5 红桃5 梅花5 方块6 红桃7 梅花9 黑桃9 方块10 方块Q 红桃Q 梅花K 方块A 红桃A 梅花A 红桃2 BK 19 玩家2: 20 黑桃3 黑桃4 梅花7 黑桃7 方块8 梅花8 方块9 红桃9 红桃10 梅花10 黑桃10 黑桃J 黑桃Q 方块K 黑桃K 梅花2 黑桃2 21 玩家3: 22 方块3 红桃3 梅花3 方块4 梅花4 红桃6 梅花6 黑桃6 方块7 红桃8 黑桃8 红桃J 梅花J 红桃K 黑桃A 方块2 Lk 23 底牌: 24 黑桃5 方块J 梅花Q
以上是关于模拟斗地主洗牌发牌的主要内容,如果未能解决你的问题,请参考以下文章