2016-08-16 2 views
2

Я довольно новичок в C# (начал изучать его неделю назад) с небольшим опытом в пакетном и Expression 2, и я работал над текстовой игрой, пытаясь выучить больше. Сначала я использовал goto-заявления, но, по большому счету, всех, кого я нашел, утверждения 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 как способ вернуться к предыдущим заявлениям для навигации по меню и, возможно, повторять алгоритмы для пошаговых игр. Я читал об использовании методов для этого в Alternative to using goto statement in C# (это в основном тот же вопрос, который у меня есть, кроме немного более неопределенного), но пример, который сделал Грег, для меня совсем не работает, до такой степени, что, вероятно, не стоит пытаться чтобы этот конкретный пример работал.

+1

Я думаю, что более подходящим сайтом для этого вопроса будет сайт http://codereview.stackexchange.com/ – BWA

+1

Да, не используйте операторы goto, никогда – Liam

+0

@Liam Весь смысл сообщения состоял в том, чтобы не использовать goto заявления, когда-либо. –

ответ

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 number is successfully parsed return number else run method again 
     return int.TryParse(Console.ReadLine(), out num)? 
        num : EnterNumber(); 
    } 

    public static void Main(string[] args) 
    { 
     int num = EnterNumber(); 
    } 

Когда мы можем использовать методы, циклы и рекурсию нет практическая необходимость использования GO TO с.

-1

В общем, вы используете методы или лямбда-выражения. Таким образом, ваше главное меню станет методом, который вы вызываете снова в конце кода.

3

Насколько я могу видеть, что Вы хотите бесконечный цикл:

... 
    while (true) 
    { 
     do 
     { 
     ... 
     } while (Go == 0); 

     Go = 0; 

     do 
     { 
     ... 
     } while (Go == 0); 
    } 
+0

Я прокомментировал это несколько минут назад, сказав, что это сработало, и это делается для этого примера, но я забыл упомянуть, что будет несколько вариантов; а не только магазин. Если бы я использовал бесконечный цикл, как это, я думаю, мне пришлось бы перебирать все меню, если, возможно, я не использовал много циклов. –

+0

@Rowan Tarshis: почему бы не добавить еще один пункт меню, * Exit *, на котором просто вызывается 'break;' (чтобы оставить только бесконечный цикл выше) или 'return;' (чтобы оставить функцию 'Main' и, следовательно, программу)? –

+0

Я не уверен, что вы имеете в виду. Под «другим пунктом меню» вы подразумеваете другое меню, например, магазин или что-то еще? Кроме того, «Выход», который просто вызывает «break;» (чтобы оставить только бесконечный цикл выше), «вы имеете в виду, что он« ломается »во второй бесконечный цикл или я не понимаю это? –

0

Одно из предложений было бы использовать корпус переключателя построить так:

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(); 

} 
Смежные вопросы