public int attack(Bear bear)
{
int newStamina=bear.getStamina() - 50;
bear.setStamina(newStamina);
return bear.getStamina();
}
为了扩展我神话般的Bear课程,我决定实施attack
(!)方法。
我有2个熊对象实例:Bear1和Bear2。
在我脑海里:
Bear1.attack(Bear2);
然后我的代码获得Bear2
当前的耐力值并从中获取50,将其分配给newStamina变量。
Bear2
然后使用setStamina
方法传递这个新的stamina变量。
在残酷的熊袭击之后,我返回Bear2
的当前耐力。
这是有效的。但我想有更好的方法。
安美居。我想做的是:
int newStamina=bear.getStamina() - 50;
是:
if(newStamina <= 0)
{
// the bear is dead!
}
现在我的方法attack
返回int
,因为如果熊没有死,它仍然有HP,我想将此当前HP输出到控制台或任何地方。
如果熊没有耐力,那么我需要返回一些表示这一点的东西。
你会做什么?我不能回复假,我不确定无论如何都会有用。答案 0 :(得分:0)
我试过这个 - 返回一个对象而不是一个int。
public Bear attack(Bear bear)
{
int newStamina=bear.getStamina() - 50;
bear.setStamina(newStamina);
if(newStamina<=0)
{
bear.isDead=true;
}
return bear;
}
// in main
while(Bear2.isDead==false)
{
Bear1.attack(Bear2);
System.out.println(Bear2.getStamina());
}
if(Bear2.isDead)
{
System.out.println(Bear2.getName() + " is dead :(");
}
似乎工作..!将有兴趣看到其他解决方案。
答案 1 :(得分:0)
一个好的经验法则是仅修改set方法中的实例变量。这样做可以使您的代码更易于管理。
/**
* reduce this bears stamina by the given amount
*/
public void reduceStamina(int reduction) {
setStamina(getStamina() - reduction);
}
public void isDead() {
return getStamina() < 0;
}
public void attack(Bear otherBear) {
otherBear.reduceStamina(50);
if(otherBear.isDead()) {
this.victoryDance();
}
}
答案 2 :(得分:0)
从OOP的角度来看,我会将对象“熊”与其属性“stamina”从对象“战斗”中分开,对象“战斗”持有两只熊并处理攻击并“仍然活着”。几周前我在一个非常相似的问题上发表了一些例子:help with changing arrays into individual variables in Java
答案 3 :(得分:0)
而不是int
您可以返回Integer
。如果熊死了,你可以返回null
。
public Integer attack(Bear attackedBear){
Integer resultingStamina;
...
if(resultingStamina<=0){
resultingStamina = null;
}
return null;
}
答案 4 :(得分:0)
可能会为你完成这项工作:
public int attack(Bear bear)
{
int newStamina=bear.getStamina() - 50;
bear.setStamina(newStamina);
if(newStamina<=0)
{
bear.isDead=true;
}
return bear
}
并在你的主要部分验证退回的熊是否仍有耐力,如果不是GAME OVER ......
答案 5 :(得分:0)
public static void main()
{
Bear b1 = new bear();
Bear b2 = new bear();
while(!b2.IsDead())
{
b1.attack(b2);
System.out.println(b2.getStamina());
}
System.out.println(b2.getName() + " is dead :(");
}
public class Bear
{
private int _stamina;
public int getStamina()
{
return _stamina;
}
public bool Isdead()
{
return _stamina == 0;
}
public void sufferAttack(int dommage)
{
_stamina = dommage > _stamina ? 0:(_stamina - dommage);
}
public void attack(Bear b)
{
b.sufferAttack(50);
}
}
现在的原因。
首先。永远不要暴露内部属性。遵循Demeter定律,除了对象本身应该能够改变他当前的状态。
第二,返回int(b2的耐力)是没有意义的。 B1攻击b2和b1的方法返回b2耐力? B1号有责任攻击b1和b2遭受攻击的责任,并提供揭露其当前状态的方法。
在返回任何类型的值之前,你必须考虑每个类(以及每个方法)的责任。
当熊受到攻击时,我预计另一只熊会受到攻击,而当熊遭受攻击时,我预计它会失去一些耐力。
答案 6 :(得分:-1)
这样的事情:
return new Pair <Integer, Boolean> (newStamina, bear.isAlive());
不太好:返回2个整数,一个代表bool:
return new int [] {newStamina, bear.isAlive() ? 1 : 0};