集合的综合练习:Poker牌

/*  刘意教程示例:*/package cn.onecool.cot;

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

/*
 * 思路:
 * 		A:建立一个HashMap集合初始化一副牌
 * 		B:建立一个ArrayList集合,在这个集合中保存在A中的HashMap中存放的那副牌的存放编号
 * 		C:建立花色数组和点数数组
 * 		D:从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号便可(ArrayList中存放的编号用于洗牌时将牌打乱)。
 *    		E:洗牌(洗的是ArrayList中存放的牌的编号)
 *     		F:发牌(发的也是编号,为了保证编号是排序的,就建立TreeSet集合接收,不然看牌时,发的牌顺序都是乱的,不符合现实)
 *     		G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
 */
public class PokerDemo {
	public static void main(String[] args) {
		// 建立一个HashMap集合,这个Map是存放整个一副牌的。
		HashMap<Integer, String> hm = new HashMap<Integer, String>();

		// 建立一个ArrayList集合,这个List只存放牌的编号,洗牌时将这个List中的编号打乱便可实现洗牌了。
		ArrayList<Integer> array = new ArrayList<Integer>();

		// 建立花色数组和点数数组
		// 定义一个花色数组
		String[] colors = { "♠", "♥", "♣", "♦" };//根据实际,存放牌的花色:梅花、方片、黑桃、红桃
		// 定义一个点数数组
		String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q",
				"K", "A", "2"};

		// 从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号便可。
		int index = 0;

		for (String number : numbers) {
			for (String color : colors) {
				String poker = color.concat(number);//调用String的concat方法,实现字符串的链接,最后造成如,红桃三、黑桃4.....这个地方也可直接									用字符串链接操做:String poker = color + number;			
				hm.put(index, poker);
				array.add(index);
				index++;
			}
		}
		hm.put(index, "小王");
		array.add(index);
		index++;
		hm.put(index, "大王");
		array.add(index);

		// 洗牌(洗的是编号)
		Collections.shuffle(array); //调用Colections类的方法实现洗牌

		// 发牌(发的也是编号,为了保证编号是排序的,就建立TreeSet集合接收)
		TreeSet<Integer> fengQingYang = new TreeSet<Integer>();
		TreeSet<Integer> linQingXia = new TreeSet<Integer>();
		TreeSet<Integer> liuYi = new TreeSet<Integer>();
		TreeSet<Integer> diPai = new TreeSet<Integer>();

		for (int x = 0; x < array.size(); x++) {
			if (x >= array.size() - 3) {//发牌时,有3张底牌是不用发的。
				diPai.add(array.get(x));

			} else if (x % 3 == 0) {//发牌的原理:一共3人,每一圈发牌时每人发一张,总共除了底牌,每人发17张牌。第一张发给A,第二张发给B,第三张发						给C,如此循环,直到发完。生第一次发牌时,x=0, x%3==0,x此时A得牌;而后x=1,x%3==1,B得牌;而后x=2,x%3==2,C得牌。						。。以此类推,发完为止(注意,有几我的打牌,这里的被除数就是几,好比4人游戏即对x%4做相应的判断。)
				fengQingYang.add(array.get(x));
			} else if (x % 3 == 1) {//B得一张牌
				linQingXia.add(array.get(x));
			} else if (x % 3 == 2) {//C得一张牌
				liuYi.add(array.get(x));
			}
		}

		// 看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
		lookPoker("风清扬", fengQingYang, hm);
		lookPoker("林青霞", linQingXia, hm);
		lookPoker("刘意", liuYi, hm);
		lookPoker("底牌", diPai, hm);
	}

	// 写看牌的功能
	public static void lookPoker(String name, TreeSet<Integer> ts,
			HashMap<Integer, String> hm) {
		System.out.print(name + "的牌是:");
		for (Integer key : ts) {
			String value = hm.get(key);
			System.out.print(value + " ");
		}
		System.out.println();
	}
}
相关文章
相关标签/搜索