Игра "Угадай число"
Игра "Угадай число" — классический пример, позволяющий изучить не только основы консольного ввода-вывода в Dart, но и продвинутые алгоритмические концепции, такие как бинарный поиск. В этой статье мы поэтапно создадим игру и модифицируем её, показывая различные подходы к решению задачи.
Концепция игры
В классической версии игры "Угадай число":
- Компьютер загадывает случайное число в определённом диапазоне (например, от 1 до 100)
- Игрок пытается угадать это число, вводя свои предположения
- После каждой попытки компьютер даёт подсказку: число больше или меньше загаданного
- Игра продолжается до тех пор, пока игрок не угадает число
Базовая реализация
Начнём с простой реализации игры, используя консольный ввод в Dart:
import 'dart:io'; // Для работы с консольным вводом-выводом
import 'dart:math'; // Для генерации случайных чисел
void main() {
// Инициализация генератора случайных чисел
final random = Random();
// Задаём диапазон для игры
final minNumber = 1;
final maxNumber = 100;
// Загадываем случайное число
final targetNumber = minNumber + random.nextInt(maxNumber - minNumber + 1);
print('Я загадал число от $minNumber до $maxNumber. Попробуйте угадать!');
int attempts = 0;
bool guessedCorrectly = false;
// Игровой цикл
while (!guessedCorrectly) {
stdout.write('Введите ваше предположение: ');
// Считываем ввод пользователя
String? input = stdin.readLineSync();
// Проверяем корректность ввода
if (input == null || input.isEmpty) {
print('Пожалуйста, введите число.');
continue;
}
int? guess;
try {
guess = int.parse(input);
} catch (e) {
print('Пожалуйста, введите корректное число.');
continue;
}
attempts++;
// Проверяем предположение
if (guess < targetNumber) {
print('Загаданное число больше.');
} else if (guess > targetNumber) {
print('Загаданное число меньше.');
} else {
guessedCorrectly = true;
print('Поздравляю! Вы угадали число $targetNumber за $attempts попыток.');
}
}
}
Улучшение пользовательского опыта
Давайте улучшим интерфейс игры, добавив возможность начать новую игру и вывод дополнительной информации:
import 'dart:io';
import 'dart:math';
void main() {
bool playAgain = true;
print('=== ИГРА "УГАДАЙ ЧИСЛО" ===');
while (playAgain) {
playGame();
stdout.write('Хотите сыграть ещё раз? (д/н): ');
String? response = stdin.readLineSync()?.toLowerCase();
playAgain = response == 'д' || response == 'да' || response == 'y' || response == 'yes';
}
print('Спасибо за игру! До встречи!');
}
void playGame() {
final random = Random();
final minNumber = 1;
final maxNumber = 100;
final targetNumber = minNumber + random.nextInt(maxNumber - minNumber + 1);
print('\nЯ загадал число от $minNumber до $maxNumber. Попробуйте угадать!');
print('(Для выхода введите "выход" или "exit")\n');
int attempts = 0;
bool guessedCorrectly = false;
while (!guessedCorrectly) {
stdout.write('Попытка ${attempts + 1}. Ваше предположение: ');
String? input = stdin.readLineSync()?.trim().toLowerCase();
if (input == null || input.isEmpty) {
print('Пожалуйста, введите число.');
continue;
}
if (input == 'выход' || input == 'exit') {
print('Загаданное число было: $targetNumber');
print('Игра завершена.');
return;
}
int? guess;
try {
guess = int.parse(input);
} catch (e) {
print('Пожалуйста, введите корректное число.');
continue;
}
if (guess < minNumber || guess > maxNumber) {
print('Пожалуйста, введите число в диапазоне от $minNumber до $maxNumber.');
continue;
}
attempts++;
if (guess < targetNumber) {
print('Загаданное число БОЛЬШЕ.');
} else if (guess > targetNumber) {
print('Загаданное число МЕНЬШЕ.');
} else {
guessedCorrectly = true;
print('\n🎉 Поздравляю! Вы угадали число $targetNumber за $attempts попыток!');
// Оценка эффективности
int maxAttempts = (log(maxNumber - minNumber + 1) / log(2)).ceil();
print('Минимально возможное количество попыток при идеальной стратегии: $maxAttempts');
if (attempts <= maxAttempts) {
print('Отличный результат! Вы использовали оптимальную стратегию!');
} else if (attempts <= maxAttempts * 1.5) {
print('Хороший результат! Можно немного улучшить стратегию.');
} else {
print('Попробуйте использовать бинарный поиск для более эффективного угадывания!');
}
}
}
}