#c# #function #loops
#c# #функция #циклы
Вопрос:
Я пытаюсь написать программу, которая состоит из нескольких элементов (на данный момент их всего 2). В консоли не отображается никаких ошибок, но когда я пытаюсь вызвать основную функцию более одного раза, она не выполняет циклы внутри. Кстати, вот код.
public static class Program
{
public static string input = Convert.ToString(Console.ReadLine());
public static int health = 100;
public static int energy = 100;
public static void Main()
{
Console.WriteLine("This is a game used for testing items");
Console.WriteLine("Would you like to use items or get them? (Typing in status shows the value of your health and energy)");
if (Program.input == "get")
{
Items.GetItems();
}
if (Program.input == "use")
{
ItemUser();
}
if (Program.input == "status")
{
StatusChecker();
}
}
public static void StatusChecker()
{
Console.WriteLine("Your health is " Program.health);
Console.WriteLine("Your energy is " Program.energy);
}
public static void ItemUser()
{
Console.WriteLine("What do you want to use?");
string useChecker = Convert.ToString(Console.ReadLine());
if (useChecker == "healthPotion")
{
health = 100;
Items.healthPotion--;
}
if (useChecker == "energyDrink")
{
energy = 100;
Items.energyDrink--;
}
}
}
public static class Items
{
public static int healthPotion = 0;
public static int energyDrink = 0;
public static void GetItems()
{
Console.WriteLine();
string itemChecker = Convert.ToString(Console.ReadLine());
if ( itemChecker == "health potion")
{
healthPotion ;
Program.Main();
}
if (itemChecker == "energy drink")
{
energyDrink ;
Program.Main();
}
}
Итак, я хотел, чтобы программа получала значения после их обновления, но она просто останавливается после того, как я вызываю метод Main более одного раза. Кто-нибудь может мне помочь?
(Я не настолько силен в кодировании, поэтому не смог создать действительно эффективный код)
Комментарии:
1. У вас нет никаких циклов, только условные обозначения. Как вы выполняете программу?
2. Не существует «специальной обработки» функций независимо от того, содержат они циклы или нет. И ваши функции не содержат циклов.
3. У вас нет цикла, поэтому вам нужно представить свою реальную цель, чтобы люди могли вам помочь. Кроме того,
main()
представляет вашу программу; нет чтения / записи данных извне, ваши данные жестко закодированы в вашей программе, следовательно, каждый раз, когда вы вызываете свою программу, вы просто перезапускаете ее с нуля, т. Е. С теми же результатами!4. [Обзор] избегайте ввода пользователем ReadLine()) для установки вашего статического поля ввода. Переместите строку [ ввод = преобразование. toString(консоль. Прочитайте строку()); ] к процедуре Main() и посмотрите, что происходит с результатом GetItems()
Ответ №1:
В вашем Main
методе нет циклов, и каждый раз, когда вы запускаете приложение, вы начинаете с нуля, и каждая из ваших переменных содержит начальные значения. Если я правильно понимаю, чего вы пытаетесь достичь, я бы посоветовал вам написать Main
метод, подобный этому, чтобы иметь цикл, который будет запрашивать у пользователя команду, пока пользователь не введет "quit"
:
static void Main(string[] args)
{
Console.WriteLine("This is a game used for testing items");
while (true)
{
Console.WriteLine("Would you like to use items or get them? (Typing in status shows the value of your health and energy)");
string userAnswer = Console.ReadLine();
if (userAnswer == "quit") break;
if (userAnswer == "get")
{
Items.GetItems();
}
if (userAnswer == "use")
{
ItemUser();
}
if (userAnswer == "status")
{
StatusChecker();
}
}
}
Я также заметил, что при вызове ItemUser
метода вы обновляете статические переменные своего Items
класса, но в StatusChecker
методе вы записываете в консольные переменные своего Program
класса. Они на самом деле разные, поэтому я думаю, что в вашем StatusChecker
методе вы можете захотеть сделать следующее:
public static void StatusChecker()
{
Console.WriteLine("Your health is " Items.health);
Console.WriteLine("Your energy is " Items.energy);
}
Ответ №2:
Здесь вы присваиваете переменную:
public static string input = Convert.ToString(Console.ReadLine());
Поэтому в следующий раз, когда вы вызовете свой «основной» метод, он будет использовать значение, которое вы ввели при первом запуске вашего приложения. Если вы хотите, чтобы он запрашивал каждый раз, вам нужно будет сделать что-то вроде этого:
public static void Main()
{
input = Convert.ToString(Console.ReadLine());
...
}
Другое дело, что он может завершиться после первого вызова, если вы введете, например, «статус».
Проблема номер 3 заключается в том, что это не самый «хороший» способ написания программы. Основной метод должен выполняться при запуске вашего приложения, поскольку он является точкой входа (подробнее об этом здесь).