1.三国斗地主思路分析
需求:
4个人玩斗地主,底牌三张。51张牌发给三个人,每个人17张牌。每个人的牌要排好序。
思路分析:
总共有54张牌,四种花色,每种花色13张,大小王各一张。
首先肯定要把54张牌的编号按照斗地主的发牌对应表规则(自己制作的table)存到集合中,发牌是随机的(因为用shuffle(List list)方法可以实现洗牌功能),所以用到List集合类。如果直接发牌,那么牌不能自动排序。要想排序,那么就需要Set集合类。只能根据编号来找牌,那么就用到键和值。所以要用HashMap或者TreeMap集合。
主要思路:发的不是牌,发的是编号,看的是根据编号查找到的牌。
步骤:
1.创建ArrayList集合存储编号,方便随机发牌
2.创建TreeMap集合,按规定存储键值对。(相当于一张表一样,一一对应)
3.创建花色数组和牌值数组。
4.洗牌,用shuffle(List list)方法洗牌
5.发牌,每个人的牌用TreeSet集合接收,可以自动把编号排序。
6.看牌。按照4的编号在TreeMap集合中找编号所对应的牌
2.代码实现
package cn.jason01;
import java.util.ArrayList;
import java.util.Collections;
import java.util.TreeMap;
import java.util.TreeSet;
/**
* 这是模拟斗地主的一个案例
*
* @author cassandra
* @version v1.1
*/
public class Doudizhu {
public static void main(String[] args) {
// 创建ArrayList集合
ArrayList<Integer> array = new ArrayList<Integer>();
// 存储编号
for (int x = 0; x < 54; x++) {
array.add(x);
}
// 创建TreeMap集合,制作发牌表
TreeMap<Integer, String> table = new TreeMap<Integer, String>();
// 创建花色数组
String[] color = { "♦", "♥", "♠", "♣" };
// 创建牌值数组
String[] pokerNumber = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2" };
// 把花色和扑克值字符串拼接,并且把键值对添加到集合TreeMap中
int index = 0;
for (int x = 0; x < color.length; x++) {
for (int y = 0; y < pokerNumber.length; y++) {
String value = new StringBuilder().append(color[x]).append(pokerNumber[y]).toString();
table.put(index, value);
index++;
}
}
// 添加小王
table.put(index, "小王");
index++;
// 添加大王
table.put(index, "大王");
// 洗牌
Collections.shuffle(array);
// 发牌
// 第一个人的牌-刘备的牌
TreeSet<Integer> liuBei = new TreeSet<Integer>();
// 第二个人的牌-曹操的牌
TreeSet<Integer> caoCao = new TreeSet<Integer>();
// 第三个人的牌-孙权的牌
TreeSet<Integer> sunQun = new TreeSet<Integer>();
// 底牌
TreeSet<Integer> bottom = new TreeSet<Integer>();
for (int x = 0; x < array.size(); x++) {
if (x >= array.size() - 3)
bottom.add(array.get(x));
else if (x % 3 == 0)
liuBei.add(array.get(x));
else if (x % 3 == 1)
caoCao.add(array.get(x));
else if (x % 3 == 2)
sunQun.add(array.get(x));
}
// 看牌
// 刘皇叔的牌是:
showPoker("刘备", liuBei, table);
// 曹操的牌是:
showPoker("曹操", caoCao, table);
// 孙权的牌是:
showPoker("孙权", sunQun, table);
// 底牌是:
showPoker("底牌", bottom, table);
}
public static void showPoker(String player, TreeSet<Integer> user, TreeMap<Integer, String> table) {
// 看牌,用TreeSet里面的编号在TreeMap里面找对应的牌就ok
System.out.println(new StringBuilder().append("\n" + player).append("的牌是:" + "\n").toString());
for (int key : user) {
String value = table.get(key);
System.out.print(value + " ");
}
}
}
3.总结
1.洗牌的功能方法,用shuffle(List list)来实现
2.每个人的牌接收用TreeSet集合,可实现自动排序。TreeSet集合底层是TreeMap实现的,有自然排序和比较器排序。因为Integer包装类型已经实现了Comparable接口,重写了compareTo方法,所以可以直接排序。否则,自定义类需要实现Comparable接口或者实现Comparator比较器接口。