集合的綜合練習: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();
	}
}
相關文章
相關標籤/搜索