Игра "Отгадай задуманное число"
Переменные и константы игры
Алгоритм, реализующий задуманный сценарий игры, достаточно понятен и относительно прост. Однако, следует признать, что для начинающих программистов проект является сложным. Во многом сложность проекта объясняется тем, что, как для всякой игры, необходимо ввести большое число переменных, позволяющих менять параметры игры (в нашем случае –это уровень игры, границы интервала для задуманного числа, число вопросов для получения звания "Магистр игры", другие параметры). Организация разумного диалога с пользователем требует задания большого числа констант типа string.
Приведу описание констант и переменных, введенных в нашем проекте:
Random rnd = new Random(); //генератор случайных чисел int number; //задуманное число int N; //число вопросов для звания Магистр int level_game; //уровень игры int countQuestion = 0; //текущее число заданных вопросов string question; //очередной вопрос int min; //нижняя граница задуманного числа int max; //верхняя граница задуманного числа //границы случайных значений min и max //меняются в зависимости от уровня игры int limit_min = 10; int limit_max = 100; //константы для организации диалога const string ANSW = "Я задумал число в замкнутом интервале ["; const string ANSW1 = "Если отгадаешь число за "; const string ANSW2 = " вопросов, - станешь Магистром игры!\r\n"; const string ANSW3 = "Ответом на вопрос может быть только 'Да' или 'Нет'"; const string ANSW4 = "Поздравляю! Вы Магистр игры!\r\n"; const string ANSW44 = "Ваш уровень - "; const string ANSW5 = "Вы угадали! Я задумал число "; const string COMP = "----------- COMPUTER ----------"; const string COMP_ANSWER = "Я компьютер - Магистр игры! Я отгадал задуманное число ";
Поскольку все переменные снабжены содержательными комментариями, то я не буду останавливаться на пояснении их смысла.
Как компьютер "задумывает" число?
Рассмотрим, какие действия следует выполнить, чтобы компьютер мог "задумать число". Вот как устроен обработчик события кнопки "Компьютер, задумай число":
/// <summary> /// Компьютер задумывает число и определяет N /// число вопросов, достаточное для отгадывания /// и получения звания Магистр игры /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonThink_Click(object sender, EventArgs e) { //Уровень игры //определяет границы интервала, //в котором находится задуманное число level_game = int.Parse(textBoxLevelGame.Text); //нижняя и верхняя граница интервала //формируются как случайные числа min = rnd.Next(0, limit_min * level_game * level_game); max = rnd.Next(min, limit_max * level_game * level_game); //задуманное случайное число number = rnd.Next(min, max); //Функция log2 подсчитывает число вопросов //для звания Магистр N = Log2(max - min); //Вывод ответа компьютера о задуманном числе textBoxMin.Text = min.ToString(); textBoxMax.Text = max.ToString(); string answer = ANSW + min + ", " + max + "]\r\n" + ANSW1 + N + ANSW2 + ANSW3; textBoxAnswer.Text = answer; }
Первым делом определяется заданный пользователем уровень игры. Уровень влияет на границы интервала, в котором находится задуманное число. Заметьте, не только задуманное число является случайным, но и границы интервала формируются как случайные числа. Для формирования трех случайных значений используется переменная rnd класса Random, которая вызывает метод Next.
Зная границы интервала, можно подсчитать N - число вопросов, достаточное для определения задуманного числа. Для подсчета N используется функция Log2 (M), которая вычисляет двоичный логарифм числа M, округленный в большую сторону до ближайшего целого.
Вычисленные значения выводятся в соответствующие окна, информируя пользователя. После того, как число задумано, отгадать задуманное может пользователь, либо можно посмотреть, как эту работу выполняет компьютер.
Как пользователю отгадать задуманное число?
Чтобы отгадать задуманное число, пользователь может задавать компьютеру вопросы, получая ответы "да" или "нет". Задаваемые вопросы могут быть трех типов. Каждому типу вопроса соответствует своя командная кнопка. Рассмотрим, как устроен обработчик события Click кнопки "Число больше", позволяющий выяснить больше ли задуманное число, чем число n, указанное пользователем в вопросе:
/// <summary> /// Ответ компьютера на кнопку /// Задуманное больше X /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonGreat_Click(object sender, EventArgs e) { countQuestion++; question = countQuestion.ToString() + ". "; question += "Число больше "; int n = int.Parse(textBoxG.Text); question += n + "?"; if (number > n) question += " - Да!"; else question += " - Нет!"; listBoxQA.Items.Add(question); }
Компьютеру просто ответить на заданный вопрос. Достаточно из соответствующего окна прочесть значение числа n, указанное пользователем, и сравнить с задуманным числом number. Основная работа в этом обработчике связана с формированием ответа в понятной для пользователя форме.
Не буду приводить текст обработчика события Click командной кнопки "Число меньше". Он немногим отличается от приведенного выше текста.
Чуть сложнее устроен обработчик события Click командной кнопки "Число равно", поскольку в этом случае, если число отгадано, то игра завершается и должно быть сформировано сообщение о результате игры. Если игрок использовал оптимальную стратегию, то его следует поздравить с получением звания "Магистр игры". Вот код данного обработчика события:
/// <summary> /// Ответ компьютера на кнопку /// Задуманное равно X /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonEqual_Click(object sender, EventArgs e) { countQuestion++; question = countQuestion.ToString() + ". "; question += "Число равно "; int n = int.Parse(textBoxE.Text); question += n + "?"; if (number == n) { question += " - Да!"; if (countQuestion <= N) textBoxResult.Text = ANSW4 + ANSW44 + level_game + "!\r\n" + ANSW5 + number; else textBoxResult.Text = ANSW5 + number; } else question += " - Нет!"; listBoxQA.Items.Add(question); }
Домашняя работа
Дома следует разобрать код проекта, посмотреть, как он работает в отладочном режиме.
В интерфейс проекта следует добавить одну – две командные кнопки и написать для них обработчики событий.