-
欢迎交流与探讨,玩家数和牌数可自由调整(不要超出牌的数量)
大神们可以指点下哪里可以优化!
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
提交
取消