为了账号安全,请及时绑定邮箱和手机立即绑定

Java入门第三季

难度入门
时长 5小时 0分
学习人数
综合评分9.50
1125人评价 查看评价
9.7 内容实用
9.4 简洁易懂
9.4 逻辑清晰
  • 欢迎交流与探讨,玩家数和牌数可自由调整(不要超出牌的数量)

    大神们可以指点下哪里可以优化!

    package com.game;
    
    import java.util.*;
    
    public class Cars implements Comparable<Cars>{
        private List<Cars> cars;
        private Map<Integer,PlayerInfo> player;
        private int player_num = 2;//玩家数
        private int car_num = 2;//每人发牌张数
        private Integer pai_key;//牌的键值,用于比较大小
        private String pai_value;//牌的名称
    
        public Cars(){
            this.cars = new ArrayList<>();
            this.player = new HashMap<>();
        }
    
        public Cars(int pai_key,String pai_value){
            this.pai_key = pai_key;
            this.pai_value = pai_value;
        }
    
        /**
         * 创建手牌(按从小到大的方式,方便后面的比较)
         */
        public void createCars(){
            System.out.println("===================创建一副手牌=====================");
            String[] pai = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
            String[] hua = {"方块","梅花","红桃","黑桃"};
    
            int p_key = 0;
            for (String p:pai){
                for (String h:hua) {
                    System.out.print(h + p + " ");
                    cars.add(new Cars(p_key,h + p));
                    p_key++;
                }
            }
            System.out.println("\n");
        }
    
        //创建玩家
        public void createPlayer(){
            System.out.println("=====================创建游戏玩家===================");
            Scanner console = new Scanner(System.in);
            int num = 0;
            while (num < player_num){
                System.out.println("请输入玩家ID");
                if(console.hasNext()){
                    String id = console.next();
                    //不创建名称了,直接用id代替
                    player.put(num,new PlayerInfo(id,id));
                    System.out.println("成功创建玩家 " + id);
                    num++;
                }
            }
        }
    
        /**
         * 洗牌并发牌
         */
        public void deal(){
            System.out.println("======================开始发牌======================");
            //打乱牌的顺序
            Collections.shuffle(cars);
            //发牌次数 = 玩家数*每人张数
            for (int i=0;i< (this.player_num * this.car_num);i++){
                //本轮获得牌的玩家player的key
                Integer player_num = i%this.player_num;
                //获取玩家对象
                PlayerInfo player = this.player.get(player_num);
                Cars car = this.cars.get(i);
                player.carList.add(car);
                System.out.println("玩家 " + player.id + " 获得手牌:" + car.pai_value);
            }
        }
    
        /**
         * 比较大小
         */
        public void winner(){
            System.out.println("======================比较大小======================");
            Set<Integer> keySet = this.player.keySet();
            int max = -1;
            String win = "";
            for (int p_key:keySet){
                PlayerInfo play = player.get(p_key);
                //按牌的key大小进行排序
                Collections.sort(play.carList);
                Cars max_car = play.carList.get(0);
                int tmp_max = max_car.pai_key;
                if (tmp_max > max){
                    win = play.id;
                    max = Math.max(max,tmp_max);
                }
                System.out.println("玩家 " + play.id + " 最大手牌 : " + max_car.pai_value);
            }
            System.out.println("玩家 " + win + " 获胜!!!");
        }
    
    
        public static void main(String[] args) {
            Cars game = new Cars();
            game.createCars();
            game.createPlayer();
            game.deal();
            game.winner();
        }
    
        @Override
        public int compareTo(Cars o) {
            return o.pai_key.compareTo(this.pai_key);
        }
    }
    package com.game;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class PlayerInfo{
        public String id;
        public String name;
        public List<Cars> carList;//手牌
    
        public PlayerInfo(String id,String name){
            this.id = id;
            this.name = name;
            this.carList = new ArrayList<>();
        }
    
    }


    查看全部
  • 躺枪的永远是XiaoMing
    查看全部
  • public String testRandomString(){ StringBuilder stringBuilder = new StringBuilder(); //存放所包含字符62位 String container = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; Random random = new Random(); int num = 0; while(num == 0){ num = random.nextInt(10); } for(int i = 0; i < num; i++){ int index = random.nextInt(61); stringBuilder.append(container.charAt(index)); } return stringBuilder.toString(); }
    查看全部
  • Math类操作数据 1、Math 类位于 java.lang 包中,包含用于执行基本数学运算的方法, Math 类的所有方法都是【静态方法】,所以使用该类中的方法时,可以直接使用类名.方法名,如: Math.round()。 2、常用方法: · Math.abs():取绝对值 · Math.random():随机返回[0,1)之间的一个double值,可*100 再 四舍五入 得到[0,100)的随机整数 · Math.pow(a,b):返回a的b次幂的值 · Math.rand():对浮点数进行四舍五入 · Math.ceil():返回大于参数的最小整数(double类型) · Math.floor():返回小于参数的最大整数(double类型) · Math.max(a,b):返回a,b中最大的数 · Math.min(a,b):返回a,b最小值
    查看全部
  • Set接口及其实现类——HashSet Set是元素无序并且不可以重复的集合,被称为集; HashSet——哈希集,是Set的一个重要实现类。 1、Set没有像List中set()方法一样就修改,因为List是有序的,可以指定位置,而Set是无序的。 2、查询遍历时,Set不能用get()方法去获取,因为无序没有指定索引ID,但可以使用foreach和iterator来遍历,但是每次遍历出来可能顺序都不一样,还是因为无序造成的。 3、Set中的size(),add(),addAll(),remove(),removeAll()与List类似。 4、Set还可以添加null;无序演示(如图) 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
  • 注意了这里关于使用 Set 集的 hashCode的方法,hashCode方法的工作原理是 Set.contains(E e)的时候,先调用从Object继承而来的hashCode方法,然后在调用equals()方法,连个方法都返回真的时候,才认定Set包含某个元素。jvm运行时,给每个对象分配唯一一个标志身份的标志hanshcode。众类鼻祖Object的hashCode()方法在默认情况下,判断哈希码是不是相同.即如同equals默认情况下比较的是二者是不是同一个内存快。Set集的contains方法,内部就是先调用hashCode再调用equals()方法。很多情况要结合实际对hashCode进行改写
    查看全部
  • 基本类型转换为字符串有三种方法: 1.包装类的toString()方法 2.String的valueOf()方法 3.用一个空字符串加上基本类型,得到的就是基本数据类型对应的字符串 eg:int c=10; String str1=Integer.toString(c); String str2=String.valueOf(c); String str3=c+" "; 将字符串转换成基本类型有两种方法: 1.包装类的parseXxx静态方法 2.调用包装类的valueOf()方法转换为基本数据类型的包装类,会自动拆箱 String str="8"; int a=Integer.parseInt(str); int b=Integer.valueOf(str); ps:其它基本数据类型与字符串的相互转换方法都类似。
    查看全部
  • throws放在参数后,方法体之前。可以抛出多种异常,每个异常之间用逗号隔开; throw写在方法体内; 如果某个方法调用了抛出异常的方法,那么必须添加try catch语句去尝试捕获这种异常, 或者添加声明,将异常抛出给更上一层的调用者进行处理? 可以自定义异常,基于Exception类或其子类;
    查看全部
  • 学和用果然是两个巨大的差别。学是往脑袋里填充知识,是顺着教学者的思路来的;而用则是需要自己去思考、发现和感悟,将你会的东西用出来,这也是一个过程。 在用的过程中才会有机会去更加深刻地明白为什么会这样,才会发现还可以有不只一种方法,总之你会遇到很多问题,碰到很多可能性,你有很多思路,又要去权衡它们之间的区别,这个过程大脑已经懂得了很多东西。 不要懒于动手,不要怕面对难的、大的项目,你还差很多,你若不吃苦,怎么还能去奢望成为高手。 勤于思考,勤于动手,勤于总结,勤于温故,勤于探讨。
    查看全部
  • 判断set中的课程是否存在? 使用set中的contains方法,set中调用contains(obj)方法,contains方法的实现机制:先调用object中的hashcode方法,再调用object中的equals方法。所以要对对象的hashcode()方法和equals方法重写,可以使用eclipse中的source>GENARATE hashcode(),在对象的类中,实现方法的重写。
    查看全部
  • String 对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同。 1、 通过 String s1="爱慕课"; 声明了一个字符串对象, s1 存放了到字符串对象的引用,常量字符串存储在堆内存中,s1只是对存放了到字符串的引用,通过 s1="欢迎来到:"+s1; 改变了字符串 s1 ,其实质是创建了新的字符串对象,变量 s1 指向了新创建的字符串对象,即使s1指向了另一块堆内存。 2、 一旦一个字符串在内存中创建,则这个字符串将不可改变。如果需要一个可以改变的字符串,我们可以使用StringBuffer或者StringBuilder(后面章节中会讲到)。 3、 每次 new 一个字符串就是产生一个新的对象,即便两个字符串的内容相同,使用 ”==” 比较时也为 ”false” ,如果只需比较内容是否相同,应使用 ”equals()” 方法(前面条件运算符章节讲过哦~~)
    查看全部
  • 我觉着 这里讲的还是非常好的 List 的 contains()方法的真是内幕是,主动便利List中的每一个元素,并使用Objet类的equals方法,和传进来的引用依次做比较,一旦发现传进来的对象和某个元素指向的是同一块内存那么就返回true。 知道contains方法的工作原理之后,就可以这样。这里还以courseToSelect序列为例,我穿进去的不是引用对象了,换成课程名称,也就是说,使用contains判断输入的名称是否为某值的课程。这是就是需要改写一下Course类的equals方法即可。 这里改写equals方法堪称经典模版 改写 比较两个引用指向内存的内容是不是相同 这是 是包含 二者指向同一个内存块的情况 public void equals (Object obj) { if(this == obj) // 指向同一个内存快 必然是相同的 returned true; //为什么contains(course2) 返回的是false 原因就在在这里 只是比较了一下 引用的值是否相同 没有进一步的比较 内存块中的值 下就是对这里记性了改写 if (obj == null) // 如果obj为空 就直接没有戏了 return false; if(! (obj instanceof Course)) //如果两者的不属于同一类型则 也直接没戏了 return false; //经过以上的这么多的比较 终于可以判断二者的值是不是相同了 //首相要把objet型的obj转成 Course Course course = (Course) obj; if( this.name == null ) { if(course.name == null ) return true; else return false; } else { if(this.name.equals(course.name)) return true; else return false; ) //如果还有别的属性接着写 }
    查看全部
  • 装箱之后 基本数据类型就变成了类 而类具有很多属性和方法 比如 int 装箱成Integer后 Integer.MAX_VALUE 就代表了int类型的最大值 Integer.toHexString可以将int类型的数值转变为字符串,而这些 int都做不到...
    查看全部
  • "a"是字符串(String) 'a'是字符(char)
    查看全部
  • public void testSort2() { List<String> strings = new ArrayList<String>(); String str = "0123456789abcdefghijklmnobqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; Random random = new Random(); for (int a = 0; a < 10; a++) { StringBuilder builder = new StringBuilder(); do { int j = random.nextInt(10) + 1; for (int i = 0; i < j; i++) { builder.append(str.charAt(random.nextInt(str.length()))); } } while (strings.contains(builder)); System.out.println("将要添加字符串"+builder); String s=builder.toString(); strings.add(s); } System.out.println("-----------排序前------------"); for (String string : strings) { System.out.println("元素"+string); } Collections.sort(strings); System.out.println("-----------排序后-----------"); for (String string : strings) { System.out.println("元素"+string); } } public static void main(String[] args) { CollectionTest collectionTest = new CollectionTest(); // collectionTest.testSort1(); collectionTest.testSort2(); }
    查看全部

举报

0/150
提交
取消
课程须知
此部分为 Java 课程的进阶内容,适合具有一定 Java 基础的伙伴们学习,如果您是新手,建议您移步 《Java入门第一季》 和 《Java入门第二季》,在理解并掌握面向对象相关知识后再回来进修。
老师告诉你能学到什么?
本课程将学习 Java 中的异常处理、集合框架、字符串、常用类等,逐步学习掌握 Java 高级技术。

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!