依旧是两个程序:
搞了快半天才结束。不容易。
双色球
简述:
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)的随机数,注意区间,左闭右开。
理解:
范围内随机数公式:(最大值-最小值+1)+最小值
实际是括号里就是区间长度,之所以加一是因为被减数本身没有算做一个,而在这里需要纳入计算;之所以最后加最小值,是为了设定最低值,因为如果产生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];
//计算行的长度:4
int length1 = arr.length;
//计算列的长度:5
int 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作为起始点。
如图:
2.对于用户的输入的键盘坐标不是横纵分开接受,考虑一起接受,提升友好性;
3.那个五子棋能不能看看更改颜色或者划线做提示之类的;
4.eclipse字体也没试,乘法表那个。
就到这了,晚安。
sue
2021年1月20日02:21:11