问题解决了!谢谢你们!!!
以下是关于C#的问题。
我有一个包含4个选项的菜单:
我用一个开关做了它,开关在一个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);
}
}
答案 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
语句但不是错误。毫无疑问,你需要解决这个问题。