/*

  • 需求:模拟斗地主发牌
步骤:
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();
	
}

}

最终结果:

模拟人工发牌并简单比较牌的大小python java模拟发牌_java