切换语句不在循环内执行,循环不循环

时间:2013-04-19 15:53:14

标签: c# while-loop switch-statement

问题解决了!谢谢你们!!!

以下是关于C#的问题。

我有一个包含4个选项的菜单:

  1. 添加字词
  2. 显示单词列表
  3. 播放
  4. 退出
  5. 我用一个开关做了它,开关在一个while循环中,以便能够在执行任何选择后返回meny。

    我遇到的问题是,当我从菜单中进行选择时,没有任何事情发生,我收到一条错误信息,表示程序停止了......而且它没有循环... 在我将它放入while循环之前,它工作正常。因此,某些东西不适用于while循环中的开关。

    真的感谢任何帮助。我是初学者,请尝试解释一下:)

    我粘贴了迄今为止我在2个文件中找到的所有代码。一个叫做program.cs,另一个叫wordlist.cs:

    program.cs文件:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    
    class Hangman
    {
        static void Main()
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Title = "C# Hangman";
            Console.WriteLine("Welcome To C# Hangman!");
    
            //MENU
            int MenuChoice = 0;
            while (MenuChoice != 4)
            {
    
            Console.Write("\n\t1) Add words");
            Console.Write("\n\t2) Show list of words");
            Console.Write("\n\t3) Play");
            Console.Write("\n\t4) Quit\n\n");
    
            Console.Write("\n\tChoose 1-4: ");        //Choose meny item
    
            MenuChoice = Convert.ToInt32(Console.ReadLine());
            WordList showing = new WordList();
    
            MenuChoice = int.Parse(Console.ReadLine()); 
    
            switch (MenuChoice)
            {
                case '1':               
                    Console.Write("\n\tAdd a word\n\n");
                    var insert = Console.ReadLine();
                    showing.AddWord(insert);
                    Console.Write("\n\tList of words\n\n");
                    showing.ListOfWords();                
                    break;
                case '2':
                    Console.Write("\n\tList of words\n\n");
                    showing.ListOfWords();
    
    
    
                    break;
    
    
                case '3':   //Running game
    
                    int guesses;
                    Console.Write("\n\tHow many faults can you have: ");
                    guesses = Convert.ToInt32(Console.ReadLine());
                    Console.Write("\n\tAwesome, let´s play!\n");
    
    
                    String input;
                    bool wrong;
                    int NumberOfTries = 0;
    
    
                    do
                    {
                        Console.WriteLine("\n\n\tWrong guesses: " + NumberOfTries + " / " + guesses + "\n");
                        Console.WriteLine("\n\tGuessed letters:\n");
                        Console.WriteLine("\n\tWord:\n");
                        Console.Write("\n\n\tGuess letter: ");
                        input = Console.ReadLine();
                        Console.Write("\n\n\t ");
    
                        wrong = !input.Equals("t") &&
                              !input.Equals("e") &&
                              !input.Equals("s") &&
                              !input.Equals("t");
                        if (wrong)
                        {
                            NumberOfTries++;
                            Console.WriteLine("\n\tWrong letter " + "Try again!");
                        }
                        if (wrong && (NumberOfTries > guesses - 1))
                        {
                            Console.WriteLine("\n\tYou have failed " + guesses + ". End of game!\n");
                            break;
                        }
    
                    } 
                    while (wrong);
                    if (!wrong)
                        Console.WriteLine("\n\tWhohoo congrats!");
    
                    break;
    
                case '4':
                    Console.WriteLine("\n\tEnd game?\n\n");
                    break;
                default:
                    Console.WriteLine("Sorry, invalid selection");
                    break;  
            }
            MenuChoice++;
            if (MenuChoice < 30)
                continue;
            else
                break;
            }
    
        }
    
    }
    

    WordList.cs文件:

    using System;
    using System.Collections.Generic;
    
    class WordList
    {
        List <string> words = new List<string>();
    
        public void ListOfWords()
        {
            words.Add("test");         // Contains: test
            words.Add("dog");          // Contains: test, dog
            words.Insert(1, "shit"); // Contains: test, shit, dog
    
            words.Sort();
            foreach (string word in words) // Display for verification
            {
                Console.WriteLine(word);
    
            }
    
        }
    
        public void AddWord(string value){
            words.Add(value);
          }
    }
    

5 个答案:

答案 0 :(得分:3)

我将回复你自己代码的一部分,以解释正在发生的事情。具体来说,这是触及MenuChoice的所有内容,但switch本身除外。

int MenuChoice = 0;
while (MenuChoice != 4)
{
    MenuChoice = Convert.ToInt32(Console.ReadLine());
    MenuChoice = int.Parse(Console.ReadLine()); 

    // switch here.

    MenuChoice++;
    if (MenuChoice < 30)
        continue;
    else
        break;
    }
}

现在我们有了这个代码子集,让我们逐步完成它。

set MenuChoice = 0
is MenuChoice != 4? Yes, so loop.
    set MenuChoice to a number from Console
    set MenuChoice to a number from Console
    do Switch logic
    set MenuChoice to MenuChoice + 1
    is MenuChoice < 30? Yes, so go to next loop
is MenuChoice != 4? Yes, so loop.
    set MenuChoice to a number from Console
    set MenuChoice to a number from Console
    do Switch logic
    set MenuChoice to MenuChoice + 1
    is MenuChoice < 30? Yes, so go to next loop
is MenuChoice != 4? Yes, so loop.
    set MenuChoice to a number from Console
    set MenuChoice to a number from Console
    do Switch logic
    set MenuChoice to MenuChoice + 1
    is MenuChoice < 30? Yes, so go to next loop
Repeat until 3 is entered.

我不知道你为什么要递增MenuChoice,或者为什么要对30进行测试,但是这个代码没有意义。

答案 1 :(得分:2)

在您的开关循环中,您将获得MenuChoice并且它是整数。但是在你将它与Char进行比较的情况下。所以,这是例外的来源。改变

case '1':    

case 1:  

以及其他人。

此外,您在此处两次调用Console.Readline():

 MenuChoice = Convert.ToInt32(Console.ReadLine());
 WordList showing = new WordList();

 MenuChoice = int.Parse(Console.ReadLine());

你可以删除最后一个,因为在我看来它没用。

答案 2 :(得分:1)

您要设置两次条件:

// This is the one you likely want, as it will read "1", "2", "3", "4", etc
MenuChoice = Convert.ToInt32(Console.ReadLine());
WordList showing = new WordList();

// Remove this!  You only need to read once...
// MenuChoice = int.Parse(Console.ReadLine()); 

此外,您的案例陈述是在切换字符,而不是数字:

case 1: // Change to 1, not '1'    

由于您要转换为上面的int,您需要打开数值。

答案 3 :(得分:1)

考虑以下代码行:

MenuChoice = int.Parse(Console.ReadLine());
switch (MenuChoice)
{
    case '1':

您收到了int,然后您正在与char进行比较。使用case 1:

另外,为什么Console.ReadLine()

答案 4 :(得分:1)

你的主要问题似乎是额外的Console.ReadLine()。首先删除第二个

 MenuChoice = Convert.ToInt32(Console.ReadLine());
 WordList showing = new WordList();

 MenuChoice = int.Parse(Console.ReadLine()); // <--- Remove this line

由于其他人已经提到的(int vs string)原因,开关案例不正确,但这不是导致错误的原因。这将导致交换机始终执行default语句但不是错误。毫无疑问,你需要解决这个问题。