Java之鬥地主案例

Java之鬥地主案例

第一種

步驟分析:

  1. 定義數字數組
  2. 定義花色數組
  3. 定義撲克牌盒子集合
  4. 將大小王單獨添加到盒子集合
  5. 循環遍歷將數字數組與花色數組進行組合連接,然後添加進撲克牌集合
  6. 將撲克牌集合進行隨機排序
  7. 定義3人與底牌集合
  8. 遍歷存儲(發牌)
  9. 看牌
package cn.ddz;

import java.util.ArrayList;
import java.util.Collections;

public class FAL {
	public static void main(String[] args) {
		String num[] = {"A","2","3","4","5","6","7","8","9","J","Q","K"};//定義數字數組
		String[] fc = {"♣","♠","♦","♥"};//定義梅花那些東西數組
		ArrayList<String> puker = new ArrayList<>();//定義撲克牌盒子集合
		//將大小王單獨添加到盒子集合
		puker.add("大鬼");
		puker.add("小鬼");
		//循環遍歷將數字數組與花色數組合添加進撲克牌集合
		for(String f : fc) {
			for(String n : num) {
				puker.add(f.concat(n));//concat():String中的方法
			}
		}
		
		Collections.shuffle(puker);//進行隨機排序
		
		//定義3人與底牌集合
		ArrayList<String> zhangSan = new ArrayList<String>();
		ArrayList<String> liSi = new ArrayList<String>();
		ArrayList<String> zhaoLiu = new ArrayList<String>();
		ArrayList<String> diPai = new ArrayList<String>();
		//遍歷存儲
		for(int i=0; i<puker.size(); i++) {
			//底牌
			if(i>=puker.size()-3) {
				diPai.add(puker.get(i));
			}
			//對三人進行發牌
			if(i % 3 == 0) {
				//zhangSan
				zhangSan.add(puker.get(i));
			}else if(i % 3 == 1) {
				//liSi
				liSi.add(puker.get(i));
			}else {
				//zhaoLiu
				zhaoLiu.add(puker.get(i));
			}
		}
		
		//展示牌
		System.out.println("張三:"+zhangSan);
		System.out.println("李四:"+liSi);
		System.out.println("趙柳:"+zhaoLiu);
		System.out.println("底牌:"+diPai);
	}
}

結果:

在這裏插入圖片描述

可以看的出來發的牌都是無序的,而我們(大部分人)看牌的時候都會把牌進行排序。

而接下來的第二種就是“排序”寫法!


第二種

步驟分析:

  1. 定義數字數組
  2. 定義花色數組
  3. 定義Map<Integer,String>集合,和ArrayList
  4. 拼接1&&2,存儲到Map集合中,把Integer添加到ArrayList集合中單獨添加大小王
  5. 定義TreeSet*4(一個底牌)
  6. 發牌
  7. 看牌
package cn.ddz;

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

public class FAL2 {
	public static void main(String[] args) {
		String num[] = {"3","4","5","6","7","8","9","J","Q","K","A","2"};//定義數字數組
		String[] fc = {"♣","♠","♦","♥"};//定義梅花那些東西數組
		//定義Map<Integer,String>集合,和ArrayList<Integer>
		HashMap<Integer,String> hm = new HashMap<Integer,String>();
		ArrayList<Integer> al = new ArrayList<>();
		
		//拼接1&&2,存儲到Map集合中,把Integer添加到ArrayList<Integer>集合中
		int index = 0;//定義索引值
		for(String n : num) {
			for(String f : fc) {
				hm.put(index, f.concat(n));
				al.add(index);
				index++;
			}
		}
		
		//單獨添加大小王
		hm.put(index, "大鬼");
		al.add(index);
		index++;
		hm.put(index, "小鬼");
		al.add(index);
		
		Collections.shuffle(al);//洗牌
		
		//定義TreeSet<Integer>*4(一個底牌)
		TreeSet<Integer> zs = new TreeSet<>();
		TreeSet<Integer> ls = new TreeSet<>();
		TreeSet<Integer> zl = new TreeSet<>();
		TreeSet<Integer> dp = new TreeSet<>();
		
		//發牌
		for(int i=0; i<al.size(); i++) {
			//底牌
			if(i>=al.size()-3) {
				dp.add(al.get(i));
			}
			//用戶
			if(i%3==0) {
				zs.add(al.get(i));
			}else if(i%3==1) {
				ls.add(al.get(i));
			}else {
				zl.add(al.get(i));
			}
		}
		//看牌
		look(hm, zs, "張三");
		look(hm, ls, "李四");
		look(hm, zl, "趙柳");
		look(hm, dp, "底牌");
	}
	/**
	 * 發牌功能
	 */
	public static void look(HashMap<Integer,String> hm, TreeSet<Integer> ts, String name) {
		System.out.print(name+"的牌:");
		for(Integer key : ts) {
			System.out.print(hm.get(key)+" ");
		}
		System.out.println();
	}
}

結果:

在這裏插入圖片描述

可以看的出來,這些牌都有着順序。

鬥地主第二種–代碼分析:

在這裏插入圖片描述

首先,上面的圖你們要是看懂了,那就成功一半了。

由圖可以看的出來HashMap的鍵用來存儲索引,值存儲牌,看得出來,每一個索引對應着一種牌

然後將索引存儲到ArrayList集合中,然後再將ArrayList的索引添加至TreeSet集合中,(在這之前還有個洗牌動作,所以添加進去的元素是無序的)。

最後HashMap再根據TreeSet中存儲的索引去獲取值。


問:爲什麼要用TreeSet集合存儲?

答:因爲TreeSet有一個自然排序,也就是compareTo()方法,會進行自動排序,(如果不知道的我建議你先去學習一下TreeSet集合)
有個洗牌動作,所以添加進去的元素是無序的)。

別想太複雜,簡簡單單的~~~~

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