java案例之-三國鬥地主

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比較器接口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章