一、 面向对象
面向对象相对于面向过程来讲,把相关的数据和方法组织为一个整体来看待
面向过程到面向对象是程序员思想上从执行者到指挥者的转变
1、 三大思想(从概念上分)
OOA:面向对象分析
OOD:面向对象设计
OOP:面向对象程序
2、 三大特征
2.1 封装
全部内容对外不可见(信息隐藏,用类进行封装)
特点
对内:结构完整,可自我管理,自我平衡,高度集中
对外:功能明确,接口单一,各种环境独立工作
意义
保护、防止代码及数据被无意中破坏
保护成员属性,不让类意外的程序直接访问和修改
仅对外公开访问方法,隐藏对象属性和实现细节
2.2 继承
功能继承下来继续发展,即子类继承父类非私有的方法和属性
tips:
新类必须在已有类的基础上进行构造。
单根继承,父类只有一个
允许多重继承(a继承b,b继承c),但是不允许多继承(a继承b和c)
每个类都有父类:Object
super关键字
访问父类的构造方法、属性、方法
调用super构造方法的代码必须放在子构造方法的第一行(自动创建父类对象)
【区别于this关键字】
重写
参数列表、返回类型必须完全与被重写方法相同
访问权限不能比父类中被重写的方法的访问权限更低(比如父类为public,子类不能为protected)
父类的成员方法只能被子类重写
static和private不能被重写,但是能再次被声明
【区别于重载】
重写与重载的区别
2.3 多态
对象的多种表现形式(多种体现形态)
对象的多态性
在类中有子类、父类之分,子类为父类的一种形态
方法的多态性
方法的多态性即相同的方法有多种形态
重载:一个类中方法的多态性体现
重写(继承):子类父类中方法的多态性体现
二、 使用面向对象方法实现猜拳游戏
1、 题目大意
通过控制台方式实现一个人机对战的猜拳游戏,用户通过输入(1.剪刀 2.石头 3.布),机器随机生成(1.剪刀 2.石头 3.布),胜者积分,n 局以后通过积分的多少判定胜负。
2、 题意分解
①编写机器类,以及拳头属性(此属性只有三个值:剪刀,石头,布。这里
的值可以使用数值代替)
②编写生成随机数的方法(让机器生成剪刀,石头,布的值),赋值给第一
步的拳头属性
③编写用户测试类,获取用户输入的剪头石头布的值,和随机生成的值比较
④测试中,定义变量保存胜者积分
3、 解题思路
先编写机器类
① 定义机器类的成员变量(拳头属性、积分),将属性进行封装(private),使用get和set来获取、设置属性的值
②定义方法 随机生成拳头属性对应的值
③定义方法 将拳头属性对应的值转换为拳头属性并进行输出
编写用户测试类
①通过输入以及循环来确定猜拳的局数
②定义方法 实现用户的输入
③定义方法 实现判断,每次输出猜拳结果
④猜拳结束后分别输出用户和机器的积分,判断胜负并输出
4、 代码实现
机器类
编写机器类MoraGameMachine
定义无参构造方法
- 定义拳头属性以及初始积分
- 使用set和get来设置和获取拳头属性和积分值
- 随机生成拳头属性对应的值
通过Random随机生成1、2、3三个数,分别代表石头、剪刀、布
- 通过machineCreateMore随机生成的值转换成对应的拳头属性
1、2、3三个数,分别代表石头、剪刀、布
(为什么输出?告诉用户机器方所出的拳头属性)
用户测试类
- 定义静态属性:用户所出的拳头、用户的积分
接收用户输入的拳头属性对应的值
实现用户输入,1、2、3三个数分别代表石头、剪刀、布
将数字转换成对应的拳头属性
judge方法判断猜拳情况
判断石头剪刀布的猜拳情况,并且输出本次猜拳结果
注意:1、2、3三个数分别代表石头、剪刀、布,因此1>3,2>1,3>2
tips:石头剪刀布的输赢判断和最后分值的输赢判断不同,因此这个函数不能用作最后分数的判断
main测试
- 初始界面提示打印,并通过输入来确定猜拳的轮数
- for循环进行猜拳
- 游戏结束,分别输出用户和机器的分数
- 判断分数并输出最终结果
5、 完整代码
机器类
用户测试类
import java.util.Random;
import java.util.Scanner;
public class MoraGameMachineTest {
public static Scanner input = new Scanner(System.in);
//定义静态属性,接下来直接调用
public static int userMoreNum;
public static int userScore = 0;//用户的初始积分为0
public static void main(String[] args) {
MoraGameMachine moraGameMachine = new MoraGameMachine();
System.out.println("============一起来玩猜拳游戏吧============");
System.out.print("请问您想玩几局?");
int gameTime = input.nextInt();//通过输入以及接下来的for循环来确定进行几次猜拳
System.out.println("================游戏开始=================");
for (int i = 0; i < gameTime; i++) {//猜拳的轮数
System.out.print("请选择您要出的拳头属性(1.剪刀 2.石头 3.布):");
userCreateMore();//定义方法,实现用户的输入
//judge实现判断,用户赢返回1,平局返回0,输返回-1
int judge = judge(userMoreNum, moraGameMachine.getMora());
if (judge == 1) {// 用户赢
userScore++;//用户积分+1
} else if (judge == -1) {// 机器赢
int machineScore = moraGameMachine.getScore();//先get机器的分数
machineScore++;//机器积分+1
moraGameMachine.setScore(machineScore);//set机器的分数
}
}
System.out.println("===============游戏结束===============");
System.out.println("机器的最终得分是:" + moraGameMachine.getScore());
System.out.println("您的最终得分是:" + userScore);
if (userScore > moraGameMachine.getScore()) {
System.out.println("恭喜取得胜利!\n");
} else if (userScore < moraGameMachine.getScore()) {
System.out.println("很遗憾!下次运气会更好哦!\n");
} else {
System.out.println("平局!不错哦!\n");
}
}
// 判断输赢(石头剪刀布的输赢判断和最后分值的输赢判断不同,因此这个函数不能用作最后分数的判断)
public static int judge(int userMore, int machineMore) {
if (userMore == machineMore) {
System.out.println("平局!不错哦!\n");
return 0;// 平局
} else {// user胜利,条件:1>3,2>1,3>2
if ((userMore == 1 && machineMore == 3) || (userMore == 2 && machineMore == 1)
|| (userMore == 3 && machineMore == 2)) {
System.out.println("恭喜取得胜利!\n");
return 1;
}
}
// 不满足上述条件,则machine win
System.out.println("很遗憾!\n");
return -1;// 不满足上述条件,machine win
}
// 实现用户输入
public static void userCreateMore() {
do {// 通过循环确保用户输入的是有效值
userMoreNum = input.nextInt();
if (userMoreNum < 1 || userMoreNum > 3) {//1、2、3
System.out.println("输入错误,请重新输入!");
} else {
toMore(userMoreNum);//toMore方法将用户输入的数字转换成具体拳头的值并打印
}
} while (userMoreNum < 1 || userMoreNum > 3);
}
// 将用户输入的数字转换成具体拳头的值
public static void toMore(int userMoreNum) {
switch (userMoreNum) {
case 1:
System.out.println("您出的是剪刀!");
break;
case 2:
System.out.println("您出的是石头!");
break;
case 3:
System.out.println("您出的是布!");
break;
}
}
}
6、 运行结果
- Demo1
Demo2