Java基础案例教程 第六章集合类———【任务6-3】斗地主之洗牌发牌 (集合)

一、任务描述:

共有54张牌,牌面由花色和数字(包括J,Q,K,A)组成,花色有黑桃♠,红桃♥,方块♦和梅花♣,还有小王,大王。

将这54张牌打乱,共有3位玩家参与游戏,没人轮流摸一张牌,剩余3张留为底牌。

程序结束打印每人手上的纸牌还有底牌,

 

 

二、运行结果:

 

 

三、实现思路:

1、准备牌

     花色和数字都是普通数据类型,用ArrayList存储即可,它相当于长度不固定的数组,而且有很多方法可以调用

      创建 ArrayList 存储花色,创建 ArrayList 存储数字

      //创建集合存储花色
        ArrayList<String> arrSuit = new ArrayList<String>();
        arrSuit.add("♠");
        arrSuit.add("♥");
        arrSuit.add("♦");
        arrSuit.add("♣");

        //创建集合存储数字(包括J,Q,K)
        ArrayList<String> arrNumber = new ArrayList<String>();
        for (int i = 2; i < 11; i++) {
            //获取变量的值 !!!
            arrNumber.add(i + "");
        }
        arrNumber.add("A");
        arrNumber.add("J");
        arrNumber.add("Q");
        arrNumber.add("K");
        //System.out.println(arrNumber);

      创建HashMap存储 序号和牌 的键值对

      //创建HashMap 存储 序号和牌面的 键值对
        HashMap<Integer, String> map = new HashMap<Integer, String>();
        int index = 0;
        for (String suit : arrSuit) { //循环花色
            for (String number : arrNumber) { //循环数字
                map.put(index++, suit + number);
            }
        }
        //加上大王小王
        map.put(52, "大王");
        map.put(53, "小王");

2、发牌

      打乱序号集合

      //创建集合存储序号0-53
        ArrayList<Integer> order = new ArrayList<Integer>();
        for (int i = 0; i < 54; i++) {
            order.add(i);
        }
        //把所有序号打乱
        Collections.shuffle(order);

      把所有序号分配出去

      //分配给3个玩家,并留下3张底牌
        ArrayList<Integer> player1 = new ArrayList<Integer>();
        ArrayList<Integer> player2 = new ArrayList<Integer>();
        ArrayList<Integer> player3 = new ArrayList<Integer>();
        ArrayList<Integer> finalCards = new ArrayList<Integer>();
        
        //如果对集合本身不做处理的话,用Iterator很方便
        for (Integer thisOrder : order) {
            if (thisOrder > 50) {
                finalCards.add(thisOrder);
            } else {
                if (thisOrder % 3 == 0) {
                    player1.add(thisOrder);
                } else if (thisOrder % 3 == 1) {
                    player2.add(thisOrder);
                } else {
                    player3.add(thisOrder);
                }
            }
        }

3、打印牌

把每个玩家的牌重新排序

     Collections.sort(player1);
     Collections.sort(player2);
     Collections.sort(player3);
     Collections.sort(finalCards);

 调用函数,根据序号,从HashMap里取出值

      //调用函数打印
        System.out.println("player1: " + printCards(map, player1));
        System.out.println("player2: " + printCards(map, player2));
        System.out.println("player3: " + printCards(map, player3));
        System.out.println("finalCards: " + printCards(map, finalCards));

    }

    //打印纸牌的方法
    public static String printCards(HashMap<Integer, String> map, ArrayList<Integer> arrayList) {
        StringBuilder stringBuilder = new StringBuilder();
        for (Integer thisOrder : arrayList) {
            String card = map.get(thisOrder); //获取键值
            stringBuilder.append(card + " ");
        }
        return stringBuilder.toString();
    }

      

四、实现代码:

//获取变量的值 !!!
arrNumber.add(i +"");
//集合中存储的没有基本数据类型,都是对象   没有int
HashMap<Integer, String> map = new HashMap<Integer, String>();
 //把所有序号打乱
Collections.shuffle(order);

//把集合重新排序
Collections.sort(player1);
package cn.itcast.task03;

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

