java笔记1.20

这篇博客介绍了Java编程中如何生成双色球随机号码,包括利用nextInt()方法生成指定范围内的随机数,并讨论了用户输入处理。此外,还分享了五子棋游戏的实现过程,包括处理数组下标超出范围的问题和异常处理。博主通过绘制逻辑图和优化代码来提高程序的效率和可读性。
摘要由CSDN通过智能技术生成


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

双色球

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

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

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


就到这了,晚安。
                                                 sue
                                                 2021年1月20日02:21:11

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值