集合之鬥地主案例
阿新 • • 發佈:2022-12-12
1 package com.Lucky.AppUnit; 2 3 /** 4 * 開啟App入口 5 */ 6 public class App { 7 public static void main(String[] args) { 8 // new startGame(); 9 // new InnerGame(); 10 // new overGame(); 11 new valuesGame(); 12 } 13 }
package com.Lucky.AppUnit; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; /* 初級版 */ public class startGame { //1.準備一副撲克牌 static ArrayList<String> house=new ArrayList<>(); //撲克牌盒子 //利用程式碼塊載入:與類一起載入,只加載一次 static{ //定義花色 String[] huase={"♠","♥","♦","♣"}; //定義牌面數字 String[] num={"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; //方法一:用for迴圈遍歷新增不同花色的撲克牌 for (int i = 0; i < huase.length; i++) { //遍歷新增同一花色的撲克牌 for (int j = 0; j < num.length; j++) { house.add(huase[i]+num[j]); } } //方法二:用增強for迴圈新增資料 // for (String s : huase) { // for (String n : num) { // house.add(s+n); // } // } //還有大王和小王 house.add("大王"); house.add("小王"); } public startGame() { /// System.out.println(house); //2. 洗牌 Collections.shuffle(house); // System.out.println(house); //3.發牌 ArrayList<String> lord=new ArrayList<>(); //底牌 ArrayList<String> player1=new ArrayList<>(); ArrayList<String> player2=new ArrayList<>(); ArrayList<String> player3=new ArrayList<>(); for (int i = 0; i < house.size(); i++) { String val= house.get(i); if(i<3){ //前三張牌作為底牌 lord.add(val); continue; //跳出本次迴圈,進入下次迴圈 } //底牌完成之後,輪流發牌 if(i%3==0){ //發牌給第一個人 player1.add(val); }else if(i%3==1){ //發牌給第二個人 player2.add(val); }else if(i%3==2){//發牌給第三個人 player3.add(val); } } //看牌 lookPoker("底牌",lord); lookPoker("唯易",player1); lookPoker("大帥哥",player2); lookPoker("SB",player3); } public void lookPoker(String name,ArrayList<String> lists){ lists.sort(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); System.out.println(); System.out.print(name+"的牌="); for (String list : lists) { System.out.print(list+"\t"); } } }
package com.Lucky.AppUnit; import java.util.*; /* 中級版 :利用指定序號排序 */ public class InnerGame { //1.準備一副撲克牌 static HashMap<Integer,String> map=new HashMap<>(); //牌盒 static ArrayList<Integer> ArrList=new ArrayList<>(); //裝序號的盒子 //利用程式碼塊載入:與類一起載入,只加載一次 static{ //定義花色 String[] huase={"♠","♥","♦","♣"}; //定義牌面數字 String[] num={"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; int index=1; //牌的序號 //遍歷新增牌 for (String s : num) { //遍歷新增牌的數字 for (String n : huase) { //新增牌的花色 map.put(index,n+s); //序號以及牌 index++; } } //還有大王 /小王 map.put(index,"小王"); index++; map.put(index,"大王"); } public InnerGame() { // System.out.println(map); //1.將牌盒序號加入 ArrList 集合 Set<Integer> integers = map.keySet(); for (Integer in : integers) { ArrList.add(in); } //2.打亂順序【洗牌】 Collections.shuffle(ArrList); //發牌跟準備各自的牌集合 ArrayList<Integer> lord=new ArrayList<>(); ArrayList<Integer> palyer1=new ArrayList<>(); ArrayList<Integer> palyer2=new ArrayList<>(); ArrayList<Integer> palyer3=new ArrayList<>(); for (int i = 0; i < ArrList.size(); i++) { int num= ArrList.get(i); if(i<3){ //底牌 lord.add(num); continue; } //輪流發牌給三個人 if(i%3==0){ palyer1.add(num); }else if(i%3==1){ palyer2.add(num); }else if(i%3==2){ palyer3.add(num); } } //看牌 lookPoker("地主",lord); //底牌 lookPoker("唯易",palyer1); //玩家1 lookPoker("大帥哥",palyer2); //玩家2 lookPoker("大SB",palyer3); //玩家3 } public void lookPoker(String name,ArrayList<Integer> lists){ //再將lists集合中的數字排序 lists.sort(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1-o2; } }); //將序號的資料經過map遍歷獲取到值,新增到集合中 ArrayList<String> New=new ArrayList<>(); System.out.println(); System.out.print(name+"的牌="); //根據鍵遍歷map集合來獲取相對應的值 Set<Map.Entry<Integer, String>> entries = map.entrySet(); for (Integer list : lists) { for (Map.Entry<Integer, String> entry : entries) { Integer key = entry.getKey(); String value = entry.getValue(); if(key==list){ New.add(value); } } } for (String s : New) { System.out.print(s+"\t"); } } }
package com.Lucky.AppUnit; import java.util.*; /* 中級版 :利用指定序號排序【簡化寫法】 */ public class overGame { //1.準備一副撲克牌 static HashMap<Integer,String> map=new HashMap<>(); //牌盒 static ArrayList<Integer> ArrList=new ArrayList<>(); //裝序號的盒子 //利用程式碼塊載入:與類一起載入,只加載一次 static{ //定義花色 String[] huase={"♠","♥","♦","♣"}; //定義牌面數字 String[] num={"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; int index=1; //牌的序號 //遍歷新增牌 for (String s : num) { //遍歷新增牌的數字 for (String n : huase) { //新增牌的花色 map.put(index,n+s); //序號以及牌 index++; } } //還有大王 /小王 map.put(index,"小王"); index++; map.put(index,"大王"); } public overGame() { // System.out.println(map); //1.將牌盒序號加入 ArrList 集合 Set<Integer> integers = map.keySet(); for (Integer in : integers) { ArrList.add(in); } //2.打亂順序【洗牌】 Collections.shuffle(ArrList); //發牌跟準備各自的牌集合【TreeSet集合有排序的作用】 TreeSet<Integer> lord=new TreeSet<>(); TreeSet<Integer> palyer1=new TreeSet<>(); TreeSet<Integer> palyer2=new TreeSet<>(); TreeSet<Integer> palyer3=new TreeSet<>(); for (int i = 0; i < ArrList.size(); i++) { int num= ArrList.get(i); if(i<3){ //底牌 lord.add(num); continue; } //輪流發牌給三個人 if(i%3==0){ palyer1.add(num); }else if(i%3==1){ palyer2.add(num); }else if(i%3==2){ palyer3.add(num); } } //看牌 lookPoker("地主",lord); //底牌 lookPoker("唯易",palyer1); //玩家1 lookPoker("大帥哥",palyer2); //玩家2 lookPoker("大SB",palyer3); //玩家3 } public void lookPoker(String name,TreeSet<Integer> lists){ //將序號的資料經過map遍歷獲取到值,新增到集合中 ArrayList<String> New=new ArrayList<>(); System.out.println(); System.out.print(name+"的牌="); for (Integer list : lists) { String val = map.get(list); //根據鍵獲取相對應的值 New.add(val); //將值新增到New集合中 } for (String s : New) { //遍歷New集合輸出牌 System.out.print(s+"\t"); } } }
package com.Lucky.AppUnit; import java.util.*; /* 高階版 :利用自定義價值排序 */ public class valuesGame { //1.準備一副撲克牌 static ArrayList<String> array=new ArrayList<>(); //牌盒 static TreeMap<String,Integer> List=new TreeMap<>(); //自定義價值盒子 //利用程式碼塊載入:與類一起載入,只加載一次 static{ //定義花色 String[] huase={"♠","♥","♦","♣"}; //定義牌面數字 String[] num={"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; //遍歷新增牌 for (String s : num) { //遍歷新增牌的數字 for (String n : huase) { //新增牌的花色 array.add(n+s); //序號以及牌 } } //還有大王 /小王 array.add(" 小王"); //前面的空格是用於統一擷取字串的要求 array.add(" 大王"); } public valuesGame() { List.put("J",20); List.put("Q",21); List.put("K",22); List.put("A",23); List.put("2",24); List.put("大王",30); List.put("小王",50); //2.打亂順序【洗牌】 Collections.shuffle(array); //發牌跟準備各自的牌集合 ArrayList<String> lord=new ArrayList<>(); ArrayList<String> palyer1=new ArrayList<>(); ArrayList<String> palyer2=new ArrayList<>(); ArrayList<String> palyer3=new ArrayList<>(); //發牌 for (int i = 0; i < array.size(); i++) { String str=array.get(i); //實際牌面的數字 if(i<3){ //底牌 lord.add(str); continue; } //輪流發牌給三個人 if(i%3==0){ palyer1.add(str); }else if(i%3==1){ palyer2.add(str); }else if(i%3==2){ palyer3.add(str); } } //看牌 lookPoker("地主",lord); //底牌 lookPoker("唯易",palyer1); //玩家1 lookPoker("大帥哥",palyer2); //玩家2 lookPoker("大SB",palyer3); //玩家3 } public void lookPoker(String name,ArrayList<String> lists){ //再將lists集合中的數字排序 lists.sort(new Comparator<String>() { @Override //Array.sort[插入排序+二分排序] public int compare(String o1, String o2) { /* o1:代表現在要新增的資料 o2:已經儲存在集合中的資料 */ //計算花色和價值 String color = o1.substring(0, 1); int val=getValue(o1); String color1 = o2.substring(0, 1); int val1=getValue(o2); //比價價值 int i=val-val1; return i==0 ? color.compareTo(color1):i; //價值相同,就比較花色大小 } }); //輸出牌面 System.out.print(name+"的牌="); System.out.println(lists); } //計算價值的方法 public static int getValue(String str){ //獲取數字 String sub = str.substring(1); //判斷獲取的數字在map集合中是否存在 //注意點:存在大王/小王的Bug,要統一擷取,令其在集合中存在 if(List.containsKey(sub)){ //存在,就獲取值 return List.get(sub); }else { //不存在,就將鍵強制轉換成價值【int】型別作為價值 return Integer.parseInt(sub); } } }