第一阶段模块三作业第五题

题目:
使用集合实现斗地主游戏的部分功能,要求如下:
(1)首先准备 54 张扑克牌并打乱顺序。
(2)由三个玩家交替摸牌,每人 17 张扑克牌,最后三张留作底牌。
(3)查看三个玩家手中的扑克牌和底牌。
(4)其中玩家手中的扑克牌需要按照大小顺序打印,规则如下:手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3

思路:扑克牌的花色可以通过for循环的方式来生成,分给3个玩家只要以3取余就行,本来想用set集合来打乱排序,但是测试下来并不生效,于是用了Collections里的shufflle来洗牌。前3个要求感觉都还比较好做,第四个要求第一个想到的是用重写TreeSet里的比较器来实现排序,但是最后不知道该怎么实现所以放弃了。最后通过使用HashMap,以自增序号为Key,花色为Value的方式,然后调用Collections里的sort方法对Key排序,最后在通过get(序号)的方式来实现的。具体代码如下。

视频:https://www.bilibili.com/video/BV1Ei4y1T7xM/

package com.lagou.homework.part3;

import java.util.*;

public class PlayCard {


    public static void main(String[] args) {
//      定义花色和点数数组用来生成牌
        String[] arr1 = {"3","4","5","6","7","8","9","10",
                            "J","Q","K","A","2","小王","大王"};
        String[] arr2 = {"♥","♣","♦","♠"};
//       定义牌面顺序
        int cardIndex = 1;
//        用来保存牌点数和牌顺序
        Map<Integer,String> carMap = new LinkedHashMap<>();
//        用来保存牌面顺序
        List<Integer> cardList = new ArrayList<>();
//      双重循环生成key 为54张带花色的扑克牌,value为牌面价值的map集合
        for (int i=0; i<arr1.length; i++){
//            生成花色的A-K牌面
            if (i<13){
                for (int j=0; j<arr2.length; j++){
//                    cardList.add(arr2[j] + arr1[i]);
//                  将牌序号和牌点数存到map集合中,其中key为序号,value为点数
                    carMap.put(cardIndex,arr2[j] + arr1[i]);
//                    将牌点数信息存到list集合中,给选手发牌用
                    cardList.add(cardIndex);
                    cardIndex++;
                }
//          加上大王和小王
            }else{
                carMap.put(cardIndex,arr1[i]);
                cardList.add(cardIndex);
                cardIndex++;
            }
        }
//        洗牌
        Collections.shuffle(cardList);
//        定义底牌和选手
        List<Integer> bottom = new ArrayList<>();
        List<Integer> player1 = new ArrayList<>();
        List<Integer> player2 = new ArrayList<>();
        List<Integer> player3 = new ArrayList<>();

        for (int i=0; i<cardList.size(); i++){
//            前3张牌给底牌
            if (i<3){
                bottom.add(cardList.get(i));
//            轮流摸牌
            }else if(i%3 == 0){
                player1.add(cardList.get(i));
            }else if(i%3 == 1){
                player2.add(cardList.get(i));
            }else if(i%3 == 2){
                player3.add(cardList.get(i));
            }
        }

//      序号从小到大排序,也就是说牌面从大到小排序
        Collections.sort(bottom);
        Collections.sort(player1);
        Collections.sort(player2);
        Collections.sort(player3);
//        System.out.println(player1);
        showCard("底牌",bottom,carMap);
        showCard("player1",player1,carMap);
        showCard("player2",player2,carMap);
        showCard("player3",player3,carMap);

    }

    public static void showCard(String name,List<Integer> lt,Map<Integer,String> carMap ){
        System.out.println(name + ":");
        for (Integer i:lt){
            System.out.print(carMap.get(i) + " ");
        }
        System.out.println();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值