Java之鬥地主案例
第一種
步驟分析:
- 定義數字數組
- 定義花色數組
- 定義撲克牌盒子集合
- 將大小王單獨添加到盒子集合
- 循環遍歷將數字數組與花色數組進行組合連接,然後添加進撲克牌集合
- 將撲克牌集合進行隨機排序
- 定義3人與底牌集合
- 遍歷存儲(發牌)
- 看牌
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);
}
}
結果:
可以看的出來發的牌都是無序的,而我們(大部分人)看牌的時候都會把牌進行排序。
而接下來的第二種就是“排序”寫法!
第二種
步驟分析:
- 定義數字數組
- 定義花色數組
- 定義Map<Integer,String>集合,和ArrayList
- 拼接1&&2,存儲到Map集合中,把Integer添加到ArrayList集合中單獨添加大小王
- 定義TreeSet*4(一個底牌)
- 發牌
- 看牌
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集合)
有個洗牌動作,所以添加進去的元素是無序的)。
別想太複雜,簡簡單單的~~~~