2014-03-04 98 views
0

基本上需要發生的是它需要檢查Champion的類型,並將其與挑戰進行比較以確定它是否確實可以做到這一挑戰,這很難解釋...... 嚮導能戰鬥「神奇」和「神祕」 戰士就可以打「打」和「神祕」 龍可以打「打」和「神祕(僅當龍會談)」JAVA AND OR和IF

我來了這是...

public boolean canFight(String nme, int id) 
{ 
    Challenge chal = getChallengeObj(id); 
    Champion champ = getChampionObj(nme.toLowerCase()); 

    if(champ.getType().equals("wizard") && (chal.getTypeAsString().equals("magic") || chal.getTypeAsString().equals("fight"))) { 
     return true; 
    } else if(champ.getType().equals("warrior") && (chal.getTypeAsString().equals("fight") || chal.getTypeAsString().equals("mystery"))) { 
     return true; 
    } else if((champ.getType().equals("dragon") || champ.getType().equals("dragon") && champ.isMystery()) && (chal.getTypeAsString().equals("fight") || chal.getTypeAsString().equals("magic"))) { 
     return true; 
    } else { 
     return false; 
    } 

} 

我感謝任何人去幫助我,我願意接受任何迴應,甚至投訴代碼是多麼複雜!

(據檢查一切toLowerCase()順便說一句,萬一這個心不是清楚的代碼,因爲它是在方法是所謂的在不同的班級。

謝謝!

編輯

的問題是在於,它使返回false,我是一個大學二年級的學生,所以如果你能給你的意思是你的答案是什麼的例子,將不勝感激:) 再次感謝

+1

這是什麼問題? – Tyler

+1

你應該看看switch語句 – Katana24

+0

注意:爲''wizard「',''magic」',''warrior'',''fight''和'「mystery」創建常量會更好' – mdewitt

回答

1

在Java中從不同類型獲取不同行爲的最佳方式是使用 - 基本上,將虛擬方法放入Champion類型中,在嚮導,Warrior,Dragon等子類中具有不同的實現方式

if-一個對象的類型在Java中是一種反模式 - 要求重構爲一次虛擬方法的調用。

0

爲什麼不使用2D數組來映射Challenge和Champ之間的FightCompatilibity。將每個冠軍和挑戰模型化爲枚舉。也許,看看Visitor Pattern。它可能是有用的。

0

這正是一些東西,應該由階級層面來完成。就像你知道的,有人是巫師,你應該已經知道他可以攻擊或不能攻擊你,所以你應該把責任轉移到那個巫師類中,而不是從外部進行測試。

我做了4班的一個示例:

在此枚舉中列出的所有攻擊類型

public enum AttackTypes { 
    Magic, Meele, Ranged; 
} 

這是抽象類,它不僅可以幫助你定義的行爲是相同的所有類。我認爲每個班級都有一些「攻擊類型」(或類似的東西)。在我的例子中,我只是假設,每個班級只能對抗某些類型的攻擊。在構造函數中,我得到了所有可以戰鬥的攻擊,然後我可以用這個canAttack來攻擊它。


這是簡單的武士階層,在我的例子,它可以只打魔術和Meele:

public class Warrior extends Champion{ 
    public Warrior(){ 
     super(AttackTypes.Magic, AttackTypes.Meele); 
    }  
} 

而且類似戰士,這裏是精靈:

public class Wizard extends Champion{ 

    public Wizard(){ 
     super(AttackTypes.Ranged, AttackTypes.Magic); 
    } 
} 

這種方法很重要,因爲添加新類非常容易(例如Ranger)。你只需添加他和那些,你沒有任何東西在你已經完成的代碼中。


然後,你可以用它如下:

Champion wizard = new Wizard(); 
    Champion warrior = new Warrior(); 
    AttackTypes attackType = AttackTypes.Ranged; 

    System.out.println("can wizard attack? : " + wizard.canAttack(attackType)); 
    System.out.println("can warrior attack? : " + warrior.canAttack(attackType)); 

這有這樣的輸出:

can wizard attack? : true 
can warrior attack? : false 
0

一個更靈活的方法是使用一對enum秒。這樣的事情會是一個好的開始。我已經不完全符合你的邏輯,因爲在它的一個缺陷:

enum Champion { 

    Wizard(EnumSet.of(Challenge.Fight, Challenge.Magic)), 
    Warrior(EnumSet.of(Challenge.Fight, Challenge.Mystery)), 
    Dragon(EnumSet.of(Challenge.Fight, Challenge.Magic)) { 
       @Override 
       public boolean canFight(Champion enemy, Challenge attack) { 
        // For demonstration. 
        return susceptible.contains(attack) && enemy == Champion.Dragon; 
       } 
      }; 

    protected final Set<Challenge> susceptible; 

    Champion(Set<Challenge> susceptible) { 
     this.susceptible = susceptible; 
    } 

    public boolean canFight(Champion enemy, Challenge attack) { 
     return susceptible.contains(attack); 
    } 
} 

enum Challenge { 

    Magic, 
    Fight, 
    Mystery; 
} 

你的缺陷是在(champ.getType().equals("dragon") || champ.getType().equals("dragon") && champ.isMystery())這沒有任何意義。