How to design Guess Number game
UniLecsПрограмма загадывает случайное 3-х значное число (цифры могу повторяться). Задача игрока угадать это число.
Программа дает следующие подсказки:
- Если цифра присутствует в загаданном числе, и она стоит на своем месте, то программа выдаст значение "Right"
- Если цифра присутствует в загаданном числе, но она стоит НЕ на своем месте, то программа выдаст значение "Almost"
- Если нет ни одной цифры в загаданном числе, то программа выдаст значение "No".
У игрока есть 10 попыток угадать загаданное число.
Разбор
Разберем игру по блокам, которые должны будут работать:
- Функция генерации секретного числа, которое необходимо отгадать.
- Функция проверки очередного введенного пользователем числа. Функция на выходе будет давать подсказки для пользователя.
- Главная функция игры, которая будет запускать игру и обрабатывать ответы пользователя.
Ограничения игры:
- Для простоты обработки все числа мы будем хранить в строковом виде.
- Размер числа и количество попыток мы жестко укажем в коде.
В вашем проекте вы можете доработать игру и убрать эти ограничения, сделав игру более динамичной.
Реализация
Определим основные свойства и функции игры в классе IGame
interface IGame { string Name { get; } string Description { get; } void Play(); }
Теперь создадим класс игры "GuessNumber":
class GuessNumber: IGame { private readonly int NUM_DIGITS = 3; private readonly int MAX_GUESSES = 10; private readonly Random rnd; private string secretNumber; public string Name { get; } public string Description { get; } public GuessNumber() { rnd = new Random(); secretNumber = string.Empty; Name = "Guess Number"; Description = "Guess Number description"; } ... }
Функция генерации секретного числа, которое необходимо отгадать.
string getSecretNumber() { int num = 0; int d = 1; for (int i = 0; i < NUM_DIGITS; i++) { num += rnd.Next(10) * d; d *= 10; } return num.ToString(); }
Функция проверки очередного введенного пользователем числа.
private string GetTip(string guessNum) { if (guessNum == secretNumber) { return "Congrats!"; } var tips = new List<string>(); for (int i = 0; i < guessNum.Length; i++) { if (i < secretNumber.Length && guessNum[i] == secretNumber[i]) tips.Add("Right"); else if (secretNumber.Contains(guessNum[i])) tips.Add("Almost"); } if (!tips.Any()) return "No"; tips.Sort(); // иначе будет слишком просто угадать число return string.Join(" ", tips); }
Посмотреть главную функцию проекта и весь проект целиком можно на GitHub.
https://github.com/unilecs/ugames/blob/main/games/GuessNumber.cs