2017-03-09 68 views
0

我在我的游戏中有这个boss战,我正在为一个班级工作,并且它不按预期工作,在老板或玩家死后打印各种攻击和死亡消息。C#虽然循环不按预期工作

我很新的代码,今年刚开始为一类

在此先感谢!

这里的boss战:

public static void redKeeperBattle() 
    { 
      if (boss.redKeeperHealth <= 0 && (player.playerHealth <= 0)) 
      { 
       Console.Write("You have defeated "); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("The Red Keeper!"); 
       Console.ResetColor(); 
       Console.ReadLine(); 
       Console.Write("But you have also "); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("Died!"); 
       Console.ResetColor(); 
       Console.ReadLine(); 
       playerDeath(); 
      } 

      if (player.playerHealth <= 0) 
      { 

       boss.redKeeperAlive = false; 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.Write("The Red Keeper "); 
       Console.ResetColor(); 
       Console.WriteLine("has killed {0}, how sad...", player.playerName); 
       Console.ReadLine(); 
       playerDeath(); 
      } 

      if (boss.redKeeperHealth <= 0) 
      { 
       boss.redKeeperAlive = false; 
       Console.Write("You have defeated "); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("The Red Keeper!"); 
       Console.ResetColor(); 
       Console.ReadLine(); 
       redKeeperRoom(); 
      } 


      while (boss.redKeeperAlive == true) 
      { 


       //Player damage 
       Random pDmg = new Random(); 
       int playerDmg = pDmg.Next(5, 16); 

       //Player dodge 
       Random pDodge = new Random(); 
       int playerDodge = pDodge.Next(1, 11); 

       //Player crit 
       Random pCrit = new Random(); 
       int playerCrit = pCrit.Next(10, 16); 

       //Red keeper damage 
       Random rDmg = new Random(); 
       int redDmg = rDmg.Next(1, 21); 

       Console.Clear(); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("--------------------------------------------------------------------------------"); 
       Console.WriteLine(""); 
       Console.WriteLine("THE RED KEEPER: {0} HP", boss.redKeeperHealth); 
       Console.ResetColor(); 
       Console.WriteLine(""); 
       Console.Write("{0}: ", player.playerName); 
       if (player.playerHealth > 50) 
       { 
        Console.ForegroundColor = ConsoleColor.Green; 
       } 
       else if (player.playerHealth > 20) 
       { 
        Console.ForegroundColor = ConsoleColor.Yellow; 
       } 
       else { 
        Console.ForegroundColor = ConsoleColor.Red; 
       } 
       Console.WriteLine("{0}", player.playerHealth); 
       Console.WriteLine(""); 
       Console.WriteLine(""); 
       Console.ForegroundColor = ConsoleColor.Magenta; 
       Console.WriteLine("What would you like to do?"); 
       Console.WriteLine("1) Attack"); 
       Console.WriteLine("2) Dodge"); 
       Console.WriteLine(""); 
       Console.ResetColor(); 

       string attackChoice = Console.ReadLine(); 


       if (attackChoice == "1" && (playerCrit == 15)) 
       { 
        playerDmg += playerCrit; 
        Console.WriteLine(""); 
        Console.Write("You critically struck "); 
        Console.ForegroundColor = ConsoleColor.Red; 
        Console.WriteLine("The Red Keeper "); 
        Console.ResetColor(); 
        Console.WriteLine("for {0} HP!", playerDmg); 
        Console.ForegroundColor = ConsoleColor.Gray; 
        Console.WriteLine("Press Enter to end your turn..."); 
        boss.redKeeperHealth -= playerDmg; 
        Console.ReadLine(); 
        Console.ForegroundColor = ConsoleColor.Red; 
        Console.Write("The Red Keeper "); 
        Console.ResetColor(); 
        Console.WriteLine("hit you for {0}", redDmg); 
        Console.ForegroundColor = ConsoleColor.Gray; 
        Console.WriteLine("Press Enter to end his turn..."); 
        Console.ResetColor(); 
        player.playerHealth -= redDmg; 
        Console.ReadLine(); 
        redKeeperBattle(); 
       } 

       if (attackChoice == "1") 
       { 
        Console.WriteLine(""); 
        Console.WriteLine("You hit The Red Keeper for {0}", playerDmg); 
        Console.ForegroundColor = ConsoleColor.Gray; 
        Console.WriteLine("Press Enter to end your turn..."); 
        boss.redKeeperHealth -= playerDmg; 
        Console.ReadLine(); 
        Console.ForegroundColor = ConsoleColor.Red; 
        Console.Write("The Red Keeper "); 
        Console.ResetColor(); 
        Console.WriteLine("hit you for {0}", redDmg); 
        Console.ForegroundColor = ConsoleColor.Gray; 
        Console.WriteLine("Press Enter to end his turn..."); 
        Console.ResetColor(); 
        player.playerHealth -= redDmg; 
        Console.ReadLine(); 
        redKeeperBattle(); 
       } 

       if (attackChoice == "2" && (playerDodge > 5)) 
       { 
        Console.WriteLine(""); 
        Console.ForegroundColor = ConsoleColor.DarkGray; 
        Console.WriteLine("You attempt to dodge!"); 
        Console.ResetColor(); 
        Console.ReadLine(); 
        Console.ForegroundColor = ConsoleColor.Green; 
        Console.WriteLine("You successfully dodged and gained 10 HP!"); 
        Console.ReadLine(); 
        player.playerHealth += 10; 
        Console.ForegroundColor = ConsoleColor.Red; 
        Console.Write("The Red Keeper "); 
        Console.ResetColor(); 
        Console.WriteLine("would have hit you for {0} HP!", redDmg); 
        Console.ReadLine(); 
        redKeeperBattle(); 
       } 

       if (attackChoice == "2") 
       { 
        Console.WriteLine(""); 
        Console.ForegroundColor = ConsoleColor.DarkGray; 
        Console.WriteLine("You attempt to dodge!"); 
        Console.ResetColor(); 
        Console.ReadLine(); 
        Console.ForegroundColor = ConsoleColor.Red; 
        Console.WriteLine("Dodge failed!"); 
        Console.ResetColor(); 
        Console.ReadLine(); 
        Console.ForegroundColor = ConsoleColor.Red; 
        Console.Write("The Red Keeper "); 
        Console.ResetColor(); 
        Console.WriteLine("hit you for {0}", redDmg); 
        Console.ForegroundColor = ConsoleColor.Gray; 
        Console.WriteLine("Press Enter to end his turn..."); 
        Console.ResetColor(); 
        player.playerHealth -= redDmg; 
        Console.ReadLine(); 
        redKeeperBattle(); 

       } 
       else { 

        Console.WriteLine(""); 
        Console.ForegroundColor = ConsoleColor.Red; 
        Console.WriteLine("An error occurred! Please try again!"); 
        Console.ForegroundColor = ConsoleColor.Gray; 
        Console.WriteLine("Press Enter to continue..."); 
        Console.ResetColor(); 
        Console.ReadLine(); 
        redKeeperBattle(); 
       } 

      } 

    } 
    public static void redKeeperRoom() 
    { 
     //Continue game 
     Console.WriteLine ("The boss has died!"); 
     Console.ReadLine(); 
    } 


    public static void playerDeath() 
    { 
     //End game 
     Console.WriteLine ("You have Died!"); 
     Console.ReadLine(); 
    } 

