我正在进行一项我正在尝试调试的作业。我有很多error: (method name) in class (SuperClass Name) cannot be applied to given types;
。该项目将一个以程序编程为中心的游戏重新用于同一游戏,但现在围绕OOP。我是Java的新手,他的任务是创建大量的类,其中两个是超类的子类(显然),我已经获得了具有哪些方法及其参数。我遇到的问题是,子类中的一个方法应该控制两个角色,即玩家和敌人之间的战斗。这两个类都是字符类(超类)的子类。由于这是一个课程作业,我不想发布我拥有的所有内容,但下面是我正在尝试执行的战斗方法的示例。我遇到的问题,一般来说,继续使用“继承”,正好父/子类之间继承的内容以及如何传递某些值/变量他们每个人之间。
在下面的示例代码中,此方法嵌套在扩展Player
类的Character
类中。此方法需要使用来自Enemy
类的敌人并执行其中的操作。根据结果,我将布尔值传递回程序的main方法。
我的问题是这个;我不确定如何在已经包含在“Player
”类下的方法中调用已在此示例中创建“Player
”类的类。调用Enemy
时,我被要求为方法使用一个参数。我很肯定我没有以适当的方式接近这个特定的任务,并且有更好的方法来解决这个问题。但任何有助于理解可能性的帮助都非常受欢迎,因为它将帮助我以正确的方式处理这项任务。
Player
类的示例方法如下:
public abstract class Character{ //Character Superclass - attack method called
public int attack(Player _player){
Random randomNumbers = new Random();
int enemyRandAtk = randomNumbers.nextInt(Weapon.getMaxDamage - Weapon.getMinDamage) + Weapon.getMinDamage;
int enemyAtk = enemyRandAtk + getStrength();
int charRemainingHP = _player.getHitPoints() - enemyAtk; //can I call _player in the Character class????
System.out.printf("%s attacks with ATK = %d + %d = %d\n", getName(), getStrength(), enemyRandAtk, enemyAtk);
System.out.printf("%s HP is now %d - %d = %d\n\n", _player.getName(), _player.getHitPoints(), enemyAtk, charRemainingHP);
return charRemainingHP;
}
public class Player extends Character{
public int attack(Enemy _enemy){
Random randomNumbers = new Random();
int enemyHP = _enemy.getHitPoints();
int charRandAtk = randomNumbers.nextInt(Weapon.getMaxDamage - Weapon.getMinDamage) + Weapon.getMinDamage;
int charAtk = charRandAtk + getStrength();
int enemyRemainingHP = _enemy.getHitPoints() - charAtk;
System.out.printf("\n\n%s attacks with ATK = %d + %d = %d\n", getName(), getStrength(), charRandAtk, charAtk);
System.out.printf("%s HP is now %d - %d = %d\n\n", _enemy.getName(), enemyHP, charAtk, enemyRemainingHP);
return enemyRemainingHP;
}
public boolean battleWizard(Enemy _enemy){
Random randomNumbers = new Random();
Scanner userInput = new Scanner(System.in);
int spellCast = randomNumbers.nextInt(4) + 1;
System.out.printf("*** %s vs The Evil Wizard ***\n\n", getName()); //getName() is in Player Class
boolean charWinning = false;
int updWizHP = _enemy.getHitPoints(); //****** Question 1. below
do{
System.out.print("Choose your action: \n" +
"1. Attack\n" +
"2. Attempt Spell Cast\n\n" +
"What would you like to do?: ");
int battleDecision = userInput.nextInt();
if (battleDecision == 1){
updWizHP = Player.attack(_enemy); //**** Question #2 Below
if (updWizHP <= 0){
charWinning = true;
break;
}
}else if(battleDecision == 2){
System.out.print("Enter your guess: ");
int playerGuess = userInput.nextInt();
if (playerGuess == spellCast){
System.out.printf("The %s's spell is cast successfully! The Wizard's HP is now 0!\n\n", getName());
charWinning = true;
updWizHP = 0;
break;
}else{
System.out.print("Your spell missed the Wizard. Now he attacks!\n");
}
}
if (getHitPoints() > 0){
enemyDamage = Enemy.attack();
decreaseHitPoints(_enemy.attack(Player)); \\**** Question #3 below
if (getHitPoints() < 0){
charWinning = false;
break;
}
}
}while(getHitPoints() > 0 && _enemy.getHitPoints() > 0);
if (charWinning)
return true;
else
return false;
}
}
请记住,这是一个子类(Player
)中的一种方法,它与(Enemy
)的方法大致相同,不包括这个和其他一些方法。
就我上面的代码而言,以下是我的具体问题:
方法battleWizard
中的第6行(注释中的#1问题) - 由于此方法位于Player
类中,我可以通过这种方式引用Enemy
类吗?如果没有,有什么更好的方法呢?
方法battleWizard
中的第12行(注释中的#2问题) - 当方法(代码示例)在类本身中时,如何引用具有以其自己的名称创建的对象的类?我想带终端用户的播放器player
并在其内部引用该对象,如果这有意义的话?我试图想象编译器将如何执行此任务,并且无法想象这有效。
从底部开始的13行(注释中的#3问题参考): a)你可以将一个方法作为参数传递给Java中的另一个方法吗? b)是调用另一个子类(与调用类的子类级别相同的子类级别)的正确方法,或者它是否可能?
感谢您的帮助。正如我之前提到的,因为这是一个类赋值,所以我不想提供更多代码示例。但不可避免的是,如果它能帮助我理解那么我会。请告诉我您需要的更多信息。
ETA:
我添加了额外的代码来描绘超级和子类之间的关系。对于Enemy
子类,它依赖于攻击方法的Character
超类。所以在我上面的代码示例中,我希望它澄清3.b.我的问题如需更多信息,请告知我们。
答案 0 :(得分:2)
您收到编译错误,因为您定义了attack(Player _player)
,这意味着您只允许传递Player
个对象,但您使用的是Player.attack(_enemy)
,这意味着传递Enemy
个对象
您需要更正此问题。阅读我的段落,&#34;作为旁边...&#34;。
方法战斗中的第6行向导(注释中的#1问题) - 自此 方法驻留在Player类中,我可以引用Enemy类 这条路?如果没有,有什么更好的方法呢?
根据您的代码示例,int updWizHP = _enemy.getHitPoints();
是一个有效且明智的通话,如果您想获得敌人的生命值。 _enemy
是你的敌人对象,只要该方法存在于该类中,你就可以使用任何方法。
方法战斗中的第12行向导(注释中的#2问题) - 我该怎么做 引用一个类,该类具有在其中创建的对象的自己的名称 方法(代码示例)是在类本身?我想接受 最终用户的玩家玩家并在其内部引用该对象,如果 那讲得通?我试图想象编译器将如何 执行此任务,无法想象这有效。
由于Player
正在扩展Character
,因此您可以在attack
类中继承Player
方法(将其视为attack
方法中的定义Character
方法1}}类)。因此,您真的不需要使用updWizHP = Player.attack(_enemy);
,但您只需使用updWizHP = attack(_enemy);
。但是,这是一个编译错误,请阅读我的第一部分和最后一部分答案。
现在,由于attack
方法未使用Player
类的任何实例字段(Player
类的状态),因此您无需担心,但如果是你必须思考并决定1>}哪个Player
类对象要用你的attack
方法。
从底部开始的13行(注释中的#3问题参考):a)你可以 将一个方法作为参数传递给Java中的另一个方法? b) 是调用另一个子类的正确方法(与子类相同 那个叫这个班的人这样或者甚至可能吗?
decreaseHitPoints(_enemy.attack(Player));
您没有将方法传递给其他方法但首先评估_enemy.attack(Player)
,并将int
作为您的代码将被返回,该值将传递给decreaseHitPoints
。_enemy.attack(Player)
会给你编译错误,因为你没有将Player
定义为对象引用变量。你必须使用一些变量,不能像这样使用类名。更好地使用_enemy.attack(this)
_enemy.attack(Player)
这表示在攻击方法中你要传递一个Player
对象,现在要么使用_enemy.attack(this)
,这意味着要传递调用battleWizard
的当前对象(make感觉)或使用_enemy.attack(new Player())
这意味着创建一个Player
类的新对象并传递它。
<小时/> 另外,我认为您最好将
public int attack(Player _player){
定义为public int attack(Character _character){
,因为将来您可以使用attack
方法传递Enemy
对象或Character
的一些子类
&#34;继承&#34; 和&#34;程序界面&#34; 的美妙之处。我建议你搜索并了解这两个概念。
<小时/> 很少有快速笔记,您可能会注意到(这些是试图揭示主题/概念的一般说明,可能会有更多的限制行为,所以请详细阅读每个主题/概念):
giveMeAnyCharacter(Character char)
可以用作giveMeAnyCharacter(new Person())
或giveMeAnyCharacter(new Enemy())
。this
表示当前对象或实例,super
表示超类。因此,要么创建一个新对象,要么想要使用您正在呈现的相同对象,请使用this
。答案 1 :(得分:1)
因此,Java具有&#34;可见性&#34;对于方法和字段(以及类),它定义了对其他类可见的确切内容。查找f.e. JLS 6.5.7.1-1,简单方法名称和可见性。
但是,在你的情况下&#34;不能应用于给定的类型&#34;意味着您传递的方法不同于签名所说的参数类型。
不过,对于问题2,您只需撰写this.attack(_enemy)
,或只是attack(_enemy)
。 (顺便说一句,下划线是什么?我希望它是转换中的神器而不是你的风格指南中的东西)
问题3:只需使用_enemy.attack(this)
。
答案 2 :(得分:1)
您的问题尚不清楚,但我认为问题在于您缺乏术语以及缺乏理解。我会为你试一试:
方法battleWizard中的第6行 - 由于此方法驻留在 玩家类,我可以用这种方式引用敌人类吗?如果不, 这样做的更好方法是什么?
int updWizHP = _enemy.getHitPoints(); //****** Question 1. below
如果getHitPoints()
类中有Player
,则无法使用Enemy
实例调用它。字段和方法必须存在于调用中使用的实例的类中,或者存在于其继承树(超类)中。
如果getHitPoints()
和Player
共有Enemy
,那么您应该将方法放在最接近的类中 - 在您的情况下,它应该是{{1} } .class。将该方法放在Character类中(并赋予它受保护的或公共可见性)允许它存在于Character
和Player
类中(和使用Player和Enemy的相关实例调用)
如何引用具有自己创建的对象的类 方法(代码示例)在类本身中的名称?
我可以想象你在这里描述的唯一一件事是这个关键字(你似乎没有在你的代码中使用它)。 Enemy
表示您所在班级的当前实例。
因此,使用this
是如何让当前的this.attack(_enemy)
实例攻击指定的敌人。
a)你可以将一个方法作为参数传递给另一个像这样的方法 Java的? b)是调用另一个子类(同一个子类)的正确方法 像这样调用类的级别)或者甚至可能吗?
a)否.Java不允许将方法作为参数传递。如果要传递方法,则必须将实例(包含该方法的类)作为变量传递 - 比如Player
- 然后调用要执行的方法{ {1}}。您正在做的是调用方法并使用返回值作为参数,这是完全允许的。
x
b)我认为你想要的是x.method()
。是的,您可以(并且应该)调用其他类中的方法 - 但如果您的调用类是不相关的(即不是从中继承),则只有在使用 public 可见性声明它们时才能调用这些方法。