案例: 模拟鬥地主發牌
需求:使用一個集合對象存儲一副撲克牌。将所有撲克牌的順序打亂,然後分發給用集合表示的三個玩家和底牌,并列印玩家和底牌的集合内容
步驟:1.買一副撲克牌
将花色和數字分别進行組合,生成所有的普通牌,手動添加“大王”、“小王”。
2.洗牌
使用Collections工具類的shuffle()方法打亂牌的順序
3.發牌
周遊牌堆,将每一張牌分發到三個玩家集合中
4.看牌
分别列印每個玩家集合的内容
步驟一 :買一副撲克牌
分析:
1.建立數字數組:
```java
String[] nums = {“3”,“4”,“5”,“6”,“7”,“8”,“9”,“10”,“J”,“Q”,“K”,“A”,“2”};
```
2.建立花色數組:
3.将每個花色分别和數字進行拼接
package cn.itcast.demo17;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/*
需求:模拟鬥地主發牌
步驟:
1.買牌
2.洗牌
3.發牌
4.看牌
*/
public class SendPokerTest {
public static void main(String[] args) {
//1.買牌
//1.1定義一個雙列集合,鍵:表示牌的編号,值:表示具體的牌。規則:編号越小。牌越小
Map<Integer,String> pokers = new HashMap<>();
//1.2定義一個單列集合,用來存儲所有牌的編号
List<Integer> list = new ArrayList<>();
//1.3具體的買牌操作
//普通牌:52
String[] colors = {"紅桃","黑桃","梅花","方塊"};
String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
int num = 0;//表示牌的編号
//通過循環嵌套 造普通牌
//外循環一次,内循環一圈
for (String number:numbers){
//外循環擷取所有的點數
for (String color:colors){
//内循環擷取所有的花色
String poker = color + number;
//将牌的編号,具體的牌放到雙列集合中
pokers.put(num,poker);
//将牌的編号放到單列集合中
list.add(num);
//每添加一張牌,編号要自增
num++;
}
}
//大小王
//添加小王
pokers.put(num,"小王");
list.add(num++);
//添加大王
pokers.put(num,"大王");
list.add(num++);
//列印牌
System.out.println("所有的牌:" + pokers);
System.out.println("牌的編号:" + list);
}
}
步驟二、三:洗牌和發牌
分析:
1.使用Collections工具類的shuffle()方法打亂牌堆集合的順序
2.分别建立三個玩家集合對象和底牌集合對象
3.周遊牌堆的每一張牌,分别将索引對3取模的值為0,1,2的牌存放到三個玩家集合中,将最後三張存放到底牌集合中
package cn.itcast.demo17;
import java.util.*;
/*
需求:模拟鬥地主發牌
步驟:
1.買牌
2.洗牌
3.發牌
4.看牌
*/
public class SendPokerTest {
public static void main(String[] args) {
//1.買牌
//1.1定義一個雙列集合,鍵:表示牌的編号,值:表示具體的牌。規則:編号越小。牌越小
Map<Integer, String> pokers = new HashMap<>();
//1.2定義一個單列集合,用來存儲所有牌的編号
List<Integer> list = new ArrayList<>();
//1.3具體的買牌操作
//普通牌:52
String[] colors = {"紅桃", "黑桃", "梅花", "方塊"};
String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
int num = 0;//表示牌的編号
//通過循環嵌套 造普通牌
//外循環一次,内循環一圈
for (String number : numbers) {
//外循環擷取所有的點數
for (String color : colors) {
//内循環擷取所有的花色
String poker = color + number;
//将牌的編号,具體的牌放到雙列集合中
pokers.put(num, poker);
//将牌的編号放到單列集合中
list.add(num);
//每添加一張牌,編号要自增
num++;
}
}
//大小王
//添加小王
pokers.put(num, "小王");
list.add(num++);
//添加大王
pokers.put(num, "大王");//添加完大王就是最後一張牌了不需要加加
list.add(num);
//列印牌
System.out.println("所有的牌:" + pokers);
System.out.println("牌的編号:" + list);
//2.洗牌
Collections.shuffle(list);
System.out.println("洗好牌後,編号為:" + list);
//3.發牌
//3.1定義4個集合,分别表示3個玩家,底牌
List<Integer> qiaofeng = new ArrayList<>();
List<Integer> xuzhu = new ArrayList<>();
List<Integer> duanyu = new ArrayList<>();
List<Integer> dipai = new ArrayList<>();
//3.2具體的發牌動作,将索引和3取模,決定發給誰
for (int i = 0; i < list.size(); i++) {
//擷取編号
Integer pokerNum = list.get(i);
System.out.println(pokerNum);
if (i >= list.size() - 3) {
//底牌
dipai.add(pokerNum);
} else if (i % 3 == 0) {
qiaofeng.add(pokerNum);
} else if (i % 3 == 1) {
xuzhu.add(pokerNum);
} else if (i % 3 == 2) {
duanyu.add(pokerNum);
}
}
//3.3檢視玩家,底牌的編号
System.out.println("qiaofeng: " + qiaofeng);
System.out.println("xuzhu: " + xuzhu);
System.out.println("duanyu: " + duanyu);
System.out.println("dipai: " + dipai);
}
}
步驟四:看牌
分析:
1.将玩家集合中的牌按自然順序進行排序
```java
Collections.sort(List);
```
2.列印玩家集合中的牌
3.重複上面的操作列印所有玩家的牌和底牌
package cn.itcast.demo17;
import javax.print.attribute.EnumSyntax;
import java.util.*;
/*
需求:模拟鬥地主發牌
步驟:
1.買牌
2.洗牌
3.發牌
4.看牌
*/
public class SendPokerTest {
public static void main(String[] args) {
//1.買牌
//1.1定義一個雙列集合,鍵:表示牌的編号,值:表示具體的牌。規則:編号越小。牌越小
Map<Integer, String> pokers = new HashMap<>();
//1.2定義一個單列集合,用來存儲所有牌的編号
List<Integer> list = new ArrayList<>();
//1.3具體的買牌操作
//普通牌:52
String[] colors = {"紅桃", "黑桃", "梅花", "方塊"};
String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
int num = 0;//表示牌的編号
//通過循環嵌套 造普通牌
//外循環一次,内循環一圈
for (String number : numbers) {
//外循環擷取所有的點數
for (String color : colors) {
//内循環擷取所有的花色
String poker = color + number;
//将牌的編号,具體的牌放到雙列集合中
pokers.put(num, poker);
//将牌的編号放到單列集合中
list.add(num);
//每添加一張牌,編号要自增
num++;
}
}
//大小王
//添加小王
pokers.put(num, "小王");
list.add(num++);
//添加大王
pokers.put(num, "大王");//添加完大王就是最後一張牌了不需要加加
list.add(num);
//列印牌
System.out.println("所有的牌:" + pokers);
System.out.println("牌的編号:" + list);
//2.洗牌
Collections.shuffle(list);
System.out.println("洗好牌後,編号為:" + list);
//3.發牌
//3.1定義4個集合,分别表示3個玩家,底牌
List<Integer> qiaofeng = new ArrayList<>();
List<Integer> xuzhu = new ArrayList<>();
List<Integer> duanyu = new ArrayList<>();
List<Integer> dipai = new ArrayList<>();
//3.2具體的發牌動作,将索引和3取模,決定發給誰
for (int i = 0; i < list.size(); i++) {
//擷取編号
Integer pokerNum = list.get(i);
System.out.println(pokerNum);
if (i >= list.size() - 3) {
//底牌
dipai.add(pokerNum);
} else if (i % 3 == 0) {
qiaofeng.add(pokerNum);
} else if (i % 3 == 1) {
xuzhu.add(pokerNum);
} else if (i % 3 == 2) {
duanyu.add(pokerNum);
}
}
//3.3檢視玩家,底牌的編号
/* System.out.println("qiaofeng: " + qiaofeng);
System.out.println("xuzhu: " + xuzhu);
System.out.println("duanyu: " + duanyu);
System.out.println("dipai: " + dipai);*/
System.out.println("================================");
//4.檢視具體的編号
/*String str = printPoker(qiaofeng,pokers);
System.out.println("qiaofeng: " + str);*/
//下面的是上面注釋了的代碼的優化
System.out.println("qiaofeng: " + printPoker(qiaofeng,pokers));
System.out.println("xuzhu: " + printPoker(xuzhu,pokers));
System.out.println("duanyu: " + printPoker(duanyu,pokers));
System.out.println("dipai: " + printPoker(dipai,pokers));
}
/*
4.定義一個方法,用來看牌
方法名:printPoker
參數清單:List<Integer>,Map<Integer,String>
傳回值:String
*/
public static String printPoker(List<Integer>nums,Map<Integer,String>pokers){
//1.對牌的編号進行升序排列
Collections.sort(nums);
//2.周遊牌的編号集合,擷取到每一個編号
StringBuilder sb = new StringBuilder();
for (Integer num : nums) {
//num就是要查找的具體牌的編号
//3.根據編号去雙列集合中查找該編号對應的具體牌
String poker = pokers.get(num);
//4.将擷取到的牌進行拼接
sb.append(poker + " ");
}
//5.将最後拼接結果傳回即可
String str = sb.toString();
return str.trim();//去掉首尾空格
}
}