使用Java集合实现麻将的准备牌、洗牌、发牌、看牌案例

这篇博客主要是记录在学习java集合中,使用相关知识点完成XX(哈哈 不能暴露了)麻将的准备牌、洗牌、发牌、看牌基本功能。
####需求分析

A:XX麻将的功能需求分析
 a:具体规则:
       1. 组装136张麻将
          条、筒、万加到一起的数目是108张
          东、西、南、北风、红中、白皮、发财是28张,总共136张

       2. 将136张牌顺序打乱
       
       3. 四个玩家参与游戏,四人交替摸牌,每次4张,3次,之后庄家摸2张,两张之间个索引相差4,其他人再摸一张,即庄家14张,其他每人13张,剩下的留作底牌。
       
       4. 查看四人各自手中的牌(按照牌的大小排序)、底牌
       
  b:分析:
     1.准备牌:
       完成数字与牌的映射关系:
       使用HashMap集合,完成一个数字与字符串牌的对应关系。
     2.洗牌:
       通过数字完成洗牌发牌
     3.发牌:
       将每个人以及底牌设计为ArrayList<Integer>,
       将代表不同牌的数字分配给不同的玩家。
       将剩下的牌直接存放于底牌,顺序为洗牌的顺序。
       玩家存放要求同类型的牌按照顺序存在一起。
     4.看牌:
       通过HashMap集合找到对应字符展示。
       通过查询牌与数字的对应关系,由数字转成牌字符串再进行展示。

###代码实现


package com.booway.seatwork1;

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

/** 
 * @ClassName: MaJiang 
 * @Description: 麻将(准备牌、洗牌、发牌、看牌)
 * @author: Cheng
 * @date: 2018年7月12日 下午1:42:24  
 */
public class MaJiang
{

    /** 
     * @Title: main 
     * @Description: 
     * @param args void
     * @author Cheng
     * @date 2018年7月12日下午1:42:24
     */
    public static void main(String[] args)
    {
        // 1、组装136张麻将
        // 定义数字
        String[] numbers =
        { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
        //定义3个类型数组
        String[] types =
        { "条", "筒", "万" };
        // 东、西、南、北风,和红中、白皮、发财
        String[] others =
        { "东风", "西风", "南风", "北风", "红中", "白皮", "发财" };

        //1. 组合麻将
        //创建Map集合,键是编号,值是牌
        Map<Integer, String> majiang = new HashMap<Integer, String>();

        //创建List集合,存储编号
        List<Integer> majiangNumber = new ArrayList<Integer>();

        //定义整数变量,作为键出现
        int index = 0;
        //遍历数组,类型+数字的组合,存储到Map集合
        for (String type : types)
        {
            for (String number : numbers)
            {
                for (int i = 0; i < 4; i++)
                {
                    // 存麻将
                    majiang.put(index, number + type);
                    // 存麻将编号
                    majiangNumber.add(index);
                    index++;
                }
            }
        }
        //存储东、西、南、北风,和红中、白皮、发财
        for (String str : others)
        {
            for (int i = 0; i < 4; i++)
            {
                // 存麻将
                majiang.put(index, str);
                // 存麻将编号
                majiangNumber.add(index);
                index++;
            }
        }
        // 遍历麻将
        Set<Entry<Integer, String>> entrySet = majiang.entrySet();
        System.out.print("洗牌前:");
        for (Entry<Integer, String> entry : entrySet)
        {
            System.out.print("[" + entry.getKey() + ":" + entry.getValue() + "]   ");
        }

        // 2、洗牌,将牌的编号打乱

        Collections.shuffle(majiangNumber);
        System.out.println();
        System.out.print("洗牌后:");

        for (Integer mInteger : majiangNumber)
        {
            System.out.print("[" + mInteger + ":" + majiang.get(mInteger) + "]   ");
        }
        System.out.println();

        // 3、发牌
        // 四个玩家参与游戏,四人交替摸牌,每次4张,3次,之后庄家摸2张,两张之间个索引相差4,其他人再摸一张,即庄家14张,其他每人13张,剩下的留作底牌。

        List<Integer> player1 = new ArrayList<Integer>();
        List<Integer> player2 = new ArrayList<Integer>();
        List<Integer> player3 = new ArrayList<Integer>();
        List<Integer> player4 = new ArrayList<Integer>();

        List<Integer> bottom = new ArrayList<Integer>();

        Integer n = 0;
        // 给玩家发牌
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                player1.add(majiangNumber.get(n++));
            }

            for (int j = 0; j < 4; j++)
            {
                player2.add(majiangNumber.get(n++));
            }

            for (int j = 0; j < 4; j++)
            {
                player3.add(majiangNumber.get(n++));
            }

            for (int j = 0; j < 4; j++)
            {
                player4.add(majiangNumber.get(n++));
            }

        }

