这篇博客主要是记录在学习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,
将代表不同牌的数字分配给不同的玩家。
将剩下的牌直接存放于底牌,顺序为洗牌的顺序。
玩家存放要求同类型的牌按照顺序存在一起。
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万] [北风]