2014-09-24 55 views
0

我目前正在編寫一個模擬大規模Java作戰的羣體AI程序。繼承相同父項的兩個對象已交換屬性

public abstract class AIUnit 
{ 
private int health; 

protected AIUnit(int health) 
{ 
    this.health = health; 
} 

public abstract void Move(); //Move unit 
public abstract void Attack(AIUnit unit); //Attack unit in front 
public abstract void Send(int freq,int msg); //Send message on frequency 
public abstract void Recv(); //Receive message 

public int GetHealth() 
{ 
    return health; 
} 

public void TakeDamage(String name) 
{ 
    --health; 
    System.out.println(name+" took damage! Health remaining: "+health); 
    if (health == 0) 
    { 
     System.out.println(name+" is dead!"); 
     this.Die(); 
    } 
} 

public void Die() 
{ 
    System.exit(0); 
} 
} 

有兩個AI類,作爲尚未:野蠻人和醫學,定義如下: 野蠻人:

public class Barbarian extends AIUnit 
{ 
private String name = "Barbarian"; 
public Barbarian(int health) 
{ 
    super(health); 
} 
//Move unit 
public void Move() 
{ 
} 
//Attack unit in front 
public void Attack(AIUnit unit) 
{ 
    unit.TakeDamage(name); 
} 
//Send message on frequency 
public void Send(int freq, int msg) 
{ 
} 
//Receive message 
public void Recv() 
{ 
} 
} 

,我用一個抽象類,AIUnit,定義如下: Medic:

public class Medic extends AIUnit 
{ 
private String name = "Medic"; 
public Medic(int health) 
{ 
    super(health); 
} 
//Move unit 
public void Move() 
{ 
} 
//Attack unit in front 
public void Attack(AIUnit unit) 
{ 
    unit.TakeDamage(name); 
} 
//Send message on frequency 
public void Send(int freq, int msg) 
{ 
} 
//Receive message 
public void Recv() 
{ 
} 
//Heal unit 
public void Heal(AIUnit unit) 
{ 
} 
} 

請注意,這兩個類大多相同,僅在名稱上有所不同,並且Medic類具有未實現的Heal方法。

現在,測試一個簡單的攻擊方法時,具有下列主要類:

import java.util.Random; 

public class Main 
{ 
public static int barbhealth = 3; 
public static int medhealth = 2; 
public static void main(String[] args) 
{ 
    Random rand = new Random(); 
    int whoAttacks = rand.nextInt() % 2; 
    Barbarian b = new Barbarian(barbhealth); 
    Medic m = new Medic(medhealth); 
    for(;;whoAttacks = rand.nextInt() % 2) 
    { 
     if (whoAttacks == 0) 
      m.Attack(b); 
     else 
      b.Attack(m); 
    } 
} 
} 

我得到奇怪的結果。出於某種原因,應該有3個健康狀況的野蠻人以2開頭,而Medic應該有2個健康狀態,以3開頭。任何人都可以解釋這種行爲嗎?

+1

創建一個展示奇怪行爲的最小自包含測試用例。 – aioobe 2014-09-24 18:57:34

+0

更新:調用Attack()的對象正在受到傷害。 :/ – Dolphiniac 2014-09-24 18:59:12

+0

這將是很好,如果有一種機制,遵循程序一步一步地做他的工作,看看會發生什麼...... – Tom 2014-09-24 19:02:54

回答

5

您打印的名稱錯誤。鑑於

m.Attack(b); 

//Attack unit in front 
public void Attack(AIUnit unit) 
{ 
    unit.TakeDamage(name); 
} 

public void TakeDamage(String name) 
{ 
    --health; 
    System.out.println(name+" took damage! Health remaining: "+health); 
    if (health == 0) 
    { 
     System.out.println(name+" is dead!"); 
     this.Die(); 
    } 
} 

thisMedic。所以unitBarbarianname"Medic"。所以它看起來像Medic正在造成的傷害,當它真的是Barbarian

+0

好的,謝謝!得到它了。儘快接受你的回答。 – Dolphiniac 2014-09-24 19:00:34

相關問題