{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "58d1a028",
   "metadata": {},
   "source": [
    "# 21-14 · Появление врагов\n",
    "\n",
    "Практика к разделу [«Как появляются враги»](../../site/chapters/glava-21/21-14-poyavlenie-vragov.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "deef7aab",
   "metadata": {},
   "source": [
    "## Цель\n",
    "\n",
    "Проверить, что таймер появления врагов через while сохраняет остаток времени сверх интервала, а не теряет его."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "05f5d62b",
   "metadata": {},
   "source": [
    "## Рабочий пример"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6268e0d2",
   "metadata": {},
   "outputs": [],
   "source": [
    "INTERVAL = 0.5\n",
    "\n",
    "\n",
    "def poyavivshiesya_vragi(spawn_timer, dt):\n",
    "    spawn_timer -= dt\n",
    "    poyavilos = 0\n",
    "    while spawn_timer <= 0.0:\n",
    "        poyavilos += 1\n",
    "        spawn_timer += INTERVAL\n",
    "    return poyavilos, spawn_timer\n",
    "\n",
    "\n",
    "poyavilos, ostatok = poyavivshiesya_vragi(INTERVAL, 1.2)\n",
    "print(\"Появилось врагов:\", poyavilos)\n",
    "print(\"Остаток таймера:\", ostatok)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "496ff8ba",
   "metadata": {},
   "source": [
    "## Проверка результата"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "41ee0737",
   "metadata": {},
   "outputs": [],
   "source": [
    "assert poyavilos == 2, \"1.2 секунды при интервале 0.5 должны дать 2 полных интервала\"\n",
    "assert 0.0 < ostatok < INTERVAL\n",
    "print(\"Верно: while не потерял остаток времени между интервалами.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4490a3f1",
   "metadata": {},
   "source": [
    "## Задание ★★ Самостоятельная задача\n",
    "\n",
    "Проверьте координату появления врага: вся его ширина обязана остаться внутри игрового поля."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3aae34f5",
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "\n",
    "\n",
    "def x_poyavleniya_vraga(rng, shirina_vraga, pole_levo, pole_pravo):\n",
    "    levaya, pravaya = pole_levo, pole_pravo - shirina_vraga\n",
    "    if pravaya <= levaya:\n",
    "        return float(levaya)\n",
    "    return rng.uniform(levaya, pravaya)\n",
    "\n",
    "\n",
    "rng = random.Random(7)\n",
    "for _ in range(200):\n",
    "    x = x_poyavleniya_vraga(rng, 32, 0, 480)\n",
    "    assert 0 <= x <= 480 - 32\n",
    "\n",
    "print(\"Верно: враг всегда появляется полностью внутри игрового поля.\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Cartesian Python 3.14",
   "language": "python",
   "name": "cartesian-python314"
  },
  "language_info": {
   "name": "python",
   "version": "3.14.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