所以会发生什么是当人死后,它只是像修建垃圾邮件:

你打红守护者12 按Enter键结束轮到你了.. 。

红色守护打你14 按Enter键结束轮到他...

你已经打败了红色的守护者!

老板死了!

发生错误!请再试一次! 按Enter继续...

您已击败The Red Keeper!

老板死了!

你打红守护者29 按Enter键结束轮到你...

红色守护打你19 按Enter键结束轮到他...

你已经打败了的红色的守护者!

但你也死了!

你已经死了!

+1

你有没有考虑时会发生什么'redKeeperBattle()'因为你是递归(这你可能不希望做调用它的回报... )。即'redKeeperBattle()'调用调用'redKeeperBattle()'的redKeeperBattle()'。现在,当第三个人回来时,控制权交还给第二个人。第二个电话是否正确?您可以使用静态int来计算呼叫号码并打印一些调试信息,以告诉您哪个呼叫正在输出意外数据。 – John3136

+0

:/代码墙 –

+0

对不起@ J.SMTBCJ15我真的不知道我在做什么。 :/ – Josh

回答

0

您使用递归循环和while循环,它太复杂了。这是很难理解你到底是什么问题。你必须选择使用什么

1)循环

function P(){ 
    while(boss.redKeeperAlive == true){ 

     if(condition) 
      boss.redKeeperAlive = false; 
    } 
} 

