控制台输出的JAVA格斗小游戏-面向对象

重温了黑马的这个小程序

首先介绍一下:相当于一个小游戏,你打我一下,我打你一下;中间经历一些来回,最终根据血量的大小来判断谁输谁赢,实话讲黑马整个课在这个之前的题目没有什么难度,这个不难,但有很多小知识点忘记,以此文总结一下。

知识点梳理

1、拿到这个题目的时候需要先思考,和前面的都写在单独一个类中的有什么区别?如果全部写在一个类,所有功能(角色属性、攻击逻辑、游戏流程)可能集中在一个类中,导致代码冗长,难以实现复杂的游戏系统(如继承、多态),如不同角色的特殊技能。

2、所以要分离主类(GameTest)和业务类(Role),继续思考如何界定里面?

3、大方向是:先写业务类(里面的多个角色实例(如乔峰、摩智)均可复用)

  • 首先先带着数据类型和公私有去定义角色的属性(名字、血量、性别、状态...)
  • 然后就是利用快捷键(Fn+Alt+insert去调出无参和全参的构造函数<初始化对象>及getset方法
  • 最基本的处理完成后,就要思考自定义方法了(attack)和(showRoleInfo)。

4、对于set和get方法

set 方法:用于修改成员变量的值,需要参数,因为 set 方法的目的是设置成员变量的值,所以它需要一个参数来接收新的值。

  • 比较特殊的是face,这个对象得随机生成,构造函数中也不同于其他属性那样直接赋值 this.某=某,它需要在set里面修改。
  • 具体操作也是利用随机索引,调用提前在类中定义的描述男女两长相数组的索引,注意不要忘记写 this.某 = 数组名 [ 随机产生的索引 ] 。
    public void setFace(char gender) {Random r = new Random();//长相是随机的if(gender=='男'){int index = r.nextInt(boyfaces.length);this.face = boyfaces[index];}else if(gender=='女'){int index = r.nextInt(girlfaces.length);this.face = girlfaces[index];}else {this.face = "非男非女";}}

get 方法:用于读取成员变量的值。 

5、第一个自定义方法attack,目的是实现一个角色对另一个角色的攻击行为,需要一个 role 类型的参数来表示被攻击的角色。

  • role.getName():获取被攻击角色的名字
  • this.getName():获取当前攻击角色的名字,this是方法的调用者(在gametest中调用)
    public void attack(Role role){//随机攻击效果Random r1 = new Random();int index = r1.nextInt(attack_esc.length);String kongfu = attack_esc[index];//输出一个攻击的效果System.out.printf(kongfu,this.getName(),role.getName());System.out.println("");//造成的随机伤害Random r = new Random();int hurt = r.nextInt(20)+1;//修改一下挨揍人的血量int remainBlood = role.getBlood()-hurt;//剩余血量remainBlood = remainBlood<0?0:remainBlood; //验证剩余的血量role.setBlood(remainBlood);if(remainBlood>90){System.out.printf(injureds_esc[0],role.getName());}else if(remainBlood>60){System.out.printf(injureds_esc[1],role.getName());}else {System.out.printf(injureds_esc[2],role.getName());}System.out.println("");//        //this是方法的调用者
//        System.out.println(this.getName()+"打了"+role.getName()
//                +"一下,造成了"+hurt+"伤害,"+"\n"+
//                role.getName()+"还剩"+remainBlood+"血量");}
  • 想要实现随机攻击效果,首先需要在方法之前写一个字符串数组,想要生动形象的调用名词就需要使用到 printf(允许你按照指定的格式输出文本),在方法中使用随机索引来调用一个攻击效果。System.out.printf (随机攻击的数组名,第一个% this.getName(),第二个% role.getName());
  • 同样的想要输出一个受伤描述,这个是根据剩余血量的大小(在方法中定义的变量)来决定的,输出是也是使用 printf。System.out.printf ( 被攻击状态名 [数组中第几个值根据血量大小],role.getName());
格式说明符作用示例
%d格式化整数int num = 10;
%s格式化字符串String str = "hello";
%f格式化浮点数double d = 3.14159;
%c格式化字符char c = 'A';
%b格式化布尔值boolean b = true;

6、第二个方法showRoleInfo,不需要参数,因为它只操作当前对象自身的属性,不需要外部输入,调用的时候只需要写出对应的get返回值即可。

7、写完业务类的属性、并对属性的构造函数和对应方法写完之后,就要写一个test类,这个类的目的是作为程序入口,负责创建角色、控制游戏流程,不涉及角色内部实现。两个类的两者职责分离,修改其中一个不会影响另一个。

8、在test类中,首先主要对应上一个类中的构造函数创建角色 上一个类名 r1 = new 上一个类名(逗号隔开分别传入构造函数中的参数);

9、在该类中可以利用上面构造的角色名调另一个类中的方法 调用者对象.方法名(方法参数),如果在调用方法中有对应的限制比如是否小于了0。

全部代码

Role类:

import java.util.Random;public class Role {private String name;private int blood;private char gender;private String face;String[] boyfaces = {"风流倜傥","气宇轩昂","相貌英俊"};String[] girlfaces = {"风华正茂","清秀","身材较好"};//攻击描述String[] attack_esc = {"%s用牛角尖刺中%s","%s用小刀砍中%s","%s用小棒打中%s"};//受伤描述String[] injureds_esc = {"结果%s被攻击,","结果%s被打倒","结果%s被打中"};public Role(String name, int blood, char gender) {this.name = name;this.blood = blood;this.gender = gender;//随机长相setFace(gender);}public Role() { }public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}//get 方法:用于读取成员变量的值。public String getFace() {return face;}//set 方法:用于修改成员变量的值。//set 方法需要参数:因为 set 方法的目的是设置成员变量的值,所以它需要一个参数来接收新的值。public void setFace(char gender) {Random r = new Random();//长相是随机的if(gender=='男'){int index = r.nextInt(boyfaces.length);this.face = boyfaces[index];}else if(gender=='女'){int index = r.nextInt(girlfaces.length);this.face = girlfaces[index];}else {this.face = "非男非女";}}public String[] getBoyfaces() {return boyfaces;}public void setBoyfaces(String[] boyfaces) {this.boyfaces = boyfaces;}public String[] getGirlfaces() {return girlfaces;}public void setGirlfaces(String[] girlfaces) {this.girlfaces = girlfaces;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getBlood() {return blood;}public void setBlood(int blood) {this.blood = blood;}//定义一个方法用于攻击别人,方法需要一个Role参数:因为需要指定攻击的目标角色。//role.getName():获取被攻击角色的名字。//this.getName():获取当前攻击角色的名字。// this是方法的调用者即 this.getName// role也就是参数,是挨揍的人即 role.getNamepublic void attack(Role role){//随机攻击效果Random r1 = new Random();int index = r1.nextInt(attack_esc.length);String kongfu = attack_esc[index];//输出一个攻击的效果System.out.printf(kongfu,this.getName(),role.getName());System.out.println("");//造成的随机伤害Random r = new Random();int hurt = r.nextInt(20)+1;//修改一下挨揍人的血量int remainBlood = role.getBlood()-hurt;//剩余血量//验证剩余的血量remainBlood = remainBlood<0?0:remainBlood;//修改挨揍人的血量role.setBlood(remainBlood);if(remainBlood>90){System.out.printf(injureds_esc[0],role.getName());}else if(remainBlood>60){System.out.printf(injureds_esc[1],role.getName());}else {System.out.printf(injureds_esc[2],role.getName());}System.out.println("");//        //this是方法的调用者
//        System.out.println(this.getName()+"打了"+role.getName()
//                +"一下,造成了"+hurt+"伤害,"+"\n"+
//                role.getName()+"还剩"+remainBlood+"血量");}
//showRoleInfo 方法不需要参数:因为它只操作当前对象自身的属性,不需要外部输入。public void showRoleInfo(){System.out.println("姓名为:"+getName());System.out.println("血量为:"+getBlood());System.out.println("性别为:"+getGender());System.out.println("长相为:"+getFace());}
}

GameTest类:

public class GameTest {public static void main(String[] args) {Role r1 = new Role("乔峰",100,'男');Role r2 = new Role("摩智",100,'男');//展示角色信息r1.showRoleInfo();r2.showRoleInfo();//不知道要打击多少轮,所有要用whilewhile (true){r1.attack(r2);//判断一下剩余血量if (r2.getBlood()==0){System.out.println(r1.getName()+" ko "+r2.getName());break;}r2.attack(r1);if(r1.getBlood()==0){System.out.println(r2.getName()+" ko "+r1.getName());break;}}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89258.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub 趋势日报 (2025年07月15日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图1641claude-code1054markitdown545system-prompts-and-models-of-ai-tools538claud…

(5)LangGraph4j框架ReActAgent实现

LangGraph4j框架ReActAgent实现 ReAct-Agent概念 ReAct-Agent 是一种大模型应用中的智能体架构。ReAct 是 Re (Reasoning&#xff0c;推理)和 Act&#xff08;Action&#xff0c;行动&#xff09;两个单词的简写&#xff0c;用通俗的话来说&#xff0c;它可以让大模型像人一样“…

近期学习小结

一、TLS&#xff08;Transport Layer Security&#xff09;握手是建立安全通信通道的关键过程&#xff0c;确保客户端与服务器之间的通信加密和身份验证。以下是TLS 1.2和TLS 1.3的握手流程详解及对比&#xff1a;TLS 1.2 握手流程目标&#xff1a;协商加密套件、交换密钥、验证…

maven本地仓库清缓存py脚本

清_remote.repositories、以及 .lastUpdated 缓存文件&#xff0c;避免换仓库or私服的时候一直往旧地方去download从而引起的failtodownlown问题 import os import sysdef delete_maven_metadata_files(directory):"""递归删除指定目录下的 _remote.repositorie…

职坐标:物联网解决方案实战指南

随着物联网技术的快速发展&#xff0c;其在智能家居、工业制造和农业领域的应用日益广泛&#xff0c;为解决实际挑战提供了高效方案。本文将围绕职坐标一站式IT培训就业服务平台推出的实战指南&#xff0c;系统解析物联网解决方案的核心内容。指南首先概述物联网解决方案的基本…

多云环境下的统一安全架构设计

关键词&#xff1a;多云安全、统一架构、零信任、深度防御、身份管理、威胁检测、SIEM、合规性 &#x1f4da; 文章目录 引言&#xff1a;多云时代的安全挑战多云环境面临的安全挑战统一安全架构设计原则核心安全组件架构多层防护体系设计统一身份管理与访问控制安全监控与威…

批量制作Word:如何根据表格数据的内容批量制作word,根据Excel的数据批量制作word文档的步骤和注意事项

企业批量制作员工劳动合同时&#xff0c;用 Excel 整理员工姓名、职位等信息&#xff0c;模板设对应占位符&#xff0c;系统快速填充生成合同&#xff1b;高校生成成绩单&#xff0c;Excel 存学生成绩数据&#xff0c;模板嵌入科目占位符&#xff0c;批量生成准确成绩单&#x…

STM32f103ZET6之ESP8266模块

一、ESP8265概述 官方网址&#xff1a;ESP8266 Wi-Fi MCU I 乐鑫科技 (espressif.com.cn) ESP8266模块---wifi模块 产品特点&#xff1a;ESP8266 是什么&#xff1f; ESP8266 是由乐鑫科技&#xff08;Espressif Systems&#xff09;开发的一款低成本、高性能的 Wi-Fi 微控制器…

前端设计模式应用精析

引言 设计模式是前端工程化架构的基石&#xff0c;通过抽象核心场景解法提升代码复用性与系统可维护性。本文精析 7 个核心模式&#xff0c;结合原生 JavaScript 与框架实践&#xff0c;揭示模式在现代前端架构中的底层映射与应用。1. 观察者模式&#xff08;Observer&#xff…

【机器学习深度学习】Ollama vs vLLM vs LMDeploy:三大本地部署框架深度对比解析

目录 前言 一、为什么要本地部署大语言模型&#xff1f; 二、三大主流部署方案简介 三、核心对比维度详解 1️⃣ 易用性对比 2️⃣ 性能与并发能力 3️⃣ 模型支持与生态兼容性 4️⃣ 部署环境与平台支持 四、一览对比表 五、详细介绍与比较 ✅ 1. Ollama ✅ 2. vL…

AWS ML Specialist 考试备考指南

以下是针对AWS机器学习专家认证(AWS Certified Machine Learning - Specialty)的备考指南精简版,涵盖核心要点和高效备考策略: ‌一、考试核心要点‌ ‌四大核心领域‌: ‌数据准备(28%)‌:S3数据存储、Glue ETL、Feature Store、数据清洗与特征工程。 ‌模型开发(26%…

yolo8+ASR+NLP+TTS(视觉语音助手)

&#x1f9e9; 模块总览&#xff1a;步骤模块作用①麦克风录音&#xff08;VAD支持&#xff09;获取语音并判断是否有人说话②Whisper语音识别把语音内容识别为文字③DeepSeek 聊天接口发送用户提问并获取 AI 回复④edge-tts 朗读回答把 DeepSeek 回答读出来⑤整合成语音助手主…

Zabbix 分布式监控系统架构设计与优化

一、概念 1.核心概念 Zabbix是一个CS(服务端/客户端)架构的服务Zabbix-Agent获取数据-->发送给-->Zabbix-Server服务端--- >数据会被存放在数据库 <--- Zabbix Web 页面展示数据 2.部署流程 部署ngxphp环境并测试部署数据库 mariadb 10.5及以上 然后进行配置编…

QT——文件选择对话框 QFileDialog

QFileDialog概述QFileDialog是Qt框架中提供的文件对话框类&#xff0c;用于让用户选择文件或目录。它提供了标准的文件选择界面&#xff0c;支持文件打开、保存、多选等常见操作。基本使用方式QFileDialog提供了两种使用方式&#xff1a;静态方法&#xff1a;直接调用类方法快速…

Flask+LayUI开发手记(十一):选项集合的数据库扩展类

条目较少的选项集合&#xff0c;确实可以在程序中直接定义&#xff08;其实最合适的还是存储在一个分类别的数据库表里&#xff09;&#xff0c;但条目较多的选项集合&#xff0c;或者是复杂的树型结构选项集合&#xff0c;一般都是存储在数据库中的&#xff0c;这样维护起来比…

AI学习笔记三十二:YOLOv8-CPP-Inference测试(Linux版本)

若该文为原创文章&#xff0c;转载请注明原文出处。主要介绍如何在Linux系统上安装和部署基于YOLOv8的C推理项目一、服务器准备使用AutoDL平台租用服务器AutoDL有git加速&#xff0c;可以自行启用二、环境配件1、检查Opencv版本pkg-config --modversion opencv4如果版本为4.5&a…

113:路径总和 II

题目&#xff1a;给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。解答&#xff1a;用 go主要坑有两个&#xff0c;一个是二维结果切片传递用指针&#xff0c;一个…

Perl 数组

Perl 数组 在Perl编程语言中&#xff0c;数组是处理数据的一种强大工具。数组允许我们将多个值存储在单个变量中&#xff0c;从而简化了代码并提高了效率。本文将详细介绍Perl数组的创建、操作、遍历以及一些高级用法。 数组的创建 在Perl中&#xff0c;创建一个数组非常简单。…

优先队列的实现

目录 引言 堆的基本概念与特性 堆的插入与向上调整 堆的删除与向下调整 优先队列的设计思路 模板参数设计 比较器的作用 核心接口实现 push pop top 附录(完整代码) 引言 优先队列&#xff08;Priority Queue&#xff09;是一种特殊的队列数据结构&#xff0c;其中每…

现代CSS实战:用变量与嵌套重构可维护的前端样式

现代CSS实战&#xff1a;用变量与嵌套重构可维护的前端样式 引言 在传统CSS开发中&#xff0c;我们常常陷入「样式冗余」与「维护噩梦」的循环&#xff1a; 想调整主题色&#xff1f;得全局搜索所有 #3498db 手动替换&#xff0c;稍有不慎就漏改某个角落&#xff1b; 写嵌套…