1

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

这是一个关于 C# 的问题。

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

  1. 添加单词
  2. 显示单词列表
  3. 退出

我用一个开关做到了,开关在一个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);
      }
}
4

5 回答 5

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,但是该代码没有意义。

于 2013-04-19T16:01:11.940 回答
2

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

case '1':    

case 1:  

还有其他人。

您还在这里调用了 Console.Readline() 两次:

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

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

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

于 2013-04-19T15:59:40.200 回答
1

你的主要问题似乎是额外的 Console.ReadLine() 这里。删除第二个作为第一件事

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

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

由于其他人已经提到(int vs string)的原因,switch case不正确,但这不是您错误的原因。这将导致 switch 始终执行default语句但不会出错。毫无疑问,您需要解决这个问题。

于 2013-04-19T16:02:03.647 回答
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 语句正在切换字符,而不是数字:

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

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

于 2013-04-19T15:59:52.060 回答
1

考虑以下代码行:

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

你得到一个int,然后你正在与一个比较char。利用case 1:

另外,为什么两者兼而有之Console.ReadLine()

于 2013-04-19T15:59:58.000 回答