2)递归

function P(){ 
     if(boss.redKeeperAlive == true){ 
      P() 
     } 
} 

但不能同时在同一时间。

+0

嘿,非常感谢你的工作!我只是拿出了一些时间,并且使用了一些if和else,如果是,我就完成了! – Josh

+0

乔希,我很高兴它帮助。不用谢。 –

0

这里是代码的修改版本。由于它是基于你的代码,它仍然需要更多的工作,但我注意到的一些事情是:

  1. 没有使用函数。
  2. 没有正确使用“if”语句。
  3. 没有正确使用递归和循环。

我建议读一读这些。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
public class Boss 
{ 
    public int redKeeperHealth = 100; 
} 

public class Player 
{ 
    public int playerHealth = 100; 
    public string playerName = "Ace"; 
} 

class Program 
{ 
    public static Boss boss = new Boss(); 
    public static Player player = new Player(); 

    static void Main(string[] args) 
    { 
     redKeeperBattle(); 
    } 

    public static void redKeeperBattle() 
    { 
     //Player damage 
     Random pDmg = new Random(); 
     int playerDmg; 

     //Player dodge 
     Random pDodge = new Random(); 
     int playerDodge; 

     //Player crit 
     Random pCrit = new Random(); 
     int playerCrit; 

     //Red keeper damage 
     Random rDmg = new Random(); 
     int redDmg; 

     while (boss.redKeeperHealth > 0 && player.playerHealth > 0) 
     { 
      PrintToScreen(); 
      int playerChoice = ReadPlayerChoice(); 

      if (playerChoice == 1) 
      { 
       playerDmg = pDmg.Next(5, 16); 
       playerCrit = pCrit.Next(10, 16); 
       if (playerCrit == 15) 
       {       
        playerDmg += playerCrit; 
        Console.WriteLine(""); 
        Console.Write("You critically struck "); 
       } 

       Console.WriteLine(""); 
       Console.WriteLine("You hit The Red Keeper for {0}", playerDmg); 
       boss.redKeeperHealth -= playerDmg; 

       redDmg = rDmg.Next(1, 21); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.Write("The Red Keeper "); 
       Console.ResetColor(); 
       Console.WriteLine("hit you for {0}", redDmg); 
       Console.ForegroundColor = ConsoleColor.Gray; 
       redDmg = rDmg.Next(1, 21); 
       player.playerHealth -= redDmg; 

       Console.WriteLine("Press Enter to continue"); 
       Console.ReadLine(); 
       Console.ResetColor();      
      } 

      else if (playerChoice == 2) 
      { 
       Console.WriteLine(""); 
       Console.ForegroundColor = ConsoleColor.DarkGray; 
       Console.WriteLine("You attempt to dodge!"); 
       Console.ResetColor(); 
       Console.ReadLine(); 

       playerDodge = pDodge.Next(1, 11); 
       if (playerDodge > 5) 
       { 
        redDmg = rDmg.Next(1, 21); 
        Console.ForegroundColor = ConsoleColor.Green; 
        Console.WriteLine("You successfully dodged and gained 10 HP!"); 
        Console.ReadLine(); 
        player.playerHealth += 10; 
        Console.ForegroundColor = ConsoleColor.Red; 
        Console.Write("The Red Keeper "); 
        Console.ResetColor(); 
        Console.WriteLine("would have hit you for {0} HP!", redDmg); 
        Console.ReadLine(); 
       } 
       else 
       { 
        redDmg = rDmg.Next(1, 21); 
        Console.ForegroundColor = ConsoleColor.Red; 
        Console.WriteLine("Dodge failed!"); 
        Console.ResetColor(); 
        Console.ReadLine(); 
        Console.ForegroundColor = ConsoleColor.Red; 
        Console.Write("The Red Keeper "); 
        Console.ResetColor(); 
        Console.WriteLine("hit you for {0}", redDmg); 
        Console.ForegroundColor = ConsoleColor.Gray; 
        Console.WriteLine("Press Enter to end his turn..."); 
        Console.ResetColor(); 
        player.playerHealth -= redDmg; 
        Console.ReadLine(); 
       } 

      }     
      else 
      { 

       Console.WriteLine(""); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("An error occurred! Please try again!"); 
       Console.ForegroundColor = ConsoleColor.Gray; 
       Console.WriteLine("Press Enter to continue..."); 
       Console.ResetColor(); 
       Console.ReadLine(); 
      } 


      if (boss.redKeeperHealth <= 0 && player.playerHealth <= 0) 
      { 
       Console.Write("You have defeated "); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("The Red Keeper!"); 
       Console.ResetColor(); 
       Console.ReadLine(); 
       Console.Write("But you have also "); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("Died!"); 
       Console.ResetColor(); 
       Console.ReadLine(); 
       playerDeath(); 
      } 

      if (player.playerHealth <= 0 && boss.redKeeperHealth > 0) 
      { 

       Console.ForegroundColor = ConsoleColor.Red; 
       Console.Write("The Red Keeper "); 
       Console.ResetColor(); 
       Console.WriteLine("has killed {0}, how sad...", player.playerName); 
       Console.ReadLine(); 
       playerDeath(); 
      } 

      if (boss.redKeeperHealth <= 0 && player.playerHealth > 0) 
      { 
       Console.Write("You have defeated "); 
       Console.ForegroundColor = ConsoleColor.Red; 
       Console.WriteLine("The Red Keeper!"); 
       Console.ResetColor(); 
       Console.ReadLine(); 
       redKeeperRoom(); 
      } 

     } 

    } 
    public static void redKeeperRoom() 
    { 
     //Continue game 
     Console.WriteLine("The boss has died!"); 
     Console.ReadLine(); 
    } 


