maebe
maebe

Reputation: 553

If statement within If statement's else

Still new to Java/android so trying to figure out the best way to code a multilevel if statement. What I'm trying to do is for a combat system that needs to check if player/npc is alive. If they are alive it then will check to see if they scored a critical hit. If they didn't critical hit then will see if they hit or missed.

combat = mydbhelper.getCombat();
startManagingCursor(combat);
if (playerCurHp == 0) {
    combat.moveToPosition(11);
    npcCombatStory = combat.getString(combat.getColumnIndex(dbhelper.KEY_COMBATDESC));
} else {
    if (playerCritFlag.equals("Critical")) {
        combat.moveToPosition(2);
        playerCombatStory = combat.getString(combat.getColumnIndex(dbhelper.KEY_COMBATDESC));
    } else {
        if (playerHitFlag.equals("Hit")) {
            combat.moveToPosition(1);
            playerCombatStory = combat.getString(combat.getColumnIndex(dbhelper.KEY_COMBATDESC));
        }
        if (playerHitFlag.equals("Miss")) {
            combat.moveToPosition(3);
            playerCombatStory = combat.getString(combat.getColumnIndex(dbhelper.KEY_COMBATDESC));
        }
    }
}           
if (npcCurHp == 0) {
    combat.moveToPosition(10);
    npcCombatStory = combat.getString(combat.getColumnIndex(dbhelper.KEY_COMBATDESC));
} else {
    if (npcCritFlag.equals("Critical")) {
        combat.moveToPosition(5);
        npcCombatStory = combat.getString(combat.getColumnIndex(dbhelper.KEY_COMBATDESC));
    } else {
        if (npcHitFlag.equals("Hit")) {
            combat.moveToPosition(4);
            npcCombatStory = combat.getString(combat.getColumnIndex(dbhelper.KEY_COMBATDESC));
        }
        if(npcHitFlag.equals("Miss")) {
            combat.moveToPosition(6);
            npcCombatStory = combat.getString(combat.getColumnIndex(dbhelper.KEY_COMBATDESC));
        }
    }
}   

Is what I'm using. Was working when I had the if statements all separate. But it would check each one and do actions I don't need (If they hit, pull String, if crit pull another, then if dead pull again). Trying to make it stop when it finds the "Flag" that matches. When doing my rolls if the player hits it sets the flag to "Hit" like below code.

Random attackRandom = new Random();
int attackRoll = attackRandom.nextInt(100);
totalAtt = attackRoll + bonusAttack + weaponAtt + stanceAtt;
Random defensiveRandom = new Random();
int defenseRoll = defensiveRandom.nextInt(100);
npcDef = defenseRoll + npcDodge + npcBonusDodge;
if (totalAtt > npcDef) {
    playerHitFlag = "Hit";
    playerDamage();
} else {
    playerHitFlag = "Miss";
    npcAttack();
}

At the end it takes these playerCombatStory and npcCombatStory strings and uses them to setText to show the player what happened on that turn of combat.

Upvotes: 0

Views: 458

Answers (3)

user387184
user387184

Reputation: 11053

I would change the type of npcCritFlag to int or enum. Then use switch statement with case

This should look much better and easier to understand

Upvotes: 0

pbeardshear
pbeardshear

Reputation: 1000

I think you are looking for the else if statement:

if (condition) {

}
else if (other_condition) {

}
else if (another_condition) {

}
else {
   // There can only be one else statement in a given if-else block
}

Upvotes: 2

duffymo
duffymo

Reputation: 308753

Your question isn't clear. But meaningful advice can still be offered.

Personally, I find this code hard to read. I think it'll be hard to maintain in the future as your logic becomes more complex.

I think you need to decouple the logic of what's done from how you decide. Encapsulate what's done in a Command object and use a map or state machine to look up what to do.

Upvotes: 0

Related Questions