Java猜拳小游戏

一、 面向对象
面向对象相对于面向过程来讲,把相关的数据和方法组织为一个整体来看待
面向过程到面向对象是程序员思想上从执行者到指挥者的转变

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

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值