0

0

初学者如何用Java实现一个控制台版的游戏英雄属性计算器_OOP实践

P粉602998670

P粉602998670

发布时间:2026-03-12 10:20:03

|

421人浏览过

|

来源于php中文网

原创

应使用private字段和public方法封装英雄属性与行为,如takedamage()统一处理伤害计算与血量更新,避免逻辑分散;scanner输入需统一用nextline()配合trim()防空格和换行符问题;加成规则宜用static final map配置,避免硬编码;nullpointerexception多因未实例化对象,需检查声明后是否new。

初学者如何用java实现一个控制台版的游戏英雄属性计算器_oop实践

Java里怎么用类封装英雄属性

英雄不是一堆零散数字,而是有行为、有状态的实体。直接用int变量存血量、攻击力,很快就会失控——比如忘了同步更新防御力对实际伤害的影响,或者在多个地方重复写“血量不能为负”的逻辑。

应该用一个Hero类把数据和规则捆在一起:

public class Hero {
    private int hp = 100;
    private int attack = 20;
    private int defense = 10;
<pre class='brush:java;toolbar:false;'>public void takeDamage(int rawDamage) {
    int actual = Math.max(1, rawDamage - defense); // 至少掉1点
    this.hp = Math.max(0, this.hp - actual);
}

public boolean isAlive() {
    return this.hp > 0;
}

}

  • 所有字段必须是private,暴露public方法控制修改入口
  • takeDamage()里做了两件事:算实际伤害、扣血——把业务规则锁死在类内部
  • 别在构造器里做复杂计算或IO,初学者容易卡在这里等用户输入,导致类无法复用

为什么用Scanner读输入总出错

控制台交互最常崩在Scanner的换行符残留上。比如先用nextInt()读等级,再用nextLine()读名字,第二步会直接返回空字符串——因为nextInt()没吃掉回车符。

立即学习Java免费学习笔记(深入)”;

统一用nextLine(),再手动转类型更稳:

Article Forge
Article Forge

行业文案AI写作软件,可自动为特定主题或行业生成内容

下载
Scanner sc = new Scanner(System.in);
System.out.print("请输入英雄等级:");
int level = Integer.parseInt(sc.nextLine().trim()); // 加trim防空格
System.out.print("请输入英雄名称:");
String name = sc.nextLine().trim();
  • 永远对nextLine()结果调用trim(),Windows/Linux换行差异、用户多按空格都会导致name.equals("战士")失效
  • 别用hasNextInt()做校验——用户输"abc"时程序会卡住,要捕获NumberFormatException
  • 一个Scanner对象够用,别每个输入都new一个,资源浪费且可能关错流

属性加成逻辑该放在Hero类里还是外面

加成规则(比如“每升一级攻击+5”“装备增加防御但降低命中”)本质是业务变化点。如果硬编码在HerolevelUp()方法里,以后策划改数值就得改Java代码,编译重跑。

把规则抽成配置,用简单结构承载:

public class Hero {
    private int level = 1;
    private static final Map<Integer, Integer> ATTACK_PER_LEVEL = Map.of(
        1, 20, 2, 25, 3, 30 // 等级→基础攻击
    );
<pre class='brush:java;toolbar:false;'>public void levelUp() {
    if (this.level < 3) {
        this.level++;
        this.attack = ATTACK_PER_LEVEL.get(this.level);
    }
}

}

  • 初学者容易把Map写成全局static但不加final,结果被误改;或者用new HashMap()然后忘记put,查半天空指针
  • 别为了“看起来灵活”立刻上JSON配置文件——控制台小工具里,Map.of()或数组足够,过早抽象反而难调试
  • 加成逻辑如果涉及多个属性联动(如“暴击率=攻击/100”,但攻击又受装备影响),就用getAttack()这类getter封装计算,别让外部直接读字段

运行时报错Exception in thread "main" java.lang.NullPointerException

这个错误90%是因为某个Hero变量声明了但没new。比如写了Hero hero;就直接调hero.takeDamage(10),JVM找不到实际对象。

检查三处高频漏点:

  • 主方法里是否漏了Hero hero = new Hero();?只声明不实例化是新手最常犯的错
  • 如果用了List<hero></hero>存多个英雄,add()前是否每个元素都new了?list.add(null)之后再取出来用必崩
  • 从方法返回Hero时,是否在所有分支都写了return?比如if-else里else缺return,静态分析可能放过,但运行时返回null

只要出现NullPointerException,第一反应不是看堆栈第几行,而是顺着报错行往上找——那个点名的变量,最近一次赋值是不是null或根本没赋过值。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

455

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

334

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号