黑马程序员——java集合之斗地主和升级的集合运用总结

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

运用集合编写斗地主发牌小程序,改写后可以实现每个人手中的牌按照斗地主规则中牌值的大写顺序发到每个玩家的手中

进而纸牌类的另一个经典的游戏—升级的发牌动作也可以同理实现,现整理出斗地主以及升级的程序代码

一、斗地主发牌并保证玩家牌值排列

1.创建结合用于存储数字和花色

2.像集合中添加元素,可以使用集合工具类一次性添加完成

3.将花色和对应的数字组合起来,注意,外循环是数字,为后面牌值发到玩家手中的排序做准备

4.定义牌值大小比较的双列集合规定每个组合后的牌值大小

5.定义玩家和底牌

6.定义集合作为双列集合中对应的键,使用集合工具类将元素乱序排列

7.遍历双列集合,将乱序的集合元素作为参数获取值发放到每个玩家和底牌中

8.打印测试每次发牌结果

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Set;
import java.util.TreeMap;

public class KaPai2 {

	public static void main(String[] args) {
//		定义花色和牌值
		String [] s1 = new String[]{"♥","♠","◆","♣"};
		String [] s2 = new String[]{"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
//		定义玩家
		ArrayList<String> cards = new ArrayList<String>();
		ArrayList<String> card = new ArrayList<String>();
		ArrayList<String> p1 = new ArrayList<String>();
		ArrayList<String> p2 = new ArrayList<String>();
		ArrayList<String> p3 = new ArrayList<String>();
		
//		拼牌
		for (int i = 0; i < s1.length; i++) {
			
			for (int j = 0; j < s2.length; j++) {
				cards.add(s1[i]+s2[j]);
			}				
				
		}
			cards.add("★★");
			cards.add("☆☆");
			System.out.println(cards);
////		洗牌
//		Random r = new Random();
//		while(cards.size()!=0){
//			int ri = r.nextInt(cards.size()+1);
//			p1.add(cards.get(ri));
//			
//		}
//		
//				System.out.println(p1);
//			洗牌
			Collections.shuffle(cards);
			System.out.println(cards);
//			发牌
			for(int i = 0;i<cards.size();i++){
				if(i>=cards.size()-3){
					card.add(cards.get(i));
				}
				if(i%3==0){                         // 至于取模的应用,一般是想要把一个数据组进行平均或者近似平均的分配的时候
													// 当时没有想到这么个用法,请切记!!!
					p1.add(cards.get(i));
				}
				else if(i%3==1){
					p2.add(cards.get(i));
				}
				else if(i%3==2){
					p3.add(cards.get(i));
				}
			}
				System.out.println(p1);
				System.out.println(p2);
				System.out.println(p3);
				System.out.println(card);
				
				System.out.println("=======================================================================");
				
//				牌已经整理出来了,现在的需求是怎么让发到玩家手里的牌是按照斗地主的实际大小顺序排列的
/*	
 * 	斗地主的排列顺序:
 */				
//				思路:
//					1.首先定义一个斗地主实际牌值的大小顺序的”字典“的集合,可以使用Collections的集合工具类
//					2.
				
//				定义集合记录所有牌中的数字
				ArrayList<String> num = new ArrayList<>();
				Collections.addAll(num, "3","4","5","6","7","8","9","10","J","Q","K","A","2");
//				定义集合记录所有的花色
				ArrayList<String> color = new ArrayList<>();
				Collections.addAll(color, "♥","♠","◆","♣");
//				定义一个集合来存储新牌
//				HashMap<String, String> cards_ = new HashMap<>();
////				遍历制作出一副新牌                                                                                         方法失败的原因是map集合中的键的唯一性
//				for(int i =0;i<num.size();i++){
//					for(int j=0;j<color.size();j++){
//						
////						cards_.put(color.get(j),num.get(i));
//						cards_.put(num.get(i),color.get(j));
//					}
//				}
//				System.out.println(cards_);
//				System.out.println(num.get(2));
				
//				定义一个纸牌字典,用来记录牌值之间的大小关系
				
				HashMap<Integer, String> dic = new HashMap<>();
				
//				定义索引记录牌的数字
				int index = 1;
						
//				双层循环用来把纸牌字典中代表牌子打下的数字和纸牌的牌值一起对应起来
				for (String num1 : num) {
					
					for (String color1 : color) {
						
						dic.put(index, color1+num1);             //这个地方的设计一气呵成,将定义的牌值字典和对应的牌值一块做出来
						index++;
					}
				}
//				将大小王加入到牌值大小字典中
						dic.put(53, "☆☆");
						dic.put(54, "★★");
					System.out.println(dic);
					
//				洗牌,但是洗牌调用的shuffle方法只能是collection集合中才能使用,所以要定义集合记录这幅牌,实际上是dic集合中的数字
				
				ArrayList<Integer> cards_ = new ArrayList<Integer>();				
				
//				买一副新牌,实际就是在cards集合中添加对应的牌值大小的元素
				
				for (int i = 1; i <= 54; i++) {
					cards_.add(i);
				}
//				洗牌  : 此时可以调用collection集合的工具类来随机打乱集合中的 顺序
				Collections.shuffle(cards_);
				System.out.println(cards_);
				
//				创建玩家和底牌                                              考虑到要让玩家手里的牌是有序的,切按照我们自定义的格式输出,所以使用的是TreeMap集合
				TreeMap<Integer,String> player1 = new TreeMap<Integer,String>();				
				TreeMap<Integer,String> player2 = new TreeMap<Integer,String>();				
				TreeMap<Integer,String> player3 = new TreeMap<Integer,String>();				
				TreeMap<Integer,String> dipai = new TreeMap<Integer,String>();				
				
//				发牌
				for (int i = 0; i < cards_.size(); i++) {
					if (i>=cards_.size()-3) {
						dipai.put(cards_.get(i), dic.get(cards_.get(i)));
					}
					else {
						if (i%3==0) {
							player1.put(cards_.get(i), dic.get(cards_.get(i)));
						}
						else if (i%3==1) {
							player2.put(cards_.get(i), dic.get(cards_.get(i)));
						}
						else if (i%3==2) {
							player3.put(cards_.get(i), dic.get(cards_.get(i)));
						}
					}
				}
					System.out.println(player1);
					System.out.println(player2);
					System.out.println(player3);
					System.out.println(dipai);
					
					System.out.println("==========================================================");
					
//				达到这种效果之后发现牌值不是玩家所想看到的,因此需要遍历这个双列集合来按照所需要的格式显示发到手里的牌
					
				method(player1);
				method(player2);
				method(player3);
				method(dipai);
	}
//定义一个来用来用所需要的格式来遍历玩家手中的双列集合
		public static void method(TreeMap<Integer,String> treemap){
			
			Set<Integer> keySet = treemap.keySet();                 //  返回的Set集合必须加泛型,否则报错,而且不好修改
				System.out.print("[");													//   以后切记只要是集合就最后加上泛型!!!!!!!!!
			for (Integer key : keySet) {
				System.out.print(treemap.get(key)+" ");
			}
				System.out.print("]");
				System.out.println();
		}
}


依据上述斗地主程序的详细结果,同理得到升级发牌的小程序

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeMap;

/*
 * 	依据斗地主程序模拟升级的洗牌发牌
 */
public class ShengJi {

