本文共 3454 字,大约阅读时间需要 11 分钟。
简述:
7个球(6个红球和1个蓝球,红球的数字范围在1-33,蓝球的数字范围在1-16)上的数字组成的号码(随机生成),与用户输入的值进行对比,不需要顺序一致,值对就可以。 一开始想的用switch去实现中奖的情况,但发现case里面还得再嵌套switch,想想就头大,不喜欢这样嵌套,之后改起来逻辑也不方便,干嘛自己找苦吃。还是乖乖选择了if-elseif-elseif-…-else分支,不动脑的福音。
- 1.一行接受接受多个数字(因为想一次性收到用户的输入值,循环不合适) 原来 nextInt()方法可以接受多个值,在一行内,多个用空格隔开,但是逗号隔开不行,我试了。应该还有可以通过逗号来分割的方式。先规定好分隔符,然后一次性存入String数组,然后转换成对象所需的数据类型即可。需要用到String对象spilt(String regex)方法
- 2.随机数范围的指定 参数:(最大值-最小值+1)+最小值
还是直接来代码直接:
因为nextInt(int bound)方法(bound需大于0,不然抛出非法参数异常)返回的是[0,bound)的随机数,注意区间,左闭右开。
理解:实际是括号里就是区间长度,之所以加一是因为被减数本身没有算做一个,而在这里需要纳入计算;之所以最后加最小值,是为了设定最低值,因为如果产生0,加上最小值就是最小值。
例如: 随机生成两位数:nextInt(90)+10 范围:10~99 即99-10+1=90 随机生成[1,100]: nextInt(100)+1 随机生成三位数:nextInt(900)+100 范围:100~999 代码如下:Random random = new Random();int randNumber =random .nextInt(MAX - MIN + 1) + MIN; // randNumber 将被赋值为一个 MIN 和 MAX 范围内的随机数
除了粗体解释部分自己理解外,该部分知识点来源于以下:
一行接受多个字符:
以逗号作为分隔的思路:/** * 测试分隔 */ System.out.println("请输入信息,逗号分隔:"); String input = sc.nextLine(); String[] arr = input.split(","); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }
正常的空格(一行内,回车视为结束)接受:
/** * 获取用户的红色球号 * * @return */ private static int[] getUserRedNum() { System.out.println("请输入6个红色球号[1-33],空格隔开"); int[] red = new int[6]; for (int i = 0; i < red.length; i++) { red[i] = sc.nextInt(); } return red; }
这个绝对酸爽,上午10点,除去吃饭和休息时间,一直到晚上10点,不过写完还是蛮有成就感的。虽然他简单。
放置一张我的逻辑图:
思路:一开始是计算最大最小小标,如果不合法就直接不赋值判断,返回false,后来情况多了,我直接丢在异常里。捕获异常直接设置该方式查找结果为false。
贴上一部分判断:/** * 判断斜边是否出界 * * @param abscissa * @param ordinate * @return */ private static boolean outOfRangeAtSlope(int abscissa, int ordinate) { if ((abscissa + 2 + 1 > chessboard.length || abscissa - 2 < 0) || (ordinate + 2 + 1 > chessboard.length || ordinate - 2 < 0)) { return true; } return false; }
上述方式太麻烦了,后面统一换成这样(部分,其他思路一致):
// 3.右上零左下四4.右上三左下一5.右上四左下零 int value3 = chessboard[abscissa][ordinate]; try { a[0] = chessboard[abscissa + 1][ordinate - 1]; a[1] = chessboard[abscissa + 2][ordinate - 2]; a[2] = chessboard[abscissa + 3][ordinate - 3]; a[3] = chessboard[abscissa + 4][ordinate - 4]; for (int i = 0; i < a.length; i++) { if (value3 != a[i]) { m = false; break; } } } catch (Exception e1) { m = false; }
关键我觉得这个肯定可以抽象出一个方法,不用这么麻烦,后面调用就可以了。时间太晚了,就没做了,总体功能上没有问题。优化下次吧。
1.整型数组初始化全为0,不需要自己赋值0;
2.落子判断: 1).是否超越棋盘(数组的数字由用户做的才有这个问题),超过下标又是超出数组异常,存不进去; 2).落子点是否有子。刚开始逻辑写反了,一直不让落子,论规范命名的重要性! 3.异常。当捕获到异常后,不会执行try语句块里抛出异常后面语句,如果catch语句中没有异常抛出,则执行catch语句中内容,最后会执行try-catch语句块外的部分;如果是用throw new Exception("我是异常提示!");System.out.println("出现异常啦!");//该语句不会执行,编译错误
则不会执行抛出异常后面语句
4.求二维数组的长度 遍历二维数组的长度,我居然只用了一个for循环,唔,这么说也没错,不过我想求的是总行数*总列数的个数,也就是一共多少个元素。 代码://给定一个数组int[][] arr = new int[4][5];//计算行的长度:4int length1 = arr.length;//计算列的长度:5int length2 = arr[0].length;//已上复制下面参考文档,方便之后自己看/***自己写的部分代码:*循环遍历二维数组*/ for (int i = 0; i < chessboard.length; i++) { // 循环二维数组 for (int j = 0; j < chessboard[i].length; j++) { System.out.print("\t" + chessboard[i][j]); } System.out.println(); }
共4个:
1. 棋盘显示问题,不过还没有时间思考。 我想让他共用一个起始0,就是行号和列号的0共用一个,并且都以A作为起始点。 如图:3.那个五子棋能不能看看更改颜色或者划线做提示之类的;
4.eclipse字体也没试,乘法表那个。
就到这了,晚安。
sue 2021年1月20日02:21:11转载地址:http://otyaz.baihongyu.com/