Skip to content

Игра "Угадай число"

Игра "Угадай число" — классический пример, позволяющий изучить не только основы консольного ввода-вывода в Dart, но и продвинутые алгоритмические концепции, такие как бинарный поиск. В этой статье мы поэтапно создадим игру и модифицируем её, показывая различные подходы к решению задачи.

Концепция игры

В классической версии игры "Угадай число":

  1. Компьютер загадывает случайное число в определённом диапазоне (например, от 1 до 100)
  2. Игрок пытается угадать это число, вводя свои предположения
  3. После каждой попытки компьютер даёт подсказку: число больше или меньше загаданного
  4. Игра продолжается до тех пор, пока игрок не угадает число

Базовая реализация

Начнём с простой реализации игры, используя консольный ввод в 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('Попробуйте использовать бинарный поиск для более эффективного угадывания!');
      }
    }
  }
}
24 мар. 2025 г.
andron13