/*
- 需求:模拟斗地主发牌
步骤:
1、买牌
2、洗牌
3、发牌
4、看牌
- 洗牌和发牌:
1、使用Collection工具类的shuffle()方法打乱牌堆集合的顺序
2、分别创建三个玩家集合对象和底牌集合对象
3、遍历牌堆的每一张牌,分别将索引对3取模的值为0,1,2的牌存放到三个
玩家集合中,将最后三张存放到底牌集合中
- 看牌
1、将玩家集合中的牌按自然顺序进行排序
Collection.sort(List);
2、打印玩家集合中的牌
3、重复上面的操作打印所有玩家的牌和底牌
*/`
//如果扑克牌花色打印出来全是“?”
则进行如下修改:
1、windows->Preferences…打开"首选项"对话框,左侧导航树,导航到 general->Workspace,右侧Text file encoding,选择Other,改变为UTF-8,以后新建立工程其属性对话框中的Text file encoding即为UTF-8。
2、windows->Preferences…打开"首选项"对话框,左侧导航树,导航到 general->Content Types,右侧Context Types树,点开Text,选择Java Source File,在下面的Default encoding输入框中输入UTF-8,点Update,则设置Java文件编码为UTF-8。import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SendPokerTest {
public static void main(String[] args) {
//1、买牌
//1.1、 定义一个双列集合,键:表示牌的编号,值:表示具体的牌
// 规则:编号越小,牌越小
Map<Integer, String> pokers = new HashMap<>();
//1.2定义一个单列集合,用来存储所有牌的编号
List 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; //表示牌的编号
//通1过循环嵌套,造 普通牌
for (String number : numbers) { //外循环,获得所有的点数
for (String color : colors) { //内循环,获取所有的花色
String poker = color + number;
//将牌的编号,具体的牌放到双列集合中
pokers.put(num, poker);
//将牌的编号放到单列集合中
list.add(num);
//每添加一张牌,编号要自增1
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> zhaosi = new ArrayList<>();
List<Integer> liuneng = new ArrayList<>();
List<Integer> xieguangkun = new ArrayList<>();
List<Integer> dipai = new ArrayList<>();
//3.2 具体的发牌动作,将索引对3取模,决定发给谁
for (int i = 0; i < list.size(); i++) {
//获取编号
Integer pokerNum = list.get(i);
if(i>=list.size()-3){
//底牌
dipai.add(pokerNum);
}else if(i%3==0){
zhaosi.add(pokerNum);
}else if(i%3==1){
liuneng.add(pokerNum);
}else if(i%3==2){
xieguangkun.add(pokerNum);
}
}
/*//3.3 查看玩家,底牌的编号
System.out.println("zhaosi: "+zhaosi);
System.out.println("liuneng: "+liuneng);
System.out.println("xieguangkun: "+xieguangkun);
System.out.println("dipai: "+dipai);*/
//4.查看具体的牌
System.out.println("---------------");
/*String str = prinfPoker(zhaosi,pokers);
System.out.println("zhaosi: "+str);*/
System.out.println("zhaosi: "+prinfPoker(zhaosi,pokers));
System.out.println("liuneng: "+prinfPoker(liuneng,pokers));
System.out.println("xieguangkun: "+prinfPoker(xieguangkun,pokers));
System.out.println("dipai: "+prinfPoker(dipai,pokers));
}
/*
* 4、定义一个方法,用来看牌
* 方法名:printPoker
* 参数列表:List<Integer>,Map<Integer,String>
* 返回值:String
*/
public static String prinfPoker(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();
}
}
最终结果: