集合(9)----案例:模拟斗地主洗牌发牌

                                                                                                                                                                   点击此处返回总目录

 

一、功能需求

洗牌:有54张牌,打乱。

发牌:共三个人,每人发17张牌,剩下3张作为底牌。

看牌:按顺序打印出每个人的牌和底牌。

 

二、分析设计

因为是按照大王 小王 2 A K Q J 10 9 8 7 6 5 4 3 的顺序排序,不是按照自然顺序排序。怎么办呢?映射成Map,将每张牌与一个数字对应。这样就可以排序了。

 

 

 

 

三、代码实现

package cn.itcast.demo18;

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

/*
map<Integer,String>
大王   小王   2   A   K     Q     J     10    9     8     7     6     5     4     3
0    1  2-5 6-9 10-13 14-17 18-21 22-25 26-29 30-33 34-37 38-41 42-45 46-49 50-53
*/

 

public class Test {
    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<Integer,String>();  //用于存放牌
        List<Integer> list = new ArrayList<Integer>();            //用于存放洗完牌后牌的顺序
        List<Integer> user1 = new ArrayList<Integer>();           //用于存放每个用户的牌
        List<Integer> user2 = new ArrayList<Integer>();
        List<Integer> user3 = new ArrayList<Integer>();
        List<Integer> dipai = new ArrayList<Integer>();
        
        //洗牌
        xiPai(map,list);
        
        System.out.println("洗完牌之后为:");
        for(int k:list){
            System.out.print(map.get(k)+" ");
        }
        System.out.println();

        
        //发牌
        faPai(map,list,user1,user2,user3,dipai);

        
        //看牌
        showPai(map,user1,user2,user3,dipai);
        
    }
    
    public static void xiPai(Map<Integer,String> map,List<Integer> list){
        //首先存放54张牌
        String[] number = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
        String[] huaSe = {"♥","♠","♦","♣"};
        map.put(0, "大王");
        map.put(1, "小王");
        
        int i = 2;
        for(String num:number){
            for(String hs:huaSe){
                map.put(i++, hs+num);
            }
        }
        System.out.println(map.size());
        
        //然后洗牌
        for(int j = 0 ;j<54 ; j++){
            list.add(j);
        }
        Collections.shuffle(list);

    }
    
    public static void faPai(Map<Integer,String> map,List<Integer> list ,List<Integer> user1,List<Integer> user2,List<Integer> user3,List<Integer> dipai){
        for(int index = 0 ;index<list.size()-3;){  //17*3 = 51  0-50
            user1.add(list.get(index));
            index++;
            user2.add(list.get(index));
            index++;
            user3.add(list.get(index));
            index++;
        }
        for(Integer e :list.subList(list.size()-3, list.size())){    //51 52 53
            dipai.add(e);
        }
        
        System.out.println("发牌的结果为:");
        for(Integer i:user1){
            System.out.print(map.get(i)+" ");
        }
        System.out.println();
        for(Integer i:user2){
            System.out.print(map.get(i)+" ");
        }
        System.out.println();
        for(Integer i:user3){
            System.out.print(map.get(i)+" ");
        }
        System.out.println();
        for(Integer i:dipai){
            System.out.print(map.get(i)+" ");
        }
        System.out.println();        
    }

    public static void showPai(Map<Integer,String> map,List<Integer> user1,List<Integer> user2,List<Integer> user3,List<Integer> dipai){
        Collections.sort(user1);
        Collections.sort(user2);
        Collections.sort(user3);
        Collections.sort(dipai);
        
        System.out.println("每个人的牌为:");
        for(Integer i:user1){
            System.out.print(map.get(i)+" ");
        }
        System.out.println();
        for(Integer i:user2){
            System.out.print(map.get(i)+" ");
        }
        System.out.println();
        for(Integer i:user3){
            System.out.print(map.get(i)+" ");
        }
        System.out.println();
        for(Integer i:dipai){
            System.out.print(map.get(i)+" ");
        }
        System.out.println();    
    }
}

 

运行结果如下:

54
洗完牌之后为:
♦A ♥2 ♣4 ♦8 ♣Q ♥5 ♥K ♥10 ♣5 ♠3 ♦Q ♦5 ♦6 ♣3 ♠8 ♦K ♣J ♣6 ♦4 ♣2 ♥8 ♠10 ♦9 ♠6 ♠4 ♠9 ♠Q ♠K ♥3 ♣A ♠2 ♥J ♠5 ♠7 ♥9 ♠A ♣10 ♥7 ♦3 ♣K 小王 ♣9 ♣8 ♣7 ♥Q ♦10 大王 ♠J ♦7 ♦J ♥4 ♥A ♦2 ♥6 
发牌的结果为:
♦A ♦8 ♥K ♠3 ♦6 ♦K ♦4 ♠10 ♠4 ♠K ♠2 ♠7 ♣10 ♣K ♣8 ♦10 ♦7 
♥2 ♣Q ♥10 ♦Q ♣3 ♣J ♣2 ♦9 ♠9 ♥3 ♥J ♥9 ♥7 小王 ♣7 大王 ♦J 
♣4 ♥5 ♣5 ♦5 ♠8 ♣6 ♥8 ♠6 ♠Q ♣A ♠5 ♠A ♦3 ♣9 ♥Q ♠J ♥4 
♥A ♦2 ♥6 
每个人的牌为:
♠2 ♦A ♥K ♠K ♦K ♣K ♠10 ♦10 ♣10 ♦8 ♣8 ♠7 ♦7 ♦6 ♠4 ♦4 ♠3 
大王 小王 ♥2 ♣2 ♦Q ♣Q ♥J ♦J ♣J ♥10 ♥9 ♠9 ♦9 ♥7 ♣7 ♥3 ♣3 
♠A ♣A ♥Q ♠Q ♠J ♣9 ♥8 ♠8 ♠6 ♣6 ♥5 ♠5 ♦5 ♣5 ♥4 ♣4 ♦3 
♦2 ♥A ♥6 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值