Java模拟斗地主发牌

/*

  • 需求:模拟斗地主发牌
  •  步骤:
    
  •  	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 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 zhaosi = new ArrayList<>();
	List liuneng = new ArrayList<>();
	List xieguangkun = new ArrayList<>();
	List 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,Map
 * 		返回值:String
 */
public static String prinfPoker(List nums,Map 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();
	
}	

}

最终结果:
Java模拟斗地主发牌_第1张图片

你可能感兴趣的:(Java模拟斗地主发牌)