博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java笔记1.20
阅读量:621 次
发布时间:2019-03-13

本文共 3454 字,大约阅读时间需要 11 分钟。

1.20java笔记

依旧是两个程序:
搞了快半天才结束。不容易。

双色球

简述:

 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];//计算行的长度: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作为起始点。
如图:
希望共用0
2.对于用户的输入的键盘坐标不是横纵分开接受,考虑一起接受,提升友好性;

3.那个五子棋能不能看看更改颜色或者划线做提示之类的;

4.eclipse字体也没试,乘法表那个。


就到这了,晚安。

                                                 sue
                                                 2021年1月20日02:21:11

转载地址:http://otyaz.baihongyu.com/

你可能感兴趣的文章