使用面向对象方法实现猜拳游戏(Java)
文章目录
- 一、 面向对象
- 1、 三大思想(从概念上分)
- 2、 三大特征
- 2.1 封装
- 2.2 继承
- 2.3 多态
- 对象的多态性
- 方法的多态性
- 二、 使用面向对象方法实现猜拳游戏
- 1、 题目大意
- 2、 题意分解
- 3、 解题思路
- 4、 代码实现
- 机器类
- 用户测试类
- 接收用户输入的拳头属性对应的值
- 将数字转换成对应的拳头属性
- judge方法判断猜拳情况
- main测试
- 5、 完整代码
- 机器类
- 用户测试类
- 6、 运行结果
一、 面向对象
面向对象相对于面向过程来讲,把相关的数据和方法组织为一个整体来看待
面向过程到面向对象是程序员思想上从执行者到指挥者的转变
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不能被重写,但是能再次被声明 - 【区别于重载】
重写与重载的区别
重写@override | 重载@overload |
---|---|
子类父类中 | 一个类中 |
参数列表必须相同 | 参数列表必须不同 |
返回值类型必须一致 | 与返回值类型无关 |
子类访问权限必须不能小于父类的访问权限 | 与访问权限无关 |
可以减少或删除(异常范围更小,但不能抛出异常) | 与异常处理无关 |
2.3 多态
对象的多种表现形式(多种体现形态)
对象的多态性
在类中有子类、父类之分,子类为父类的一种形态
方法的多态性
方法的多态性即相同的方法有多种形态
- 重载:一个类中方法的多态性体现
- 重写(继承):子类父类中方法的多态性体现
二、 使用面向对象方法实现猜拳游戏
1、 题目大意
通过控制台方式实现一个人机对战的猜拳游戏,用户通过输入(1.剪刀 2.石头 3.布),机器随机生成(1.剪刀 2.石头 3.布),胜者积分,n 局以后通过积分的多少判定胜负。
2、 题意分解
①编写机器类,以及拳头属性(此属性只有三个值:剪刀,石头,布。这里
的值可以使用数值代替)
②编写生成随机数的方法(让机器生成剪刀,石头,布的值),赋值给第一
步的拳头属性
③编写用户测试类,获取用户输入的剪头石头布的值,和随机生成的值比较
④测试中,定义变量保存胜者积分
3、 解题思路
- 先编写机器类
① 定义机器类的成员变量(拳头属性、积分),将属性进行封装(private),使用get和set来获取、设置属性的值
②定义方法 随机生成拳头属性对应的值
③定义方法 将拳头属性对应的值转换为拳头属性并进行输出 - 编写用户测试类
①通过输入以及循环来确定猜拳的局数
②定义方法 实现用户的输入
③定义方法 实现判断,每次输出猜拳结果
④猜拳结束后分别输出用户和机器的积分,判断胜负并输出
4、 代码实现
机器类
编写机器类MoraGameMachine
- 定义无参构造方法
public MoraGameMachine() {super();}
- 定义拳头属性以及初始积分
private int mora;// 拳头属性(1石头,2剪刀,3布)private int score = 0;// 机器的初始积分为0
- 使用set和get来设置和获取拳头属性和积分值
public int getMora() {//获取拳头属性setMora();//调用setMore方法,随机生成拳头属性return mora;}public void setMora() {//随机生成拳头属性this.mora = this.machineCreateMore();// 通过调用方法随机生成}public int getScore() {//获取机器的积分值return score;}public void setScore(int score) {//设置机器的积分值this.score = score;}
- 随机生成拳头属性对应的值
通过Random随机生成1、2、3三个数,分别代表石头、剪刀、布
//随机产生1、2、3三个数,分别代表石头、剪刀、布public int machineCreateMore() {Random r = new Random();int num;num = r.nextInt(3) + 1;// [1,4),即1,2,3toMore(num);//将随机生成的值转换为对应的拳头属性return num;}
- 通过machineCreateMore随机生成的值转换成对应的拳头属性
1、2、3三个数,分别代表石头、剪刀、布
(为什么输出?告诉用户机器方所出的拳头属性)
//将随机生成的值转换为对应的拳头属性并进行输出(告诉用户机器方输出的拳头属性)public void toMore(int num) {switch (num) {case 1:System.out.println("机器:我方出的是剪刀!");break;case 2:System.out.println("机器:我方出的是石头!");break;case 3:System.out.println("机器:我方出的是布!");break;}}
用户测试类
- 定义静态属性:用户所出的拳头、用户的积分
public static int userMoreNum;public static int userScore = 0;//用户的初始积分为0
接收用户输入的拳头属性对应的值
实现用户输入,1、2、3三个数分别代表石头、剪刀、布
// 实现用户输入public static void userCreateMore() {do {// 通过循环确保用户输入的是有效值userMoreNum = input.nextInt();//输入if (userMoreNum < 1 || userMoreNum > 3) {//1、2、3System.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;}}
judge方法判断猜拳情况
判断石头剪刀布的猜拳情况,并且输出本次猜拳结果
注意:1、2、3三个数分别代表石头、剪刀、布,因此1>3,2>1,3>2
tips:石头剪刀布的输赢判断和最后分值的输赢判断不同,因此这个函数不能用作最后分数的判断
public static int judge(int userMore, int machineMore) {if (userMore == machineMore) {System.out.println("平局!不错哦!\n");return 0;// 平局} else {// user胜利,条件:1>3,2>1,3>2if ((userMore == 1 && machineMore == 3) || (userMore == 2 && machineMore == 1)|| (userMore == 3 && machineMore == 2)) {System.out.println("恭喜取得胜利!\n");return 1;}}// 不满足上述条件,则machine winSystem.out.println("很遗憾!\n");return -1;// 不满足上述条件,machine win}
main测试
- 初始界面提示打印,并通过输入来确定猜拳的轮数
System.out.println("============一起来玩猜拳游戏吧============");System.out.print("请问您想玩几局?");int gameTime = input.nextInt();//通过输入以及接下来的for循环来确定进行几次猜拳
- for循环进行猜拳
System.out.println("================游戏开始=================");for (int i = 0; i < gameTime; i++) {//猜拳的轮数System.out.print("请选择您要出的拳头属性(1.剪刀 2.石头 3.布):");userCreateMore();//定义方法,实现用户的输入//judge实现判断,用户赢返回1,平局返回0,输返回-1int judge = judge(userMoreNum, moraGameMachine.getMora());if (judge == 1) {// 用户赢userScore++;//用户积分+1} else if (judge == -1) {// 机器赢int machineScore = moraGameMachine.getScore();//先get机器的分数machineScore++;//机器积分+1moraGameMachine.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");}
5、 完整代码
机器类
import java.util.Random;public class MoraGameMachine {private int mora;// 拳头属性(1石头,2剪刀,3布)private int score = 0;// 机器的初始积分为0public MoraGameMachine() {super();}public int getMora() {setMora();return mora;}public void setMora() {this.mora = this.machineCreateMore();// 通过调用方法随机生成}public int getScore() {return score;}public void setScore(int score) {this.score = score;}//随机产生1、2、3三个数,分别代表石头、剪刀、布public int machineCreateMore() {Random r = new Random();int num;num = r.nextInt(3) + 1;// [1,4),即1,2,3toMore(num);return num;}//将随机生成的值转换为对应的拳头属性并进行输出public void toMore(int num) {switch (num) {case 1:System.out.println("机器:我方出的是剪刀!");break;case 2:System.out.println("机器:我方出的是石头!");break;case 3:System.out.println("机器:我方出的是布!");break;}}}
用户测试类
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;//用户的初始积分为0public 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,输返回-1int judge = judge(userMoreNum, moraGameMachine.getMora());if (judge == 1) {// 用户赢userScore++;//用户积分+1} else if (judge == -1) {// 机器赢int machineScore = moraGameMachine.getScore();//先get机器的分数machineScore++;//机器积分+1moraGameMachine.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>2if ((userMore == 1 && machineMore == 3) || (userMore == 2 && machineMore == 1)|| (userMore == 3 && machineMore == 2)) {System.out.println("恭喜取得胜利!\n");return 1;}}// 不满足上述条件,则machine winSystem.out.println("很遗憾!\n");return -1;// 不满足上述条件,machine win}// 实现用户输入public static void userCreateMore() {do {// 通过循环确保用户输入的是有效值userMoreNum = input.nextInt();if (userMoreNum < 1 || userMoreNum > 3) {//1、2、3System.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
使用面向对象方法实现猜拳游戏(Java)相关推荐
- 用java写猜拳游戏,Java写人机猜拳游戏(可扩展其他游戏或其他参与者)
初学Java,写一个控制台输入输出的小游戏,模拟人机猜拳.为了扩展性稍微强一些,这个小游戏代码有些复杂,但确实可以扩展其他游戏或者其他参与者的. 代码还有一些小问题,后面贴出来... /******* ...
- 与计算机玩猜拳游戏,猜拳游戏 java基础
//用循环方式实现和计算机玩猜拳的程序 (设定胜出条件--输3次或赢3次即退出) package eduask01; import java.util.*; public class Rask03 { ...
- java猜拳游戏代码_猜拳游戏 - java代码库 - 云代码
[java]代码库public class Computer { String name; int score; public int showfist(){ int quan; quan=(int) ...
- 【Java语言】项目实践:人机猜拳游戏(源码)(面向对象方法)
package com.njwbhz.part0217.Mora;import java.util.Scanner;public class PersonPlayer {//属性//人类玩家的名字St ...
- 【JAVA面向对象练习】用户与电脑猜拳游戏
一.需求 1.用户可自定义游戏的局数 2.用户每局可以输入石头(0),剪刀(1),布(2) 3.电脑随机从石头(0),剪刀(1),布(2)中选择一个 4.每局比赛都可以自动判断输赢,并在游戏结束后打印 ...
- Java学习第二十七天<面向对象综合练习><猜拳游戏>
面向对象综合练习 找最大值 package chapter06.D10综合练习; //找最大值 public class Homework01 {public static void main(Str ...
- c语言猜拳游戏实训报告,Java猜拳小游戏程序设计实验报告.doc
Java程序设计实验报告 班级: 学号: 姓名: 实验题目:猜拳小游戏 实验要求: 用java编写一个人机对战的猜拳小游戏.人选择性出拳,电脑随机出拳,判断输赢,记录输赢情况.有简单的操作界面. 实验 ...
- Java人机猜拳游戏(命令行版)
这是本学期的java作业: java编写一个人机对战的猜拳小游戏.人选择性出拳,电脑随机出拳,判断输赢,记录输赢情况.有简单的操作界面. 学了一个学期的Java,感觉收获还挺多的.第一次用Java写小 ...
- 基于java的人机猜拳游戏
任务描述 完成人机猜拳互动游戏的开发,用户通过控制台输入实现出拳,电脑通过程序中的随机数实现出拳,每一局结束后都要输出结果.当用户输入n时停止游戏,并输出总结果.效果如图1-1所示. 图1-1人机猜拳 ...
- java刘备猜拳游戏类_基于java实现人机猜拳游戏
本文实例为大家分享了java实现人机猜拳游戏的具体代码,供大家参考,具体内容如下 完成人机猜拳互动游戏的开发,用户通过控制台输入实现出拳,电脑通过程序中的随机数实现出拳,每一局结束后都要输出结果.当用 ...
最新文章
- NYOJ-232 How to eat more Banana
- Spring boot注入配置为java静态属性
- Python学习笔记-模块介绍
- 创建AOP静态代理(上篇)
- 一步一步实现自己的模拟控件(5)——隐藏类
- 使用SAT研究IBASE hierarchy读取性能
- vue笔记(三)生命周期、组件(嵌套)、数据传递
- Docker精华问答 | Docker vs VM
- oracle 数据类型详解---日期型(转载)
- 滴滴怒怼美团;阿里麻吉宝刷屏;B站、爱奇艺上市 | CSDN 极客头条
- 九爷 带你了解 nginx优化与防盗链
- 30.磁盘 I/O 问题
- 通过 web 录制视频(摄像头)并上传
- 湖北大学98届计算机网络,我校学子在“H3C”杯全国大学生网络技术大赛中获一等奖...
- 2020-03-03学习日结
- Iterator循环的用法
- HTML5面试题及答案
- 云测试平台(testin)
- MOSFET反向恢复特性总结-4
- npm安装依赖至指定版本 npm依赖升级
热门文章
- 【云售前工具】在线绘图工具推荐
- Windows 7下IE9升级到IE 11,F12控制台不能使用的解决方法
- JAVA毕业设计华水疫情预警与防护用品调度系统计算机源码+lw文档+系统+调试部署+数据库
- 企业品牌营销型网站搭建需要关注这6大核心要素
- Irrational problem
- 学考计算机会考考点工作总结,高中生学业水平考试工作总结范文
- Linux驱动BSP(I2C 驱动实验)
- lighttpd移植
- android 开机动画 卡顿,开机动画没按帧率播放 有卡顿
- 微分方程数值解 matlab,本学期微分方程数值解课程总结(matlab代码)