15.斗地主案例_双列

该博客详细介绍了如何使用Java实现斗地主游戏的逻辑,包括创建并初始化54张扑克牌,洗牌操作,按顺序发牌给三位玩家以及查看牌面的过程。通过循环和集合操作,实现了从牌的生成到发牌的全过程,展示了基础的数据结构和算法应用。
摘要由CSDN通过智能技术生成

15.斗地主案例_双列

 * 斗地主综合案例:有序版本
 * 1.准备牌:
 *     特殊牌:大王,小王
 *     52张牌:循环嵌套遍历两个集合(或数组),组成成52张牌
 *     List<String>colors=new ArrayList<>();
 *     List<String>numbers=new ArrayList<>();
 *     Collections.addAll(colors,"♠","♥","♣","◆");
 *     Collections.addAll(numbers,"2","A","K"..."3");
 *     本次54张牌用Map<Integer,String>集合来接收,其中
 *     map集合中键表示牌的索引,值为组装好的牌
 * 2.洗牌:
 *     将Map集合中key(组装牌的索引)存储在list集合中,并由Collections集合工具类
 *     中的shuffle(list)方法将List集合打乱顺序。
 * 3.发牌:
 *      一人一张轮流发牌,每人17张,通过索引%3分给三人,最后剩3张牌作为底牌。
 *      因此要创建4个集合List,每个集合存放的map集合中的Key,即组装牌的索引。
 * 4.排序:
 *      使用Collections工具类中的sort(list)方法排序
 * 5.看牌:
 *      可以使用查表法
 *      遍历一个集合list,获取到另外一个集合的key,通过key查找到value
 *      遍历玩家和底牌的list,获取到Map集合的key,通过Key找到value.



public class Doudizhu {
    public static void main(String[] args) {

        /**
         * 1.准备牌
         */

        //创建map集合,存储牌的索引和组装好的牌
        HashMap<Integer, String> poker = new HashMap<>();
        //创建一个list集合,存储牌的索引
        ArrayList<Integer> pokerIndex = new ArrayList<>();
        //定义两个集合,存储花色和牌的序号
        ArrayList<String> colors = new ArrayList<>();
        ArrayList<String> numbers = new ArrayList<>();
        Collections.addAll(colors,"♠","♥","♣","◆");
        Collections.addAll(numbers,"2","A","K","Q","J","10","9","8","7","6","5","4","3");
        //把大王和小王先存储到map集合,并把索引另外单独存储一份到pokerIndex集合中
        //定义一个牌的索引
        int index=0;
        poker.put(index,"大王");
        pokerIndex.add(index);
        index++;
        poker.put(index,"小王");
        pokerIndex.add(index);
        index++;
        //循环两个集合,组装52张牌,存储到集合中
        for (String number : numbers) { //for循环只能遍历单列集合
            for (String color : colors) {
                poker.put(index,color+number);
                pokerIndex.add(index);
                index++;
            }
        }
        System.out.println(poker);
        System.out.println(pokerIndex);

        /*map集合(poker)中组装牌与索引映射关系:
        * {0=大王, 1=小王, 2=♠2, 3=♥2, 4=♣2, 5=◆2, 6=♠A, 7=♥A, 8=♣A, 9=◆A, 10=♠K,
        *  11=♥K, 12=♣K, 13=◆K, 14=♠Q, 15=♥Q, 16=♣Q, 17=◆Q, 18=♠J, 19=♥J, 20=♣J,
        *  21=◆J, 22=♠10, 23=♥10, 24=♣10, 25=◆10, 26=♠9, 27=♥9, 28=♣9, 29=◆9,
        *  30=♠8, 31=♥8, 32=♣8, 33=◆8, 34=♠7, 35=♥7, 36=♣7, 37=◆7, 38=♠6, 39=♥6,
        *  40=♣6, 41=◆6, 42=♠5, 43=♥5, 44=♣5, 45=◆5, 46=♠4, 47=♥4, 48=♣4, 49=◆4,
        *  50=♠3, 51=♥3, 52=♣3, 53=◆3}
        *
        *pokerIndex集合中记录了一份组装牌的索引,下面要将其打乱分发给3个玩家
        * [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
        * 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
        * 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53]
        * */

        /**
         * 2.洗牌:洗的是牌的索引
         */

        //使用Collections集合工具类中的shuffle(list)方法进行打乱顺序,洗牌:洗的是牌的索引
        Collections.shuffle(pokerIndex);
       //System.out.println(pokerIndex);

        /**
         * 3.发牌:定义4个集合,存储3个玩家牌的索引和底牌的索引
         */

        ArrayList<Integer> play01 = new ArrayList<>();
        ArrayList<Integer> play02 = new ArrayList<>();
        ArrayList<Integer> play03 = new ArrayList<>();
        ArrayList<Integer> diPai = new ArrayList<>();
        //遍历存储组装牌索引的pokerIndex集合,获取每一个牌的索引
        for (int i=0;i<pokerIndex.size();i++){ //list集合是有索引的
            Integer in = pokerIndex.get(i);//获取pokerIndex集合中每一个牌的索引
            //先判断底牌
            if (i>=51){
                //给底牌发牌
                diPai.add(in);
            }else if(i%3==0){
                //给玩家1发牌
                play01.add(in);
            }else if(i%3==1){
                //给玩家2发牌
                play02.add(in);
            }else if(i%3==2) {
                //给玩家3发牌
                play03.add(in);
            }
        }

        /**
         * 4.排序
         * 使用Collections集合工具类中的sort方法对玩家的集合排序
         * 默认是升序排序。
         */

        Collections.sort(play01);
        Collections.sort(play02);
        Collections.sort(play03);
        Collections.sort(diPai);
        System.out.println("..........................................");

        /**
         * 5.看牌
         * 调用看牌的方法lookPoker
         */
        lookPoker("萧炎",poker,play01);
        lookPoker("彩鳞",poker,play02);
        lookPoker("云芝",poker,play03);
        lookPoker("底牌",poker,diPai);
    }