	public static void main(String[] args) {
//		定义牌上的数字
		ArrayList<String> num = new ArrayList<String>();
//		定义牌上的花色
		ArrayList<String> color = new ArrayList<String>();
//		用集合工具类的方式给牌添加元素
		Collections.addAll(num, "3","3","4","4","5","5","6","6","7","7","8","8","9","9","10","10","J","J","Q","Q","K","K","A","A","2","2");
		Collections.addAll(color, "♥","♠","◆","♣");

//		定义一个牌值字典和牌值对应关系的集合
		HashMap<Integer, String> hashMap = new HashMap<>();
//		定义 一个索引
		int index = 1;                                             //定义这索引的目的是由于双层 for循环的只能给hashMap中的值拼接起来
																	// 而键的索引是内外层循环的总和,所以需重新定义,请记住这个思想!!!
//		向牌值的集合中添加元素
		for (int i = 0; i < num.size(); i++) {
			for (int j = 0; j < color.size(); j++) {
				hashMap.put(index, color.get(j)+num.get(i));
				index++;
			}
		}
//		向牌值集合中加入两副牌的大小王
			hashMap.put(105, "☆☆");
			hashMap.put(106, "☆☆");
			hashMap.put(107, "★★");
			hashMap.put(108, "★★");
			System.out.println(hashMap);
//			定义一个比较牌值大小的卡牌字典
		ArrayList<Integer> n = new ArrayList<Integer>();
		for (int i = 1; i <=108; i++) {                               //发现一个小细节:<= 必须写一块,中间不能有空格!
			n.add(i);
		}
//		洗牌
		Collections.shuffle(n);
		
			 //当时做到这一步发现定义的牌值字典和牌值之间的关系的时候没有考虑 到洗牌
			// 翻看笔记的时候是直接将牌值字典打乱后然后定义玩家和底牌,这样再把牌值字典和
			// 玩家发牌一气呵成!!!			                                                       
		
//		定义的玩家和底牌
		TreeMap<Integer,String> p1 = new TreeMap<Integer, String>();
		TreeMap<Integer,String> p2 = new TreeMap<Integer, String>();
		TreeMap<Integer,String> p3 = new TreeMap<Integer, String>();
		TreeMap<Integer,String> p4 = new TreeMap<Integer, String>();
		TreeMap<Integer,String> dipai = new TreeMap<Integer, String>();
//		发牌	
		for (int i = 0; i < n.size(); i++) {
			
			if (i>=n.size()-8) {
				dipai.put(n.get(i), hashMap.get(n.get(i)));
			}
			else {
				if (i%4==0) {
					p1.put(n.get(i), hashMap.get(n.get(i)));
				}
				else if (i%4==1) {
					p2.put(n.get(i), hashMap.get(n.get(i)));
				}
				else if (i%4==2) {
					p3.put(n.get(i), hashMap.get(n.get(i)));
				}
				else if (i%4==3) {
					p4.put(n.get(i), hashMap.get(n.get(i)));
				}
			}
		}
		System.out.println("=================");
			System.out.println(p1);
			System.out.println(p2);
			System.out.println(p3);
			System.out.println(p4);
			System.out.println(dipai);
//		现在玩家手里的牌是带有牌值数字,现在去掉该牌值大小的数字	
		System.out.println("=================");
		
//		获取treeMap集合中的值的collection集合,将其封装成一个方法,这是优化了老师的使用keyset键值的set集合去遍历获取值的方法
		method(p1);
		method(p2);
		method(p3);
		method(p4);
		method(dipai);
	}
//		封装一个方法用来获取hashMap中键所对应的值 
	public  static void method(TreeMap<Integer,String> tree){
		Collection<String> values = tree.values();
		for (String string : values) {
			System.out.print(string+" ");
		}
			System.out.println();
	}
}


总结:通过以上两个小程序,发现集合中实现同一个需求的方式有很多种,可以灵活运用集合工具类提供的方法快速的达到所需效果

你可能感兴趣的:(java,黑马程序员,斗地主程序,集合应用,升级程序)