{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Пример на управление потоком #"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "На этой лекции мы напишем небольшую программу как пример на конструкции управления потоком.\n",
    "\n",
    "Программа будет представлять собой простую игру, в которой пользователю нужно угадать загаданное число. Я уже написал такую программу. Давайте посмотрим на неё в действии. Запустим."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "^C\n"
     ]
    }
   ],
   "source": [
    "! python main.py"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Программа предлагает ввести число. Когда мы вводим, на экран выводится подсказка о том, загаданное число больше либо меньше того, что мы ввели. Если мы число угадываем, то на экран печатается \"Совершенно верно\", и программа завершает свою работу. Давайте напишем аналогичную программу."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Писать код мы будем в среде разработки `PyCharm Community Edition`. Давайте запустим `PyCharm`. И пока он запускается, стоит отметить, что подробно процесс установки `PyCharm` системы мы описали в сопроводительных документах. Когда `PyCharm` загрузился, нам нужно нажать кнопочку `New Project (Новый Проект).`. Далее `PyCharm` предлагает заполнить два текстовых поля. В первом нужно указать путь на жёстком диске до проекта, который мы создаём. Давайте назовём папочку `game`. Второе текстовое поле — это путь до интерпретатора Python 3 в системе. В данном случае `PyCharm` автоматически определил правильный путь до интерпретатора, который установлен у меня, поэтому всё, что осталось нажать — кнопочку `Create` которая создаёт новый проект. Как только проект открылся, нам нужно открыть в нём Python'овский файл `main.py`. И откроется окно редактора, в котором мы уже можем писать код, удалив код по умолчанию."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Давайте начнём. Первое, что мы сделаем, это создадим переменную `number`, которой присвоим число 42. И это то число, которое нужно отгадать."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "number = 42"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Далее мы воспользуемся бесконечным циклом `while True`, который будет выполняться до тех пор, пока мы из него явным образом не выйдем. Внутри этого цикла на каждой итерации нам нужно получать ввод пользователя из терминала. Мы можем это сделать с помощью встроенной функции `input`. Внутри функции `input` мы будем просить пользователя ввести число. Если пользователь ввёл пустую строку, то есть просто нажал Enter, либо напечатал слово `exit`, мы должны выйти из программы. То есть если строка пустая, `if not answer`, или строка равна строке `exit`, мы выходим. Чтобы выйти из бесконечного цикла, воспользуемся оператором `break`. При этом программа завершится."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Введите число:  exit\n"
     ]
    }
   ],
   "source": [
    "while True:\n",
    "    answer = input(\"Введите число: \")\n",
    "    \n",
    "    if not answer or answer == \"exit\":\n",
    "        break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Далее, у нас есть строковый ввод пользователя. Давайте проверим на то, что этот ввод преобразовывается к целому числу. Для этого воспользуемся методом строки `isdigit`. Если ввод пользователя не преобразовывается к целому числу, то напечатаем на экран: \"Введите правильное число\". И воспользуемся оператором `continue` для того, чтобы перейти к новой итерации цикла `while`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Введите число:  bla bla bla\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Введите правильное число!\n"
     ]
    },
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Введите число:  exit\n"
     ]
    }
   ],
   "source": [
    "while True:\n",
    "    answer = input(\"Введите число: \")\n",
    "    \n",
    "    if not answer or answer == \"exit\":\n",
    "        break\n",
    "    \n",
    "    if not answer.isdigit():\n",
    "        print(\"Введите правильное число!\")\n",
    "        continue"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Далее, мы знаем теперь, что ввод пользователя преобразовывается к целому числу. Давайте преобразуем."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Введите число:  8\n",
      "Введите число:  exit\n"
     ]
    }
   ],
   "source": [
    "while True:\n",
    "    answer = input(\"Введите число: \")\n",
    "    \n",
    "    if not answer or answer == \"exit\":\n",
    "        break\n",
    "    \n",
    "    if not answer.isdigit():\n",
    "        print(\"Введите правильное число!\")\n",
    "        continue\n",
    "    \n",
    "    user_answer = int(answer)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Теперь, когда переменная `user_answer` содержит целое число, мы можем сравнивать его с загаданным числом. Если `user_answer` больше, чем загаданное число, то печатаем на экран фразу \"Загаданное число меньше\". Если `user_answer` меньше, чем загаданное число, тогда печатаем на экран фразу \"Загаданное число больше\". Иначе, блок `else` будет выполнен тогда, когда пользователь угадал число. Мы можем его поздравить, написав \"Совершенно верно!\", и выйти из программы с помощью оператора `break`. Вот, собственно, и всё. Мы написали программу аналогичную той, что я показывал в начале видео."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Введите число:  10\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Загаданное число больше\n"
     ]
    },
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Введите число:  50\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Загаданное число меньше\n"
     ]
    },
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Введите число:  42\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Совершенно верно!\n"
     ]
    }
   ],
   "source": [
    "while True:\n",
    "    answer = input(\"Введите число: \")\n",
    "    \n",
    "    if not answer or answer == \"exit\":\n",
    "        break\n",
    "    \n",
    "    if not answer.isdigit():\n",
    "        print(\"Введите правильное число!\")\n",
    "        continue\n",
    "    \n",
    "    user_answer = int(answer)\n",
    "    \n",
    "    if user_answer > number:\n",
    "        print(\"Загаданное число меньше\")\n",
    "    elif user_answer < number:\n",
    "        print(\"Загаданное число больше\")\n",
    "    else:\n",
    "        print(\"Совершенно верно!\")\n",
    "        break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Однако вы можете сказать, что это игра неинтересная, потому что ответ заранее известен. Давайте это исправим. Мы воспользуемся модулем стандартной библиотеки `random` для того, чтобы генерировать на старте программы случайное число в промежутке от 0 до 100. Про импорты мы ещё будем говорить в дальнейшем, ну а пока просто воспользуемся для нашего примера. Внутри модуля `random` стандартной библиотеки есть функция `randint`, которая возвращает число в каком-то промежутке, целое. Теперь в нашу программу интересно играть даже нам самим."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from random import randint\n",
    "\n",
    "number = randint(0, 101)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Введите число:  40\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Загаданное число больше\n"
     ]
    },
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Введите число:  60\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Загаданное число меньше\n"
     ]
    },
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Введите число:  59\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Совершенно верно!\n"
     ]
    }
   ],
   "source": [
    "while True:\n",
    "    answer = input(\"Введите число: \")\n",
    "    \n",
    "    if not answer or answer == \"exit\":\n",
    "        break\n",
    "    \n",
    "    if not answer.isdigit():\n",
    "        print(\"Введите правильное число!\")\n",
    "        continue\n",
    "    \n",
    "    user_answer = int(answer)\n",
    "    \n",
    "    if user_answer > number:\n",
    "        print(\"Загаданное число меньше\")\n",
    "    elif user_answer < number:\n",
    "        print(\"Загаданное число больше\")\n",
    "    else:\n",
    "        print(\"Совершенно верно!\")\n",
    "        break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Чтобы запустить код, мы нажимаем правой кнопкой на белой области редактора и выбираем пункт меню `Run`. `PyCharm` запускает встроенный терминал, и, в принципе, мы можем пользоваться нашей программой как раз из этого терминала. Однако здесь написано, как `PyCharm` запускает программу, которую мы только что написали. Давайте запустим её самостоятельно из терминала. Введите число. Давайте попробуем для начала ввести что-то неправильное. Введите правильное число. А теперь попробуем отгадать число.\n",
    "\n",
    "Мы написали программу, игру, как пример на конструкции управления потоком.\n",
    "\n",
    "[Далее...](Тест%20на%20типы%20и%20конструкции.ipynb)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
