Упражнение. Создание логики принятия решений с помощью инструкций if
- 19 минут
Большинство приложений включают большое количество путей выполнения. Например, приложение может реализовать различные пути выполнения в зависимости от того, какой параметр меню выбирает пользователя. Разработчики ссылаются на код, реализующий различные пути выполнения в виде ветвей кода.
Наиболее широко используемым оператором ветвления кода является if инструкция. Оператор if основывается на логическом выражении, заключенном в круглые скобки. Если выражение окажется истинным, то выполняется код, следующий за оператором if. Если нет, среда выполнения .NET игнорирует код и не выполняет его.
В этом упражнении вы научитесь писать if инструкции, создавая игру. Сначала вы определите правила игры, а затем реализуйте их в коде.
Вы будете использовать метод Random.Next(), чтобы имитировать бросок трех шестигранных кубиков. Вы вычислите свернутые значения для вычисления оценки. Если оценка больше произвольной суммы, вы увидите выигрышное сообщение пользователю. Если оценка ниже порога, вы отобразите пользователю сообщение о проигрыше.
- Если любые две из бросаемых вами костей имеют одинаковые значения, вы получаете два бонусных очка за дубль.
- Если все три игральные кости, которыми вы бросаете, показывают одинаковое значение, вы получаете шесть премиальных баллов за бросок тройки.
- Если сумма бросков трех игральных костей плюс любых очков бонусов составляет 15 или больше, вы выигрываете в игру. В противном случае вы проиграли.
Вы будете уточнять правила по мере того, как узнаете больше об выражении if.
Внимание
Это упражнение широко использует класс System.Random. Вы можете обратиться к модулю Microsoft Learn под названием "Вызов методов из библиотеки классов .NET с помощью C#", если вам нужно освежить в памяти, как работает Random.Next().
Подготовка среды программирования
Этот модуль включает действия, которые помогут вам выполнить сборку и выполнение примера кода. Рекомендуется выполнить эти действия с помощью Visual Studio Code в качестве среды разработки. Использование Visual Studio Code для выполнения этих задач поможет вам стать более уверенным в написании и выполнении кода в среде разработки, которая используется профессионалами по всему миру.
Откройте Visual Studio Code.
Для открытия Visual Studio Code можно использовать меню Windows (или эквивалентный ресурс для другой ОС).
В меню Visual Studio Code "Файл" выберите "Открыть папку".
В диалоговом окне "Открыть папку" перейдите в папку "Рабочий стол Windows".
Если у вас есть другое расположение папки, в котором хранятся проекты кода, вместо этого можно использовать это расположение папки. Для этого обучения важно иметь расположение, которое легко найти и помнить.
В диалоговом окне "Открыть папку" выберите "Выбрать папку".
Если появится диалоговое окно безопасности с запросом доверия авторам, нажмите кнопку "Да".
В меню терминала Visual Studio Code выберите новый терминал.
Обратите внимание, что в командной строке на панели терминала отображается путь к текущей папке. Рассмотрим пример.
C:\Users\someuser\Desktop>Примечание.
Если вы работаете на собственном компьютере, а не в песочнице или размещенной среде, и вы выполнили другие модули Microsoft Learn в этой серии C#, возможно, вы уже создали папку проекта для примеров кода. Если это так, можно пропустить следующий шаг, который используется для создания консольного приложения в папке TestProject.
В командной строке терминала, чтобы создать консольное приложение в указанной папке, введите следующую строку:
dotnet new console -o ./CsharpProjects/TestProjectЭта команда .NET CLI использует шаблон программы .NET для создания проекта консольного приложения C# в указанном расположении папки. Команда создает папки CsharpProjects и TestProject для вас, а также использует TestProject в качестве названия вашего файла
.csproj.Если отображается сообщение о том, что файлы уже существуют, перейдите к следующим шагам. Вы повторно используете существующие файлы проекта.
В представлении EXPLORER разверните папку CsharpProjects .
Вы увидите папку TestProject и два файла, файл программы C# с именем Program.cs и файл проекта C# с именем TestProject.csproj.
В меню Visual Studio Code "Файл" выберите "Открыть папку".
В диалоговом окне "Открыть папку " выберите папку CsharpProjects и выберите "Выбрать папку".
В представлении EXPLORER разверните папку TestProject и выберите Program.cs.
Удалите существующие строки кода.
Вы будете использовать этот консольный проект C# для создания, сборки и запуска примеров кода во время этого модуля.
Закройте панель терминала.
Написание кода, который создает три случайных числа и отображает их в выходных данных
Убедитесь, что в Visual Studio Code открыт пустой файл Program.cs.
Чтобы создать исходный код для этого упражнения, введите следующее:
Random dice = new Random(); int roll1 = dice.Next(1, 7); int roll2 = dice.Next(1, 7); int roll3 = dice.Next(1, 7); int total = roll1 + roll2 + roll3; Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}");Потратьте минуту на проверку введенного кода.
Для начала создайте новый экземпляр
System.Randomкласса и сохраните ссылку на объект в переменной с именемdice. Затем вы вызываете методRandom.Next()на объектеdiceтри раза, предоставляя как нижнюю, так и верхнюю границы, чтобы ограничить возможные значения между1и6(верхняя граница является исключительной). Вы сохраняете три случайных числа в переменныхroll1roll2иroll3соответственно.Затем вы суммируете три свертывания dice и сохраните значение в целочисленную переменную с именем
total.Наконец, вы используете метод
WriteLine()для отображения трех значений с помощью интерполяции строк.При выполнении кода должно отобразиться следующее сообщение (числа будут отличаться).
Dice roll: 4 + 5 + 2 = 11Эта первая задача была задачей установки. Теперь вы можете добавить логику принятия решений в код, чтобы сделать игру более интересной.
Добавление инструкции if для отображения различных сообщений на основе значения общей переменной
В редакторе Visual Studio Code найдите курсор в нижней части файла кода и создайте пустую строку кода.
Чтобы создать первую игру, введите следующие
ifинструкции.if (total > 14) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }Эти два
ifзаявления используются для обработки выигрышных и проигрышных сценариев. Потратьте минуту, чтобы изучить первоеifутверждение.Обратите внимание, что инструкция
ifсостоит из трех частей:- Ключевое слово
if. -
Логическое выражение между круглыми скобками
() -
Блок кода, определяемый фигурными скобками
{ }
Во время выполнения вычисляется логическое выражение
total > 14. Если это истинное утверждение (если значениеtotalбольше14), поток выполнения продолжит выполнение кода, определенного в блоке кода. Иными словами, программа будет выполнять код в фигурных скобках.Однако если логическое выражение имеет значение false (значение
totalне превышает14), поток выполнения пропустится мимо блока кода. Иными словами, программа не будет выполнять код в фигурных скобках.Наконец, второй оператор
ifуправляет сообщением для пользователя в случае проигрыша. В следующем модуле вы будете использовать вариантifвыражения, чтобы объединить эти два выражения в одно, которое более четко выражает намерение.- Ключевое слово
Что такое логическое выражение?
Логическое выражение — это любой код, возвращающий логическое значение true (истина) или false (ложь). Простейшие логические выражения — это просто значения true и false. Кроме того, логическое выражение может быть результатом метода, возвращающего значение true или false. Например, ниже приведен простой пример кода с использованием метода string.Contains() для определения того, содержит ли одна строка другую строку.
string message = "The quick brown fox jumps over the lazy dog.";
bool result = message.Contains("dog");
Console.WriteLine(result);
if (message.Contains("fox"))
{
Console.WriteLine("What does the fox say?");
}
Поскольку метод message.Contains("fox") возвращает значение true или false, он может считаться логическим выражением и использоваться в операторе if.
Можно создавать и другие простые логические выражения, используя операторы для сравнения двух значений. К операторам относятся:
-
==, оператор "равно" для проверки на равенство -
>, оператор "больше", чтобы проверить, что значение слева больше значения справа -
<, оператор "меньше", чтобы проверить, что значение слева меньше значения справа -
>=— оператор "больше или равно" -
<=— оператор «меньше или равно» - И так далее
Примечание.
Серия обучения C# в Microsoft Learn посвящена всему модулю логическим выражениям. Существует множество операторов, которые можно использовать для создания логического выражения, и вы будете охватывать только несколько основных принципов, приведенных в этом модуле. Дополнительные сведения о логических выражениях см. в модуле Microsoft Learn с именем "Оценка логических выражений для принятия решений в C#".
В этом примере вы оценили логическое выражение total > 14. Тем не менее, вы могли бы выбрать логическое выражение total >= 15 , так как в этом случае они одинаковы. Учитывая, что правила игры указывают "Если сумма трех кости, плюс какие-либо бонусы, составляет 15 или больше, вы выигрываете игру", вы, вероятно, должны реализовать >= 15 выражение. Вы измените это действие на следующем шаге упражнения.
Что такое блок кода?
Блок кода — это коллекция из одной или нескольких строк кода, определяемая открывающей и закрывающей фигурными скобками { }. Он представляет полную единицу кода, которая имеет единую цель в вашей программной системе. В этом случае во время выполнения все строки кода в блоке кода выполняются, если логическое выражение имеет значение true. И наоборот, если логическое выражение имеет значение false, все строки кода в блоке игнорируются.
Кроме того, следует знать, что блоки кода могут содержать другие блоки кода. Фактически, обычно один блок кода вложен внутри другого блока кода в ваших приложениях. Вы начнете вложить собственный блок кода позже в этом модуле, создавая одну if инструкцию внутри блока кода другого.
Примечание.
Серия обучения C# в Microsoft Learn посвящена всему модулю для понимания блоков кода. Блоки кода имеют принципиальное значение для понимания его организации и структуры, а также задают границы области действия переменных. Дополнительные сведения о блоках кода см. в модуле "Управление областью переменной и логикой с помощью блоков кода в C#".
Добавьте еще один оператор if для реализации бонуса за двойные значения
Затем вы можете реализовать правило: "Если при броске выпали одинаковые значения, вы получаете два бонусных очка за дубль". Измените код из предыдущего шага, чтобы он соответствовал следующему листингу кода:
В редакторе Visual Studio Code найдите курсор в пустой строке кода над первой
ifинструкцией.Чтобы создать функцию игры doubles, введите следующую
ifинструкцию.if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)) { Console.WriteLine("You rolled doubles! +2 bonus to total!"); total += 2; }Здесь вы объединяете три логических выражения для создания одного составного логического выражения в одной строке кода. Иногда это называют составным условием. У вас есть один внешний набор круглых скобок, объединяющий три внутренних набора круглых скобок, разделенных двумя символами вертикальной черты.
Символы двойного вертикального штриха
||— это логический оператор ИЛИ, который указывает: "либо выражение слева от меня, ИЛИ выражение справа от меня должно быть истинным, чтобы всё булевское выражение было истинным". Если оба логических выражения имеют значение false, то все логическое выражение имеет значение false. Вы используете два логических оператора OR, чтобы расширить оценку до третьего логического выражения.Во-первых, вы оцениваете
(roll1 == roll2). Если это правда, то всё выражение истинно. Если это значение false, вы оцениваете(roll2 == roll3). Если это правда, то всё выражение истинно. Если это значение false, вы оцениваете(roll1 == roll3). Если это правда, то всё выражение истинно. Если это ложь, то все выражение ложно.Если составное логическое выражение имеет значение true, выполните следующий блок кода. На этот раз мы используем две строки кода. Первая строка кода выводит сообщение пользователю. Вторая строка кода увеличивает значение
totalна2.Чтобы улучшить удобочитаемость кода, обновите вторую
ifинструкцию следующим образом:if (total >= 15)Обратите внимание, что теперь вы используете оператор
>=в выражении, которое используется для оценки выигрышного броска. Оператор>=означает "больше или равно". В результате можно сравнитьtotalсо значением15, а не с14. При этих изменениях выражение, используемое для оценки выигрышного ролла, теперь похоже на выражение для оценки проигрышного ролла. Это поможет упростить понимание кода (более читаемого). Так как вы работаете с целыми значениями, новое выражение(total >= 15)будет работать идентично написанной ранее(total > 14).Уделите минуту, чтобы просмотреть ваш код.
Код должен принять следующий вид:
Random dice = new Random(); int roll1 = dice.Next(1, 7); int roll2 = dice.Next(1, 7); int roll3 = dice.Next(1, 7); int total = roll1 + roll2 + roll3; Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}"); if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)) { Console.WriteLine("You rolled doubles! +2 bonus to total!"); total += 2; } if (total >= 15) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }Обратите внимание на улучшенное выравнивание между выражениями, используемыми для оценки выигрышных и проигрышных бросков.
Добавьте еще один оператор if для реализации тройного бонуса
Затем вы можете реализовать правило: "Если все три кости при броске показывают одно и то же значение, вы получаете шесть бонусных очков за выпадение тройни." Измените код из предыдущих шагов, чтобы он соответствовал следующему фрагменту кода:
В редакторе Visual Studio Code создайте пустую строку кода под блоком кода инструкции doubles
if.Чтобы создать функцию игры "тройной", введите следующую
ifинструкцию.if ((roll1 == roll2) && (roll2 == roll3)) { Console.WriteLine("You rolled triples! +6 bonus to total!"); total += 6; }Здесь вы объединяете два логических выражения, чтобы создать одно составное логическое выражение в одной строке кода. У вас есть один внешний набор круглых скобок, объединяющий два внутренних набора круглых скобок, разделенных двумя символами амперсанда.
Удвоенный символ амперсанда
&&— это логический оператор И, который по сути говорит: "Только если оба выражения имеют значение true, все выражение имеет значение true". В этом случае, еслиroll1равноroll2, аroll2равноroll3, то по логикеroll1должно быть равноroll3, и пользователь выбросил тройку.В меню File Visual Studio Code нажмите Сохранить.
Уделите минуту, чтобы просмотреть ваш код.
Убедитесь, что код соответствует следующему:
Random dice = new Random(); int roll1 = dice.Next(1, 7); int roll2 = dice.Next(1, 7); int roll3 = dice.Next(1, 7); int total = roll1 + roll2 + roll3; Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}"); if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)) { Console.WriteLine("You rolled doubles! +2 bonus to total!"); total += 2; } if ((roll1 == roll2) && (roll2 == roll3)) { Console.WriteLine("You rolled triples! +6 bonus to total!"); total += 6; } if (total >= 15) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }В представлении EXPLORER откройте терминал в папке TestProject, щелкните правой кнопкой мыши TestProject и выберите "Открыть в интегрированном терминале".
Панель терминала должна открыться и должна содержать командную строку, показывающую, что терминал открыт для расположения папки TestProject.
В командной строке терминала, чтобы запустить код, введите команду dotnet run и нажмите клавишу Enter.
Примечание.
Если появится сообщение "Не удалось найти проект для запуска", убедитесь, что в командной строке терминала отображается ожидаемое расположение папки TestProject. Например:
C:\Users\someuser\Desktop\csharpprojects\TestProject>Вы увидите выходные данные, похожие на один из следующих результатов:
Dice roll: 3 + 6 + 1 = 10 Sorry, you lose.Или вот так:
Dice roll: 1 + 4 + 4 = 9 You rolled doubles! +2 bonus to total! Sorry, you lose.Или вот так:
Dice roll: 5 + 6 + 4 = 15 You win!Или, если вам повезло, вы увидите следующее:
Dice roll: 6 + 6 + 6 = 18 You rolled doubles! +2 bonus to total! You rolled triples! +6 bonus to total! You win!Но подождите, следует ли вам действительно вознаграждать игрока как с тройным бонусом, так и двойным бонусом? В конце концов, комбинация из трёх имплицирует, что выпали также двойки. В идеале бонусы не должны складываться. Должно быть два отдельных условия бонуса. Это ошибка в логике, которая должна быть исправлена.
Проблемы в логике и возможностях для улучшения кода
Хотя это хороший старт, и вы узнали много об операторе if, логических выражениях, блоках кода, логических операторах ИЛИ и И и т. д., многое еще можно улучшить. Вы сделаете это в следующем модуле.
Кратко
- Используйте оператор
ifдля ветвления логики кода. Оператор принятия решенийifбудет выполнять код в блоке кода, если его логическое выражение эквивалентно значению true. В противном случае среда выполнения пропустит блок кода и продолжит выполнение следующей строки кода после блока кода. - Логическое выражение — это любое выражение, возвращающее логическое значение.
- Логические операторы будут сравнивать два значения слева и справа на равенство, сравнение и другие операции.
- Блок кода определяется фигурными скобками
{ }. Он объединяет строки кода, которые должны рассматриваться как единое целое. - Логический оператор И
&&объединяет два выражения, так что оба подвыражения должны быть истинными, чтобы всё выражение было истинным. - Логический оператор ИЛИ
||объединяет два выражения; если хотя бы одна из части выражения истинна, все выражение также будет истинным.