JAVA初学习(二)(人机猜拳游戏)

五、人机猜拳游戏

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():输出不换行
  • 如果想换行,有几种方法:
    1. 中间添加一行: System.out.println();
    2. 转义字符:\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 变量的定义方式
  1. 标准形式

    • 变量类型 变量名;
    • 变量赋值 = 值;(注意空格)
    • 使用变量
  2. 合写类型 --变量名 = 变量值

  3. 同时声明多个同类型变量

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可以合并

  1. 将重复的代码块在最后一个case中写出来
  2. switch只会在两种情况退出 : a. 找不到任何条件 b.匹配以后,遇到break会退出,否则继续执行,直到

​ 遇到第一个break才退出

  1. 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("检查通过,可以出去玩耍了");
	}
}

说明:

  1. while执行过程,总是先判断条件,满足才执行循环体(先判断再执行),循环体执行多少次,0次或多次
  2. 字面量和变量相比,字面量放在前面(规范),如果颠倒会报空指针异常
  3. 输入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("检查通过,可以出去玩耍了");
	}
}

总结:

  1. do while是先执行再判断,循环体至少是执行一次
  2. 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) --关闭虚拟机

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佛系小樂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值