即使满足条件,也会中断循环

本文关键字:中断 循环 满足 条件 | 更新日期: 2023-09-27 18:36:21

我需要制作一个简单的程序,让用户输入,如果他们想尝试用骰子在 3 次掷骰子中获得 7、14 或 21

我的类骰子看起来像这样:

class Dobbelsteen
{
    private int zichtbaar; // value of dice
    Random random = new Random();
    public int getNummer   //Show value of dice
    {
        get { return zichtbaar; }
    }

    public Dobbelsteen()
    {
        zichtbaar = 0;
    }
    public void Gooien()
    {
        zichtbaar = random.Next(1, 7);          
    }
}

这应该没问题。

但是现在在我的主要情况下出了点问题; 它问了 3 次,如果他们幸运的话,它会坏掉(好),但现在失败的部分。如果它不起作用,他们必须键入任何内容才能重试,但如果键入 0,它将停止。就我而言,它总是会破裂。

class Program
{
    static void Main(string[] args)
    {

        int gekozengetal; //Chosen number 7,14 or 21

            Console.WriteLine("Je mag 3 keer met de dobbelsteen gooien. Wil je proberen 7, 14 of 21 te werpen?"); // Asks to give 7 14 or 21 to play;
            gekozengetal = Convert.ToInt32(Console.ReadLine()); // saves that in this int;
            while (gekozengetal== 7 || gekozengetal == 14 || gekozengetal == 21)
            {
                int opgeteld = 0;   // this is the values combined of the rolls.
                Dobbelsteen test = new Dobbelsteen();
                Console.WriteLine("Druk om je eerste dobbelsteen te gooien");
                Console.ReadKey();
                test.Gooien();
                opgeteld += test.getNummer;
                Console.WriteLine("Je eerste Dobbel was" + opgeteld);
                Console.WriteLine("Druk om je TWEEDE dobbelsteen te gooien");
                Console.ReadKey();
                test.Gooien();
                opgeteld += test.getNummer;
                Console.WriteLine("Je tweede Dobbel was" + test.getNummer +" samen is dit al" + opgeteld);
                Console.WriteLine("Druk om je DERDE dobbelsteen te gooien");
                Console.ReadKey();
                test.Gooien();
                opgeteld += test.getNummer;
                Console.WriteLine("Je derde Dobbel was" + test.getNummer + " samen is dit al" + opgeteld);

                if (opgeteld == gekozengetal)
                {
                    Console.WriteLine("HOERA, GEWONNEN.");
                    Console.ReadKey();
                    break;
                }

                else
                {
    Console.WriteLine("Loser je moest" +gekozengetal +" hebben en je bent" +opgeteld + "uitgekomen"); // Too bad; you didnt get lucky
    Console.WriteLine("WE GAAN OPNIEUW PROBEREN: DRUK 0 om te stoppen"); // Lets try again; press 0 to abort.
    int opnieuw = Convert.ToInt32(Console.ReadKey()); // Opnieuw = again
    if (opnieuw == 0)
    {
        break;
    }
    else
    {
        continue;
    }
}

提前谢谢你。

即使满足条件,也会中断循环

首先,很难解释这段代码。但我想以下情况可能是罪魁祸首:

int opnieuw = Convert.ToInt32(Console.ReadKey()); // Opnieuw = again
if (opnieuw == 0)
{
    break;
}
else
{
    continue;
}

你会看到'Console.ReadKey()返回一个类ConsoleKeyInfo的对象,你不能直接转换为int。我建议您将代码更改为以下内容:

ConsoleKeyInfo opnieuw = Console.ReadKey(); // Opnieuw = again
if (opnieuw == ConsoleKey.D0 || opnieuw == ConsoleKey.NumPad0)
{
    break;
}
else
{
    continue;
}

根据 MSDN 文档,Console.ReadKey() 返回类型为 ConsoleKeyInformation 的对象。Convert.ToInt32 应该不能将该类型的对象转换为 int。因此,一旦您到达从控制台读取下一个键并尝试将其转换为 int 的部分,Convert.ToInt32 就会抛出异常 (InvalidCastException)。

ConsoleKeyInfo 有一个属性"KeyChar",它保存作为字符按下的键。您可以检查它是否等于"0"并结束程序:

ConsoleKeyInfo kinfo = Console.ReadKey();
char keyPressed = kinfo.KeyChar;
if (keyPressed.Equals('0')
{
    break;
}
else
{
    continue;
}