-1

因为我厌倦了解决数学问题,所以我决定尝试一些更能吸引我生锈(即使没有生锈,非常基本)的 Java 技能。我登陆了一个超级简单的人模拟器,到目前为止,我一直在努力完成让它发挥作用的各个步骤。目前,它生成一个人类对象数组并运行一个 for 循环来循环通过一组改变它们之间关系的动作,我将它们存储在一个二维整数数组中。当它结束时,我去看看他们有多么讨厌对方。好玩的东西。

然而,问题出现了,因为我希望程序清楚地打印出发生了什么动作。我认为最好的方法是在我的“动作”类中添加一个字符串描述(它存储了演员、反应器和关系变化量的变量)。这在一定程度上有效,因为我可以毫无问题地打印一条通用消息(“发生了一场战斗!”)。但是,理想情况下,我希望它更具体一点(“人 A 向人 B 的头扔了一块石头!”)。事实证明,后一个目标更加困难:尝试使用引用 actor 和 reactor 的描述字符串构造一个动作,这给我带来了一个很大的老错误,“在定义之前无法引用字段”。这很有意义。

我相信我还没有完全处于程序员模式,因为我能想到的唯一其他方法是一个笨拙的 switch 语句,它否定了每个动作都需要有自己的打包好的描述。并且必须有一个更整洁的方法。我不是在寻找代码示例,只是朝着正确的概念方向推进来处理这个问题。

4

2 回答 2

2

哇。相当大的文字墙。因此:

分解

您的设置

目前,它生成一个人类对象数组并运行一个 for 循环来循环通过一组改变它们之间关系的动作,我将它们存储在一个二维整数数组中。

我希望程序能够清楚地打印发生的动作。

我认为最好的方法是在我的“动作”类中添加一个字符串描述(它存储了演员、反应器和关系变化量的变量)。

听起来你的Action课到目前为止看起来像这样:

public class Action {
    private String reactor;
    private String actor;
    private double hateMeasure;
    /* Obligatory constructor method, getters, and setters go here */
}

你的麻烦

我希望它更具体一点(“人 A 向人 B 的头扔了一块石头!”)。

...尝试使用引用actor和reactor的描述字符串构造一个动作让我......“在定义之前无法引用字段。”

在这一点上,我不太确定您是如何设置参考字段的,以及您是如何遇到此错误的。

我知道您不是在寻找代码,但您必须理解在不向他们展示一些基本原理说明代码的情况下让某人进入“程序员模式”的困难。

也许创建一个方法,它接受actor和reactor的两个参数,然后在每个动作发生后调用该方法?

public void reportAction(String reactor, String actor) {
    // do stuff
} 
/* if you're confused by how "reactor" and "actor" have the same names as 
   the instance variables, look into the "this" keyword */

或者(如果您的设置与我从您的描述中推断的不同,请添加这些实例变量,然后)您可以简单地在您的Action类中编写一个不带参数并简单地引用您的实例变量的新方法:

public void reportAction() {
    System.out.println(actor + " with " + reactor);
}

现在我突然想到,您可能希望指定反应器和演员之间发生的事情,而不是简单地说明两个特定模拟人之间发生的事情。在这种情况下...

public void reportAction() {
    System.out.print(actor);
    // you're going to have to define the change in hateMeasure here
    if( deltaHateMeasure > 0 ) { 
        System.out.print(" had a fight with " + reactor);
    } else { /* print other stuff */ }
}

另一件有趣的事情是三元运算符,如果你想简洁地编写代码的话。

玩得开心!


编辑:

甚至更好!在你的类中添加一个String descriptor;实例变量!

然后这一切都归结为...:

public void reportAction() {
    System.out.println(actor + descriptor + reactor);
}
于 2013-06-30T22:57:23.533 回答
0

我不确定您是如何编写课程的。我是否正确假设在您想要打印字符串时,您确实知道演员和反应器的名称?

如果是这样,您应该能够按照以下方式做一些事情:

System.out.printf(action.description, actor.name, reactor.name);

在这种情况下 action.description (或你存储描述字符串的任何地方)看起来像:

"%s has thrown a rock at %s's head!";

我希望这有帮助!

于 2013-06-30T22:26:38.503 回答