经典案例:模拟斗地主洗牌发牌
案例介绍:按照斗地主的规则,完成洗牌发牌的动作。
案例需求分析:
准备牌:
完成数字与纸牌的映射关系:
使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典)。
洗牌:
通过数字完成洗牌发牌
发牌:
将每个人以及底牌设计为ArrayList<String>,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。
存放的过程中要求数字大小与斗地主规则的大小对应。
将代表不同纸牌的数字分配给不同的玩家与底牌。
看牌:
通过Map集合找到对应字符展示。
通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。
实现步骤:
首先,要修改java文件编码,由GBK修改为UTF-8,因为默认的字符编码GBK没有我们要的梅花、方片、黑桃、红桃(♠♥♦♣)等特殊字符。
下面是具体代码:
package homework0418; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet; public class DoudiZhu { public static void main(String[] args) { //创建一个HashMap集合 HashMap<Integer,String> pokers=new HashMap<Integer,String>(); //创建花色数组 String[] colors= {"黑桃","梅花","方块","红桃"}; //创建点数数组 String[] numbers= {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; //创建一副牌 花色+点数 int count=0; //创建一个存储索引的ArrayList集合 ArrayList<Integer> indexs=new ArrayList<Integer>(); for(String num:numbers) { for(String c:colors) { pokers.put(count, c+num); indexs.add(count); count++; } } indexs.add(0); pokers.put(0, "小王"); indexs.add(1); pokers.put(1, "大王"); //洗牌 Collections.shuffle(indexs); //发牌 //创建四个TreeSet集合分别存储三个人的牌和底牌编号 TreeSet<Integer> zhangsan=new TreeSet<Integer>(); TreeSet<Integer> lisi=new TreeSet<Integer>(); TreeSet<Integer> wangwu=new TreeSet<Integer>(); TreeSet<Integer> bottom=new TreeSet<Integer>(); for(int i=0;i<indexs.size();i++) { if(i<3) { bottom.add(indexs.get(i)); }else if(i%3==0) { zhangsan.add(indexs.get(i)); }else if(i%3==1) { lisi.add(indexs.get(i)); }else if(i%3==2) { wangwu.add(indexs.get(i)); } } //通过索引查看pokers中对应的牌 look("张三",zhangsan,pokers); look("李四",lisi,pokers); look("王五",wangwu,pokers); look("底牌",bottom,pokers); } private static void look(String name,TreeSet<Integer> ts,HashMap<Integer,String> pokers) { System.out.print(name+"的牌是:"); for(int i:ts) { System.out.print(pokers.get(i)+" "); } System.out.println(); } }