    /**
     *
     * 定义一个看牌的方法,提高代码复用性
     * 参数:
     *     String name:玩家名称
     *     HashMap<Integer,String>poker:存储牌的poker集合
     *     ArrayList<Integer>list:存储玩家和底牌的List集合
     */

    public static void lookPoker(String name,HashMap<Integer,String>poker, 
                                 ArrayList<Integer>list){
        //输出玩家名称,不换行
        System.out.print(name+" ");
        //遍历玩家或者底牌的集合,获取牌的索引
        for (Integer key : list) {
            //使用牌的索引,去map集合中找到对应的牌
            String value = poker.get(key);
            System.out.print(value+" ");
        }
        System.out.println();//打印完每一个玩家的牌,换行。
    }
}

 

Card_Rank斗地主是一种扑克牌游戏,需要一副54张牌(包括大小王),通常由3个人进行游戏。下面是详细设计: 1. 牌型 - 单牌:一张单独的牌。 - 对子:两张点数相同的牌。 - 三张:三张点数相同的牌。 - 三带一:三张点数相同的牌加上一张单牌。 - 三带二:三张点数相同的牌加上一对牌。 - 炸弹:四张点数相同的牌。 - 王炸:大小王在一起的牌。 2. 牌值 - 3最小,2最大,大小王除外。 - 大小王:大王比小王大。 3. 游戏规则 - 首先,将54张牌洗混并发给3个人,每个人手中有17张牌,留3张牌作为底牌。 - 地主是在第一轮叫牌中叫分最高的玩家,如果有两个或以上的玩家叫分最高,则这些玩家可以重新叫牌,直到只剩下一个地主。 - 地主可以从底牌中选出3张牌加入自己的牌中,然后开始出牌。 - 玩家出牌时,必须出比上家出牌大的牌,如果没有更大的牌可以出,则必须要不出。 - 地主先出牌,其余两个玩家依次出牌,直到一轮出完为止。 - 一轮牌的牌型必须相同,否则出牌无效。 - 当一名玩家出完所有牌时,游戏结束,该玩家获胜。 4. 牌型比较 - 单牌、对子、三张、炸弹、王炸可以和同样的牌型进行比较,点数大的牌大。 - 三带一和三带二可以和同样的牌型进行比较,点数大的三张牌大。 - 不同牌型之间的比较如下: - 炸弹可以打过任何其他牌型,除了更大的炸弹或王炸。 - 三带一可以打过任何三张牌或对子,但是不可以打过更大的三带一或炸弹。 - 三带二可以打过任何三张牌或对子,但是不可以打过更大的三带二或炸弹。 - 三张牌可以打过任何对子或单牌,但是不可以打过更大的三张牌、三带一、三带二或炸弹。 - 对子可以打过任何单牌,但是不可以打过更大的对子、三张牌、三带一、三带二或炸弹。 - 单牌没有任何牌型可以打过它。 这就是Card_Rank斗地主的详细设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值