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