        // 庄家 多拿一张
        player1.add(majiangNumber.get(n));
        n += 4;
        player1.add(majiangNumber.get(n));
        n -= 3;
        player2.add(majiangNumber.get(n));
        n++;

        player3.add(majiangNumber.get(n));
        n++;

        player4.add(majiangNumber.get(n));
        n += 2;
        System.out.println("发了" + n + "张牌");

        // 剩下的底牌
        for (int i = n; i < majiangNumber.size(); i++)
        {
            bottom.add(majiangNumber.get(i));
        }

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

        // 看牌
        look("玩家1", player1, majiang);
        look("玩家2", player2, majiang);
        look("玩家3", player3, majiang);
        look("玩家4", player4, majiang);
        look("底牌    ", bottom, majiang);

    }
    // 看牌
    public static void look(String name, List<Integer> player, Map<Integer, String> majiang)
    {
        //遍历List集合,获取元素,作为键,到集合Map中找值
        System.out.print(name + " " + "共有" + player.size() + "张牌:  ");
        for (Integer key : player)
        {
            String value = majiang.get(key);
            System.out.print("[" + value + "] ");
        }
        System.out.println();
    }

}

####运行结果

洗牌前:[0:1条]   [1:1条]   [2:1条]   [3:1条]   [4:2条]   [5:2条]   [6:2条]   [7:2条]   [8:3条]   [9:3条]   [10:3条]   [11:3条]   [12:4条]   [13:4条]   [14:4条]   [15:4条]   [16:5条]   [17:5条]   [18:5条]   [19:5条]   [20:6条]   [21:6条]   [22:6条]   [23:6条]   [24:7条]   [25:7条]   [26:7条]   [27:7条]   [28:8条]   [29:8条]   [30:8条]   [31:8条]   [32:9条]   [33:9条]   [34:9条]   [35:9条]   [36:1筒]   [37:1筒]   [38:1筒]   [39:1筒]   [40:2筒]   [41:2筒]   [42:2筒]   [43:2筒]   [44:3筒]   [45:3筒]   [46:3筒]   [47:3筒]   [48:4筒]   [49:4筒]   [50:4筒]   [51:4筒]   [52:5筒]   [53:5筒]   [54:5筒]   [55:5筒]   [56:6筒]   [57:6筒]   [58:6筒]   [59:6筒]   [60:7筒]   [61:7筒]   [62:7筒]   [63:7筒]   [64:8筒]   [65:8筒]   [66:8筒]   [67:8筒]   [68:9筒]   [69:9筒]   [70:9筒]   [71:9筒]   [72:1万]   [73:1万]   [74:1万]   [75:1万]   [76:2万]   [77:2万]   [78:2万]   [79:2万]   [80:3万]   [81:3万]   [82:3万]   [83:3万]   [84:4万]   [85:4万]   [86:4万]   [87:4万]   [88:5万]   [89:5万]   [90:5万]   [91:5万]   [92:6万]   [93:6万]   [94:6万]   [95:6万]   [96:7万]   [97:7万]   [98:7万]   [99:7万]   [100:8万]   [101:8万]   [102:8万]   [103:8万]   [104:9万]   [105:9万]   [106:9万]   [107:9万]   [108:东风]   [109:东风]   [110:东风]   [111:东风]   [112:西风]   [113:西风]   [114:西风]   [115:西风]   [116:南风]   [117:南风]   [118:南风]   [119:南风]   [120:北风]   [121:北风]   [122:北风]   [123:北风]   [124:红中]   [125:红中]   [126:红中]   [127:红中]   [128:白皮]   [129:白皮]   [130:白皮]   [131:白皮]   [132:发财]   [133:发财]   [134:发财]   [135:发财]   
洗牌后:[128:白皮]   [134:发财]   [49:4筒]   [69:9筒]   [112:西风]   [43:2筒]   [70:9筒]   [98:7万]   [11:3条]   [37:1筒]   [36:1筒]   [38:1筒]   [67:8筒]   [64:8筒]   [58:6筒]   [27:7条]   [9:3条]   [24:7条]   [123:北风]   [61:7筒]   [51:4筒]   [3:1条]   [17:5条]   [34:9条]   [119:南风]   [54:5筒]   [6:2条]   [121:北风]   [115:西风]   [21:6条]   [62:7筒]   [63:7筒]   [73:1万]   [94:6万]   [40:2筒]   [91:5万]   [100:8万]   [130:白皮]   [30:8条]   [116:南风]   [39:1筒]   [8:3条]   [117:南风]   [48:4筒]   [106:9万]   [57:6筒]   [104:9万]   [52:5筒]   [1:1条]   [2:1条]   [132:发财]   [89:5万]   [92:6万]   [111:东风]   [74:1万]   [127:红中]   [101:8万]   [65:8筒]   [68:9筒]   [122:北风]   [4:2条]   [87:4万]   [114:西风]   [113:西风]   [126:红中]   [35:9条]   [107:9万]   [124:红中]   [29:8条]   [31:8条]   [50:4筒]   [42:2筒]   [95:6万]   [13:4条]   [96:7万]   [41:2筒]   [118:南风]   [32:9条]   [12:4条]   [23:6条]   [84:4万]   [28:8条]   [88:5万]   [99:7万]   [46:3筒]   [60:7筒]   [102:8万]   [110:东风]   [56:6筒]   [19:5条]   [109:东风]   [105:9万]   [80:3万]   [25:7条]   [22:6条]   [47:3筒]   [131:白皮]   [44:3筒]   [133:发财]   [76:2万]   [55:5筒]   [82:3万]   [75:1万]   [90:5万]   [103:8万]   [79:2万]   [33:9条]   [72:1万]   [125:红中]   [85:4万]   [7:2条]   [18:5条]   [71:9筒]   [59:6筒]   [97:7万]   [93:6万]   [66:8筒]   [0:1条]   [83:3万]   [78:2万]   [53:5筒]   [135:发财]   [77:2万]   [45:3筒]   [10:3条]   [15:4条]   [26:7条]   [108:东风]   [86:4万]   [5:2条]   [129:白皮]   [20:6条]   [16:5条]   [14:4条]   [81:3万]   [120:北风]   
发了53张牌
玩家1 共有14张牌:  [1条] [3条] [7条] [2筒] [4筒] [7筒] [9筒] [1万] [5万] [6万] [6万] [北风] [白皮] [发财] 
玩家2 共有13张牌:  [1条] [1条] [5条] [8条] [9条] [2筒] [4筒] [9筒] [7万] [8万] [西风] [南风] [白皮] 
玩家3 共有13张牌:  [2条] [3条] [3条] [1筒] [1筒] [1筒] [1筒] [4筒] [5筒] [南风] [南风] [北风] [发财] 
玩家4 共有13张牌:  [6条] [7条] [5筒] [6筒] [6筒] [7筒] [7筒] [8筒] [8筒] [5万] [9万] [9万] [西风] 
底牌  共有83张牌:  [东风] [1万] [红中] [8万] [8筒] [9筒] [北风] [2条] [4万] [西风] [西风] [红中] [9条] [9万] [红中] [8条] [8条] [4筒] [2筒] [6万] [4条] [7万] [2筒] [南风] [9条] [4条] [6条] [4万] [8条] [5万] [7万] [3筒] [7筒] [8万] [东风] [6筒] [5条] [东风] [9万] [3万] [7条] [6条] [3筒] [白皮] [3筒] [发财] [2万] [5筒] [3万] [1万] [5万] [8万] [2万] [9条] [1万] [红中] [4万] [2条] [5条] [9筒] [6筒] [7万] [6万] [8筒] [1条] [3万] [2万] [5筒] [发财] [2万] [3筒] [3条] [4条] [7条] [东风] [4万] [2条] [白皮] [6条] [5条] [4条] [3万] [北风] 

欢迎关注公众号:【皮卡战记】

在这里插入图片描述

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值