goto语句的替代选项
本文关键字:选项 语句 goto | 更新日期: 2023-09-27 18:02:30
我对c#很不熟悉(一周前开始学习),对批处理和表达式2有一点经验,我一直在做一个基于文本的游戏,试图学习更多。我一开始用的是goto语句,但根据我找到的几乎所有人的说法,goto语句是死亡和绝望的混合体,所以我想学习更干净、更少邪恶的方法来达到同样的效果。下面是我制作的一个蹩脚的示例脚本来演示我的意思:
using System;
namespace TestScript
{
class Program
{
public static void Main(string[] args)
{
string ConsoleReadinator;
string ConsoleReadinator2;
int Go = 0;
mainmenu:
do
{
Go = 0;
Console.Clear();
Console.WriteLine("Main Menu:");
Console.WriteLine("Store or something");
ConsoleReadinator = Console.ReadLine().ToUpper();
if (ConsoleReadinator == "STORE") { Go = 1; }
} while (Go == 0);
// In-game store example
{
Go = 0;
do
{
Console.Clear();
Console.WriteLine("In-game store I guess");
Console.WriteLine("Stuff you can buy, etc");
ConsoleReadinator2 = Console.ReadLine().ToUpper();
if (ConsoleReadinator2 == "GO") { Go = 1; }
} while (Go == 0);
goto mainmenu;
}
}
}
}
这个脚本是功能性的,但我希望避免使用goto
作为回到之前的语句的方式,以便导航菜单,并可能重复回合制游戏的算法。我在c#中使用goto语句的替代方法(这基本上是我有相同的问题,除了有点模糊)中读到关于使用方法的内容,但是Greg在那里做的例子根本不适合我,以至于可能不值得尝试使那个特定的例子工作。
在我看来,你想要一个无限循环:
...
while (true)
{
do
{
...
} while (Go == 0);
Go = 0;
do
{
...
} while (Go == 0);
}
您可以使用递归,以便返回并再次执行代码。为此,您可以将代码移动到一个单独的方法中,并在此方法中调用它:
class Program
{
public static void Main(string[] args)
{
string ConsoleReadinator;
string ConsoleReadinator2;
Method(0);
}
private static void Method(int Go)
{
do
{
..
} while (Go == 0);
// In-game store example
do
{
...
} while (Go == 0);
Method(Go);
}
}
或者你可以用更好的方式使用循环。让我们看一下示例,当我们希望用户输入一个整数:
public static void Main(string[] args)
{
int num;
// This loop ends only when user enters proper integer number
do
{
Console.Clear();
Console.Write("Please enter some integer number: ");
} while(!int.TryParse(Console.ReadLine(), out num));
}
这可以通过递归的其他方式实现:
public static int EnterNumber()
{
Console.Clear();
Console.Write("Please enter some integer number: ");
// if the number is successfully parsed return number else run this method again
return int.TryParse(Console.ReadLine(), out num) ? num : EnterNumber();
}
public static void Main(string[] args)
{
int num = EnterNumber();
}
我们有这么多的选择(方法、循环和递归),再也没有使用GO TO
的实际用例了
通常使用方法或lambda表达式。因此,您的主菜单将成为您在代码末尾再次调用的方法。
一个建议是使用像这样的切换大小写结构:
static void Main(string[] args)
{
string ConsoleReadinator;
string MENU_TEXT = "Main Menu:";
string ADDITIONAL_INFO = "Store or something";
bool endProg = false;
ConsoleReadinator = printMenu(MENU_TEXT, ADDITIONAL_INFO);
// as long "EXIT" is not typed
while (!endProg)
{
switch (ConsoleReadinator)
{
case "STORE":
// Do your Store Stuff
// maybe change MENU_TEXT and ADDITIONAL_INFO
// and print a new Menu
ConsoleReadinator = printMenu(MENU_TEXT, ADDITIONAL_INFO);
break;
case "GO":
// Do your Go Stuff
break;
case "EXIT":
endProg = true; // set exit condition to true
break;
default:
break;
}
}
Console.ReadKey();
}
// one Method to use for Menu display
public static string printMenu(string menuText, string additionalInfo)
{
Console.Clear();
Console.WriteLine(menuText);
Console.WriteLine(additionalInfo);
return Console.ReadLine().ToUpper();
}