黑马程序员技术交流社区

标题: 斗地主 洗牌 发牌 复习, 有注释. [打印本页]

作者: java小白怕不    时间: 2016-6-12 21:54
标题: 斗地主 洗牌 发牌 复习, 有注释.
为了复习老师前两天讲的课程
对于想看的同学  有漏掉的 望大神们补充



import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;


/*
* 斗地主洗牌发牌案例
*    1:准备54张牌(每张牌由花色和数字组成)
*      1.1:创建  花色集合  用来存放花色   ♦,♣,♥,♠
*      1.2:创建  数字集合  用来存放数字  3,4,5,6,7,8,9,10,J,Q,K,A,2
*      1.3:创建一个 双列集合 存牌 每张牌 对应一个编号  HashMap<Integer,String>  编号是键  牌面是值
*      1.4:组装牌
*         先遍历数字   再遍历 花色  
*           3  
*              ♦3 ♣3 ♥3 ♠3
*           4  
*              ♦4 ♣4 ♥4 ♠4
*           5  
*              ♦5 ♣5 ♥5 ♠5
*          组合完成 牌面 存到map集合  并且 给对应的编号 0   1   2   3
*         
*         添加大小王
*         2:洗牌  
*            public static void shuffle(List<?> list)        //打乱元素顺序
*            2.1 创建ArrayList<Integer>集合 用来存储 0~53编号,添加编号到集合中
*            2.2 把集合随机打乱  
*         
*         3:发牌:
*          3.1 创建玩家1,玩家2,玩家3,底牌,存储牌的编号 ArrayList<Integer>
*          3.2 依次发编号给玩家1,玩家2,玩家3  与 底牌
*          3.3 对3个玩家的集合进行排序
*          3.4 创建玩家1,玩家2,玩家3 和 底牌的 牌面集合 ArrayList<String>
*          3.5 通过map集合牌与编号的对应关系,使用编号 找到对应的牌  ,把牌存储到对应的玩家集合中
*         
*         4:看牌
*/
public class PokeXueXi {

        public static void main(String[] args) {
                // 1.1:创建  花色集合  用来存放花色   ♦,♣,♥,♠
                ArrayList<String> colors = new ArrayList<String>();
                Collections.addAll(colors, "♦", "♣", "♥","♠");
                //System.out.println(colors);
               
                //1.2:创建  数字集合  用来存放数字  3,4,5,6,7,8,9,10,J,Q,K,A,2
                ArrayList<String> numbers = new ArrayList<String>();
                //使用全部储存方式  Collections.addAll 储存的是 每个字符串.
                Collections.addAll(numbers, "3","4","5","6","7","8","9","10","J","Q","K","A","2");
                //1.3:创建一个 双列集合 存牌 每张牌 对应一个编号  HashMap<Integer,String>  编号是键  牌面是值
                HashMap<Integer, String> poker = new HashMap<Integer, String>();
                //创建一个序号
                int index = 0;
                //对数字进行遍历
                for (String number : numbers) {
                        //对花色进行遍历
                        for (String color : colors) {
                                //用每次遍历的花色与数字相加  每种数字四种花色 所以 花色在嵌套循环里
                                String zuHe= color + number;
                                //使用双列集合 put获取 序号与花色和数字相结合的 字符
                                poker.put(index, zuHe);
                                //每次 序号用一次 自增一次每张牌的序号要不用
                                index++;
                               
                               
                        }
                }
                //添加大小王
                poker.put(index++, "小王");
                poker.put(index++, "大王");
               
                //System.out.println(poker);
               
                //2:洗牌  
                //public static void shuffle(List<?> list)        //打乱元素顺序
                  //2.1 创建ArrayList<Integer>集合 用来存储 0~53编号,添加编号到集合中
                  //          2.2 把集合随机打乱  
                //创建 序号对象
                ArrayList<Integer> indexNmuber = new ArrayList<Integer>();
                //对序号 进行遍历 并获取
                for(int i = 0; i<54;i++){
                        //获取 序号 添加到 集合中
                        indexNmuber.add(i);
                }
                //对集合进行打乱 也就是打乱序号
                Collections.shuffle(indexNmuber);
                //System.out.println(indexNmuber);
               
                //3:发牌:
                //3.1 创建玩家1,玩家2,玩家3,底牌,存储牌的编号 ArrayList<Integer>
                ArrayList<Integer> play = new ArrayList<Integer>();
                ArrayList<Integer> play1 = new ArrayList<Integer>();
                ArrayList<Integer> play2 = new ArrayList<Integer>();
                ArrayList<Integer> diPai = new ArrayList<Integer>();
               
                //3.2 依次发编号给玩家1,玩家2,玩家3  与 底牌
                for(int i =0; i<54; i++){
                        //底牌
                        if(i>=51){
                                //获取  前面打乱的序号 get
                                diPai.add(indexNmuber.get(i));
                               
                        }else{
                                if(i%3==0){
                                        play.add(indexNmuber.get(i));
                                }
                                if(i%3==1){
                                        play1.add(indexNmuber.get(i));
                                }
                                if(i%3==2){
                                        play2.add(indexNmuber.get(i));
                                }
                               
                        }
                }
               

                // 排序方法 , collections.sort();
                //对三名 玩家的牌的序号 进行排序
                Collections.sort(play);
                Collections.sort(play1);
                Collections.sort(play2);
                       
               
                //3.4 创建玩家1,玩家2,玩家3 和 底牌的 牌面集合 ArrayList<String>
                ArrayList<String> strPlay = new ArrayList<String>();
                ArrayList<String> strPlay1 = new ArrayList<String>();
                ArrayList<String> strPlay2 = new ArrayList<String>();
                ArrayList<String> strDiPai = new ArrayList<String>();
               
                for (Integer d : diPai) {
                        String di = poker.get(d);
                        //获取的是  序号 键所对应的 值
                        strDiPai.add(di);
                }
               
                for (Integer d : play) {
                        String di = poker.get(d);
                        //获取的是  序号 键所对应的 值
                        strPlay.add(di);
                }
               
                for (Integer d : play1) {
                        String di = poker.get(d);
                        //获取的是  序号 键所对应的 值
                        strPlay1.add(di);
                }
               
                for (Integer d : play2) {
                        String di = poker.get(d);
                        //获取的是  序号 键所对应的 值
                        strPlay2.add(di);
                }
                System.out.println("赵日天"+strPlay);
                System.out.println("叶良辰"+strPlay1);
                System.out.println("凤凰羽"+strPlay2);
                System.out.println("底牌"+strDiPai);
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
        }
}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2