    public static void playerDeath() 
    { 
     //End game 
     Console.WriteLine("You have Died!"); 
     Console.ReadLine(); 
    } 

    private static void PrintToScreen() 
    { 
     Console.Clear(); 
     Console.ForegroundColor = ConsoleColor.Red; 
     Console.WriteLine("--------------------------------------------------------------------------------"); 
     Console.WriteLine(""); 
     Console.WriteLine("THE RED KEEPER: {0} HP", boss.redKeeperHealth); 
     Console.ResetColor(); 
     Console.WriteLine(""); 
     Console.Write("{0}: ", player.playerName); 
     if (player.playerHealth > 50) 
     { 
      Console.ForegroundColor = ConsoleColor.Green; 
     } 
     else if (player.playerHealth > 20) 
     { 
      Console.ForegroundColor = ConsoleColor.Yellow; 
     } 
     else 
     { 
      Console.ForegroundColor = ConsoleColor.Red; 
     } 
     Console.WriteLine("{0}", player.playerHealth); 
     Console.WriteLine(""); 
     Console.WriteLine(""); 
     Console.ForegroundColor = ConsoleColor.Magenta; 
     Console.WriteLine("What would you like to do?"); 
     Console.WriteLine("1) Attack"); 
     Console.WriteLine("2) Dodge"); 
     Console.WriteLine(""); 
     Console.ResetColor(); 
    } 

    private static int ReadPlayerChoice() 
    { 
     return int.Parse(Console.ReadLine()); 
    } 
} 

}

-Enjoy