/**
 * @author wangyue
 * @version 1.0
 * @date 2019/6/28 14:22
 * @describe: 斗地主之洗牌发牌
 */
public class PokerShuffleCards {
    public static <in> void main(String[] args) {
        //1、准备扑克牌
        //创建集合存储花色
        ArrayList<String> arrSuit = new ArrayList<String>();
        arrSuit.add("♠");
        arrSuit.add("♥");
        arrSuit.add("♦");
        arrSuit.add("♣");

        //创建集合存储数字(包括J,Q,K)
        ArrayList<String> arrNumber = new ArrayList<String>();
        for (int i = 2; i < 11; i++) {
            //获取变量的值 !!!
            arrNumber.add(i + "");
        }
        arrNumber.add("A");
        arrNumber.add("J");
        arrNumber.add("Q");
        arrNumber.add("K");
        //System.out.println(arrNumber);


        //创建HashMap 存储 序号和牌面的 键值对
        HashMap<Integer, String> map = new HashMap<Integer, String>();
        int index = 0;
        for (String suit : arrSuit) { //循环花色
            for (String number : arrNumber) { //循环数字
                map.put(index++, suit + number);
            }
        }
        //加上大王小王
        map.put(52, "大王");
        map.put(53, "小王");


        //2、给三个玩家发牌
        //创建集合存储序号0-53
        ArrayList<Integer> order = new ArrayList<Integer>();
        for (int i = 0; i < 54; i++) {
            order.add(i);
        }
        //把所有序号打乱
        Collections.shuffle(order);

        //分配给3个玩家,并留下3张底牌
        ArrayList<Integer> player1 = new ArrayList<Integer>();
        ArrayList<Integer> player2 = new ArrayList<Integer>();
        ArrayList<Integer> player3 = new ArrayList<Integer>();
        ArrayList<Integer> finalCards = new ArrayList<Integer>();

        //如果对集合本身不做处理的话,用Iterator很方便
        for (Integer thisOrder : order) {
            if (thisOrder > 50) {
                finalCards.add(thisOrder);
            } else {
                if (thisOrder % 3 == 0) {
                    player1.add(thisOrder);
                } else if (thisOrder % 3 == 1) {
                    player2.add(thisOrder);
                } else {
                    player3.add(thisOrder);
                }
            }
        }


        //3、把玩家的牌和三张底牌打印出来
        //把每个玩家的牌重新排序
        Collections.sort(player1);
        Collections.sort(player2);
        Collections.sort(player3);
        Collections.sort(finalCards);
        //调用函数打印
        System.out.println("player1: " + printCards(map, player1));
        System.out.println("player2: " + printCards(map, player2));
        System.out.println("player3: " + printCards(map, player3));
        System.out.println("finalCards: " + printCards(map, finalCards));

    }

    //打印纸牌的方法
    public static String printCards(HashMap<Integer, String> map, ArrayList<Integer> arrayList) {
        StringBuilder stringBuilder = new StringBuilder();
        for (Integer thisOrder : arrayList) {
            String card = map.get(thisOrder); //获取键值
            stringBuilder.append(card + " ");
        }
        return stringBuilder.toString();
    }
}


输出
player1: ♠2 ♠5 ♠8 ♠A ♠K ♥4 ♥7 ♥10 ♥Q ♦3 ♦6 ♦9 ♦J ♣2 ♣5 ♣8 ♣A 
player2: ♠3 ♠6 ♠9 ♠J ♥2 ♥5 ♥8 ♥A ♥K ♦4 ♦7 ♦10 ♦Q ♣3 ♣6 ♣9 ♣J 
player3: ♠4 ♠7 ♠10 ♠Q ♥3 ♥6 ♥9 ♥J ♦2 ♦5 ♦8 ♦A ♦K ♣4 ♣7 ♣10 ♣Q 
finalCards: ♣K 大王 小王 

 

 

 

 

 

PS:界面实现

java应用——斗地主(一:界面,洗牌发牌过程) - queen_queen的博客 - CSDN博客

 

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值