How to design Guess Number game

How to design Guess Number game

UniLecs

Программа загадывает случайное 3-х значное число (цифры могу повторяться). Задача игрока угадать это число.

Программа дает следующие подсказки:

  1. Если цифра присутствует в загаданном числе, и она стоит на своем месте, то программа выдаст значение "Right"
  2. Если цифра присутствует в загаданном числе, но она стоит НЕ на своем месте, то программа выдаст значение "Almost"
  3. Если нет ни одной цифры в загаданном числе, то программа выдаст значение "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

Report Page