2015-07-14 3 views
0

Я изучаю Javascript. Вот мой код. Это простая программа, в которой пользователь борется с драконом, но я добавил дополнительный бит, где, если дракон уменьшает здоровье пользователя до 0, код заканчивается. Всякий раз, когда я запускаю этот код, как только дракон начинает уменьшать здоровье пользователя, это все, что происходит. Пользователь не может торговать ударами с драконом. Что я делаю не так?Простые выражения JavaScript if/else

var userHealth = 5; 
var youHit = Math.floor(Math.random() * 2); 
var damageThisRound = Math.floor(Math.random()*5 + 1); 
var totalDamage = 0; 
var dragonDamage = Math.floor(Math.random() * 2); 
while (userHealth > 0) { 
    if (youHit) { 
     console.log("You hit the dragon!"); 
     totalDamage += damageThisRound; 
     console.log("Total damage dealt: " + totalDamage + "!"); 
     if (totalDamage >= 4) { 
      console.log("You slew the dragon!"); 
      userHealth = 0; 
     } 
     else { 
      youHit = Math.floor(Math.random() * 2); 
     } 
    } 
    else { 
     console.log("The dragon has dealt damage to you!"); 
     userHealth -= dragonDamage; 
     dragonDamage = Math.floor(Math.random() * 2); 
     console.log("Your health is now: " + userHealth + "!"); 
} 
} 
+1

Вы никогда не пересчитать 'youHit' когда дракон попадает в игрока, так что нет никакого способа' если (youHit) ', чтобы сделать что-нибудь еще больше. – JJJ

+0

Большое вам спасибо за помощь! – Streamer

ответ

0

youHit рассчитывается только один раз. Из-за этого, как только дракон наносит урон вашему игроку, он будет наносить урон.

Вы можете обернуть вычисления в функции и уволить их вместо этого:

function fightDragon() { 
    var userHealth = 5; 
    var youHit = function() { 
     return Math.floor(Math.random() * 2); 
    }; 
    var damageThisRound = function() { 
     return Math.floor(Math.random() * 5 + 1); 
    } 
    var totalDamage = 0; 
    var dragonDamage = function() { 
     return Math.floor(Math.random() * 2); 
    } 

    while (userHealth > 0) { 
     var damage = youHit(); 
     if (damage) { 
      console.log("You hit the dragon!"); 
      totalDamage += damageThisRound(); 
      console.log("Total damage dealt: " + totalDamage + "!"); 
      if (totalDamage >= 4) { 
       console.log('You slew the dragon!'); 
       break; 
      } 
     } else { 
      console.log('The dragon has dealt damage to you!'); 
      userHealth -= dragonDamage(); 
      console.log('Your health is now: ' + userHealth + '!') 
     } 
    } 

} 
+1

Я понимаю сейчас! youHit является ложным, поэтому это означает, что оператор else, который переназначает youHit после того, как пользователь ударил дракона, никогда не запускается. Я должен рассчитать youHit снова, когда дракон ударит пользователя. Спасибо за помощь!! – Streamer

0

Добавить вы попали по математике раунд код дракона:

var userHealth = 5; 
var youHit = Math.floor(Math.random() * 2); 
var damageThisRound = Math.floor(Math.random()*5 + 1); 
var totalDamage = 0; 
var dragonDamage = Math.floor(Math.random() * 2); 
while (userHealth > 0) { 
    if (youHit) { 
     console.log("You hit the dragon!"); 
     totalDamage += damageThisRound; 
     console.log("Total damage dealt: " + totalDamage + "!"); 
     if (totalDamage >= 4) { 
      console.log("You slew the dragon!"); 
      userHealth = 0; 
     } 
     else { 
      youHit = Math.floor(Math.random() * 2); 
     } 
    } 
    else { 
     console.log("The dragon has dealt damage to you!"); 
     userHealth -= dragonDamage; 
     youHit = Math.floor(Math.random() * 2); 
     dragonDamage = Math.floor(Math.random() * 2); 
     console.log("Your health is now: " + userHealth + "!"); 
} 
} 
+0

Awesome !! Спасибо за помощь!! – Streamer

0

В вашем случае все переменные вне цикл while вычисляется только один раз.

if (totalDamage >= 4) { 
    userHealth = 0; 
} else { 
    youHit = Math.floor(Math.random() * 2); 
} 

Этот код, указанный выше, не будет выполнен, так как если дракон убьет вас, игра закончится, и цикл закончен!

Также я добавил следующее: if (!! dragonDamage) условие, чтобы проверить, не сгенерирован ли сгенерированный урон для дракона. Другой способ заключается в добавлении 1 к результату вычислений dragonDamage =)

var userHealth = 5, 
    totalDamage = 0; 

while (userHealth > 0) { 

    var youHit = Math.floor(Math.random() * 2), 
     yourDamage = Math.floor(Math.random()*5 + 1), 
     dragonDamage = Math.floor(Math.random() * 2); 

    if (youHit) { 
     console.log("You hit the dragon for " + yourDamage); 
     totalDamage += yourDamage; 

     if (totalDamage >= 4) { 
      console.log("You slew the dragon!"); 
      userHealth = 0; 
     } 

    } else { 
     if (!!dragonDamage) { 
      console.log("The dragon has dealt damage to you!"); 
      userHealth -= dragonDamage; 
      console.log("Your health is now: " + userHealth + "!"); 
     } 
    } 
} 
0

пару вещей:

1) Вы хотите, чтобы пересчитать случайное значение youHit в «дракона нанесло ущерб вам "раздел:

youHit = Math.floor(Math.random() * 2); 

в противном случае, если удар игрока равен 0, то первый раз, он всегда будет оставаться 0 и дракон будет выигрывать каждый обмен.

2) В разделе «Вы попали в дракон» вы устанавливаете здоровье плеера на 0, чтобы выйти из цикла while, даже если здоровье игрока не должно быть на самом деле 0. Это проблема, если вы когда-либо намерены отображать здоровье игрока на протяжении всей игры. Я предлагаю добавить флаг в то время цикла:

var dragonSlain = false; 
while (userHealth > 0 && !dragonSlain) 
{ 
    ... 
    if (totalDamage >= 4) { 
     console.log("You slew the dragon!"); 
     //userHealth = 0; 
     dragonSlain = true; 
    } 
    ... 
} 
Смежные вопросы