斗地主1.0
实现了 洗牌发牌看牌功能
工程图:
代码实现:
package swu.smxy.dwj; import sun.reflect.generics.tree.Tree; import java.sql.SQLOutput; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet; public class PokerDemo { public static void main(String[] args){ //1、创建HashMap集合,键是编号值是牌 HashMap<Integer,String> hm = new HashMap<Integer,String>(); //2、创建ArrayList集合,存储牌的编号 ArrayList<Integer> array = new ArrayList<Integer>(); //3、创建花色数组 ♥、♠、♦、♣ String colors[] = {"♥","♠","♦","♣"}; //4、创建点数数组 2、3、4、5、6、7、8、9、A String[] numbers = {"3","4","5","6","7","8","9","J","Q","K","A","2"}; //从3开始是因为斗地主中3最小 //5、从0开始往HashMap中存储编号和对应的牌,同时往ArrayList里面存储编号 int index = 0;//key、索引 for(String num:numbers){ for(String color:colors){ hm.put(index,color+num); array.add(index); index++; } } hm.put(index,"大王"); array.add(index); index++; hm.put(index,"大王"); array.add(index); //6、洗牌(洗的是编号),用Collections的shuffle()方法实现 Collections.shuffle(array); //发牌(发的也是编号),为了保证编号是排序的创建TreeSet集合接收; TreeSet<Integer> p1 = new TreeSet<Integer>(); TreeSet<Integer> p2 = new TreeSet<Integer>(); TreeSet<Integer> p3 = new TreeSet<Integer>(); TreeSet<Integer> dp = new TreeSet<Integer>(); for(int i=0;i<array.size();i++){ int index2 = array.get(i); if(i>=array.size()-3){ dp.add(index2); }else if(i%3==0){ p1.add(index2); }else if(i%3==1){ p2.add(index2); }else{ p3.add(index2); } } LookPoker("YOU",p1,hm);//调用看牌方法 LookPoker("ME",p2,hm); LookPoker("HE",p3,hm); } //7、定义方法看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌 public static void LookPoker(String name,TreeSet<Integer> ts,HashMap<Integer,String> hm){ System.out.println(name+"玩家的牌是:"); for(Integer key:ts){ String poker = hm.get(key); System.out.print(poker+" "); } System.out.println(); } } 结果展现:C:\Users\dwj13\IdeaProjects\JavaSe-code\out\production\FightAgainstLandlords" swu.smxy.dwj.PokerDemo YOU玩家的牌是: ♥3 ♠3 ♠4 ♣4 ♥6 ♥7 ♣7 ♠J ♥Q ♣Q ♥K ♦K ♣K ♠A ♦A ♦2 ME玩家的牌是: ♦3 ♥4 ♦4 ♦5 ♣5 ♥8 ♠8 ♦8 ♥9 ♥J ♦Q ♠K ♥A ♥2 ♠2 ♣2 HE玩家的牌是: ♣3 ♠5 ♠6 ♦6 ♣6 ♠7 ♦7 ♠9 ♦9 ♣9 ♦J ♠Q ♣A 大王 大王 Process finished with exit code 0 知识点总结:
1、collection接口主要用于存放单一元素;Map接口主要用于存放键值对
2、list 存储的元素是有序的可重复的、set存储的元素是无序的不可重复的、map(key、value)中key是无序的不可重复的,value是无序的可重复的
3、HashMap是Java中最常见的集合类框架,是键值类集合,其数据结构为:数组+(链表或红黑树),使得查询和插入删除效率都高,put(key,value)方法往集合中添加元素、get(key)方法获取值;
TreeSet集合中的元素无序且不可重复、但可以按照元素的大小顺序自动排序(以上实例有展现这点),底层是TreeMap(底层是平衡二叉树),即为可排序组合,对自定义类型不能进行排序,若要实现自定义类型的排序可以通过实现java.lang.Comparable接口或者在构造器TreeSet\TreeMap集合的时候传一个比较器对象;
ArrayList实现list接口底层为数组, ArrayList提供了add(E e)、add(int index, E element)、addAll(Collection<? extends E> c)、addAll(int index, Collection<? extends E> c)、set(int index, E element)这个五个方法来实现ArrayList增加;ArrayList提供了remove(int index)、remove(Object o)、removeRange(int fromIndex, int toIndex)、removeAll()四个方法进行元素的删除;ArrayList提供了get(int index)用读取ArrayList中的元素,arraylist擅长随机访问;
Collections :Java.util.Collections类下有一个静态的shuffle()方法,用默认随机源对列表进行置换,所有置换发生的可能性都是大致相等的。
4、数组特点:存储空间连续,底层为数组,随机访问性强查找速度快,时间复杂度O(1);插入删除数据效率低,大小固定不宜动态扩展,空间复杂度大。
链表特点:查询效率低、插入删除效率高
5、 HashMap底层逻辑详见HashMap 详解_与忘_的博客-CSDN博客
TreeSet自定义比较器详见TreeSet详解_午觉千万别睡过的博客-CSDN博客或视频讲解09_自然排序Comparable的使用_哔哩哔哩_bilibiliP245~P248
ArrayList详情见Java集合篇:ArrayList详解_张维鹏的博客-CSDN博客
Collections的shuffle()方法详见关于Collections.shuffle()方法_Cadence_D的博客-CSDN博客