五、人机猜拳游戏
5.1 项目分析
需求分析:
- 游戏界面的输出
- 游戏的初始化
- 人机对战
- 数据统计
5.2三种注释
-
类注释 /** * …* */:一般在类上面
-
多行注释 :如/**/ 一般用在代码内部
-
单行注释 : 如// 一般用在代码内部
注意:企业中要求,注释占30% ,提高代码的可读性
5.3几个快捷键
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+D 删除一行代码
- Ctrl+Z 撤销
- Ctrl+/ 给代码添加注释
- Ctrl+Shift+F --快速格式化代码
- Ctrl +Shift +O --导包
- syso --System.out.println()
- main --main方法
5.4 输出语句
- System.out.println():输出并换行
- System.out.print():输出不换行
- 如果想换行,有几种方法:
- 中间添加一行: System.out.println();
- 转义字符:\n System.out.print(“你好\n”);
5.5 转义字符
- \n —换行
- \t --制表符
- \ \ --代表\
- \ " --代表“
- \ ’ --代表’
5.6 变量
5.6.1 问题:程序是如何记忆数据或保存数据?
运行一个程序实际是启动一个进程,系统会为该进程分配内存空间,用来存储运行时数据,因此,程序是通过内存来记忆数据的
5.6.2 问题:内存是如何存储数据? – 比较抽象
生活中一个案例:住宾馆
宾馆 内存
开房间 在内存中开一个空间
房间类型(单人房、双人房、总统套房等) 空间类型(字符型、整数型等)
房卡(房间号码) 空间地址
入住客人 存储数据
5.6.3 变量含义:一个数据的存储空间表示
变量三元素:变量名、变量类型、变量值
5.7 变量的使用
需求: 存储一个人的姓名叫张浩,程序输出张浩信息
代码演示
/**
* hello
* @author windows
*
*/
public class Hello {
public static void main(String[] args){
//1.声明一个变量:变量类型 变量名
String name; //内存中开辟一个空间
//2.赋值 变量名 = 变量值
//让jvm帮开一个空间,数据放到空间中,赋值完毕,变量三要素正式确立
name = "张浩";
//3.使用变量
System.out.println("姓名叫"+name);//注意name变量没有被初始化会报错
}
}
5.7.1 变量的定义方式
-
标准形式
- 变量类型 变量名;
- 变量赋值 = 值;(注意空格)
- 使用变量
-
合写类型 --变量名 = 变量值
-
同时声明多个同类型变量
5.7.2 命名规范
- 首字母必须小写,其他满足驼峰命名
如: name、studentName
-
变量名可以以字母、_ 、$ 打头,其后可以是字母、数字、_ 、$,建议只用字母
-
不能用java关键字作为变量名 如class
5.8 变量类型
5.8.1 进制
- 十进制
- 二进制 --0b开头 如0b101
- 八进制 – 0 开头
- 十六进制 --0x开头
变量类型分为基本数据类型和引用数据类型(如数组、String、对象、集合等)
5.8.2 基本数据类型有8种
-
整数型:
byte:1 个字节(-128-127)
short: 2个字节
int: 4个字节 (默认值 0)
long:8个字节
-
浮点型:
float:4个字节 单精度
double:8个字节 双精度 (默认值 0.0)
-
字符型:
char:2个字节
- 区别String类型,如’男’,‘a’ 正确 ,’abc‘ 错误
- 参与运算:对应ASCII码,如 ‘A’ --65 ‘a’ --97 ‘0’ --48
- char c = ‘\u0041’; 十六进制,表示’A’
- 字符类型对应的是字符编码,存储一个英文字符是占1个字节,存储一个汉字字符,一般是占2个字节,在utf8格式下,是占3个字节
-
布尔型:
两种取值: 1个字节 true false(默认值)
5.8.3 基本类型之间转换
-
byte、short、char在计算时,可以自动转为int类型,运算结果类型也是为int类型
-
计算时,结果一般转为最大类型,高类型强制转为低类型:
如 int num = (int) 3.14; float f = 3.14123123141f
5.9 变量的动态赋值
需求:从键盘中接收一个人的姓名并输出
//方法二: alt+/或自动导入(注意看是否会导错包)
import java.util.Scanner;
/**
* 接收键盘输入
* @author windows
*
*/
public class Hello {
public static void main(String[] args){
System.out.println("请输入你的姓名:");
//Scanner类
//一般默认导入是java.lang包,其他的包需要手动导入
//方法一:java.util.Scanner in = new Scanner(System.in);
Scanner in = new Scanner(System.in);
String name = in.next();
System.out.println("你输入的姓名为:"+name);
}
}
5.10 完成人机对战初始化部分
package day1;
/**
* 人机对战游戏
* @author windows
*
*/
public class GuessFist {
public static void main(String[] args) {
// 1.游戏界面的输出
// 2.游戏的初始化
// 3.人机对战
// 4.游戏数据的统计
}
}
测试功能:
5.11 运算符
1) 赋值运算符 =
2) 算术运算符 + - * / %
- / --除数取整或浮点数 % --取的是余数
需求 从控制台输入一个四位整数,求出个位 + 十位 + 百位 + 千位 = ?
...
public class OperatorTest {
public static void main(String[] args) {
int a = 10;
int b = 3;
int c = a/b; //除数 取值是整数
int d = a%b; //余数
System.out.println(c);//3
System.out.println(d);//1
System.out.println("请输入一个四位整数:");
Scanner in = new Scanner(System.in);
int number = in.nextInt();
int ge = number%10;
int shi = number/10%10;
int bai = number/100%10;
int qian = number/1000;
System.out.println(shi);
System.out.println(ge + shi + bai + qian);
}
}
3) 关系运算符
> < = >= <= == !=
4) 逻辑运算符
&& 且 || 或 ! 非
- 短路现象:当&&的左边为false,发生短路,当||的左边为true时,发生短路
- 运算符优先级:() > ! >算术 >关系>逻辑>赋值
5) 三目运算符
语法:判断条件 ? 表达式1 : 表达式 2
注意:判断条件为true,则执行表达式1,若为false,则执行表达式2
....
//如果整除 则"偶数",反之"奇数"
int sum = ge + shi + bai + qian;
//三目运算符 ---判断条件? 表达式1:表达式2
System.out.println(sum % 2 == 0 ? "整数":"奇数");
6) 自增自减
++i i++ --i i–
public class Test {
public static void main(String[] args) {
int i = 1;
int j = i++; //先取值再运算 int i = 1;int temp = i + 1;i = temp
System.out.println(i); // 2
System.out.println(j); // 1 先取值再运算
int n = 1;
int m = ++n;
System.out.println(n); //2
System.out.println(m);// 2先运算再赋值
}
}
7)复合运算
+= -= *= /= %=
- =右边比较复杂时,把右边作为一个整体
public class Test {
public static void main(String[] args) {
int score = 2;
//score = score + 2; 等价于下面
score += 2;
System.out.println(score);
}
}
8)位运算
5.12 条件语句
-
if(条件){
表达式;
}
-
if(条件){
表达式;
}else{
表达式;
}
-
if(条件){
表达式;
}else if(条件){
表达式;
…
}else{
表达式;
}
补充:
企业中,一个项目可能有很多人参与,每个人在自己本地电脑上写自己的代码,最终我们需要把代码合并到一 起。
如何合并呢?挨个拷贝吗?效率高吗?安全吗?
作为一个项目负责人,怎么办?天天坐办公室看着吗?急切需要一个可靠的版本管理工具,市场上有很多,早期有cvs、svn、github等
以svn为例:
需求:输入今天的温度值,如果大于等于36度,吃可爱多,反之,喝矿泉水
public class Test {
public static void main(String[] args) {
//需求:输入今天的温度值,如果大于等于36度,吃可爱多,反之,喝矿泉水
System.out.println("请输入今天的气温:");
Scanner in = new Scanner(System.in);
double temperature = in.nextDouble();
if (temperature >= 36) {
System.out.println("我们吃可爱多!");
}else {
System.out.println("我们喝矿泉水!");
}
}
}
需求:请输入你的年收入,如果高于50万,买保时捷
如果高于40万,买奔驰
如果高于20万,买奥迪或宝马
如果高于10万,买摩托车
否则,买不起车
public class Test {
public static void main(String[] args) {
/*
* 需求:请输入你的年收入,如果高于50万,买保时捷
如果高于40万,买奔驰
如果高于20万,买奥迪或宝马
如果高于10万,买摩托车
否则,买不起车
*/
System.out.println("请输入你的年薪(万):");
Scanner in = new Scanner(System.in);
int salary = in.nextInt();
if (salary >= 50) {
System.out.println("买保时捷!");
}else if(salary >= 40 && salary < 50){
System.out.println("买奔驰车!");
}else if (salary >= 20 && salary <= 40) {
System.out.println("买奥迪或宝马!");
}else if (salary >= 10 && salary < 20) {
System.out.println("买摩托车!");
}else {
System.out.println("买不起车!");
}
}
}
注意:在多重if中,很容易犯错的地方:条件会写多余,修改上面的代码
public class Test {
public static void main(String[] args) {
/*
* 需求:请输入你的年收入,如果高于50万,买保时捷
如果高于40万,买奔驰
如果高于20万,买奥迪或宝马
如果高于10万,买摩托车
否则,买不起车
*/
System.out.println("请输入你的年薪(万):");
Scanner in = new Scanner(System.in);
int salary = in.nextInt();
if (salary >= 50) {
System.out.println("买保时捷!");
}else if(salary >= 40){
System.out.println("买奔驰车!");
}else if (salary >= 20) {
System.out.println("买奥迪或宝马!");
}else if (salary >= 10) {
System.out.println("买摩托车!");
}else {
System.out.println("买不起车!");
}
}
}
需求:今天如果是周一,上mysql课程 ,如果是周二、周三、周四,上java基础课,如果是周五,上数组课,如果是周六,复习,如果是周日,休息。
public class Test1 {
public static void main(String[] args) {
//今天是周几?
Date date = new Date();
int week = date.getDay();
// System.out.println(week);// 0 ->6 周日 -->周六
/*需求:今天如果是周一,上mysql课程 ,
如果是周二、周三、周四,上java基础课,如果是周五,上数组课,
如果是周六,复习,如果是周日,休息。
*/
if (week == 1) {
System.out.println("上mysql课");
}else if (week == 2 || week == 3 || week == 4) {
System.out.println("上java基础课");
}else if (week == 6) {
System.out.println("复习课");
}else{
System.out.println("休息");
}
}
}
分析:两个案例中的多重if有什么区别?
5.13 switch分支语句
功能:实现多条件分支
语法:
switch(条件){
case 条件1:
语句块;
break;
case 条件2:
语句块;
break;
…
case 条件n:
语句块;
break;
default:
break;
}
执行原理:用switch中的值和case后的条件自上而下的比较,如果满足某个case,则执行相应的case中的代码块,执行到break后,退出switch结构,如果没有匹配到,则执行default
public class SwitchTest {
public static void main(String[] args) {
//今天是周几
Date date = new Date();
int week = date.getDay();
switch (week) {
case 1:
System.out.println("上mysql课程");
break;
case 2:
System.out.println("上java基础课程");
break;
case 3:
System.out.println("上java基础课程");
break;
case 4:
System.out.println("上java基础课程");
break;
case 5:
System.out.println("上数组课程");
break;
case 6:
System.out.println("复习课");
break;
default:
System.out.println("休息");
break;
}
}
}
问题:周二到周五之间,学习内容都是一样的,同样的代码出现多次,代码冗余,想合并
public class SwitchTest {
public static void main(String[] args) {
//今天是周几
Date date = new Date();
int week = date.getDay();
switch (week) {
case 1:
System.out.println("上mysql课程");
break;
case 2:
case 3:
case 4:
System.out.println("上java基础课程");
break;
case 5:
System.out.println("上数组课程");
break;
case 6:
System.out.println("复习课");
break;
default:
System.out.println("休息");
break;
}
注意:switch中的case可以合并
- 将重复的代码块在最后一个case中写出来
- switch只会在两种情况退出 : a. 找不到任何条件 b.匹配以后,遇到break会退出,否则继续执行,直到
遇到第一个break才退出
- case中如果有代码块,记住要加上break
补充:switch中的值可以是什么类型?
byte 、short 、int 、char 、枚举类 、jdk1.7以上支持String字符串
5.14 循环
程序来源于生活,是对现实生活的一个高度仿真,如网银、电商、滴滴打车、美团外卖等
循环的概念:有条件的重复做一件事
站在程序的角度,有条件指循环条件,重复做的事情指循环体
5.14.1 while循环条件
需求:
老师检查作业,如果通过了,可以出去玩,否则继续做作业,等待老师下一次检查,直到通过为止
循环条件:作业不通过
循环体:做作业
使用while循环
while(循环条件){
循环体
}
public class WhileTest {
public static void main(String[] args) {
/*
* 老师检查作业,如果通过了,可以出去玩,
* 否则继续做作业,等待老师下一次检查,直到通过为止
*/
while(检查不通过){
//做作业
//通知老师检查
}
//循环结束
}
}
public class WhileTest {
public static void main(String[] args) {
/*
* 老师检查作业,如果通过了,可以出去玩,
* 否则继续做作业,等待老师下一次检查,直到通过为止
*/
System.out.println("老师检查作业,输入(y/n):");
Scanner in = new Scanner(System.in);
String isPass = in.next();//注意:一般有疑问色彩的变量名可以用isPass isAgain
while("n".equals(isPass)){
//做作业
System.out.println("检查不通过,继续做作业");
//通知老师检查
System.out.println("老师再次检查(y/n):");
isPass = in.next();
}
//循环结束
System.out.println("检查通过,可以出去玩耍了");
}
}
说明:
- while执行过程,总是先判断条件,满足才执行循环体(先判断再执行),循环体执行多少次,0次或多次
- 字面量和变量相比,字面量放在前面(规范),如果颠倒会报空指针异常
- 输入N或n都表示检查不通过,equalsIgnoreCase():忽略大小写 或 “n”.equals(isPass) || “N”.equals(isPass)
5.14.2 do while循环
需求:老师检查作业,如果通过了,可以出去玩,否则继续做作业,等待老师下一次检查,直到通过为止
循环条件:作业不通过
循环体:做作业
先用while循环处理
public class WhileTest {
public static void main(String[] args) {
/*
* 老师检查作业,如果通过了,可以出去玩,
* 否则继续做作业,等待老师下一次检查,直到通过为止
*/
System.out.println("老师检查作业,输入(y/n):");
Scanner in = new Scanner(System.in);
// String isPass = in.next();//注意:一般有疑问色彩的变量名可以用isPass isAgain
String isPass = "n";
while("n".equals(isPass) || "N".equals(isPass)){ //忽略大小写
//做作业
System.out.println("检查不通过,继续做作业");
//通知老师检查
System.out.println("老师再次检查(y/n):");
isPass = in.next();
}
//循环结束
System.out.println("检查通过,可以出去玩耍了");
}
}
运行结果表明循环体必须先执行一次,使用do while 更为合理
语法:
do{
//循环体
}while(循环条件);
System.out.println("老师检查作业,输入(y/n):");
Scanner in = new Scanner(System.in);
// String isPass = in.next();//注意:一般有疑问色彩的变量名可以用isPass isAgain
String isPass = "";
do{
//做作业
System.out.println("检查不通过,继续做作业");
//通知老师检查
System.out.println("老师再次检查(y/n):");
isPass = in.next();
}while("n".equalsIgnoreCase(isPass));
//循环结束
System.out.println("检查通过,可以出去玩耍了");
}
}
总结:
- do while是先执行再判断,循环体至少是执行一次
- while和do while 可以互转,但是该在适合的场景下使用合适的语法结构,只要是先执行后判断,优先选择 do while
5.14.3 for循环
问题:用for循环输出100之内的和
循环条件: 1---->100
循环体:累加一个值
-
语法
for(1初始化条件;2判断条件;3循环变量){
4循环体
}
执行顺序:1-2-4-3-2-4-3-2-4-3…
-
出现死循环,使用break关键字
-
嵌套循环 --九九乘法口诀
-
5.14.4 break continue return区别
-
continue --提前结束本轮循环,并开始下一个循环
-
break --提前结束当前循环或switch语句
-
return --提前结束当前函数的运行
System.exit(0) --关闭虚拟机