{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e0be75dc",
   "metadata": {},
   "source": [
    "# 20-19 · Спрайты и ассеты\n",
    "\n",
    "Практика к разделу [«Спрайты и ассеты»](../../site/chapters/glava-20/20-19-sprajty-i-assety.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f6e90307",
   "metadata": {},
   "source": [
    "## Цель\n",
    "\n",
    "Построить надёжный путь к ассету через pathlib, не зависящий от текущей рабочей директории запуска."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bed68dc2",
   "metadata": {},
   "source": [
    "## Рабочий пример"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ba07765a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-03T10:12:15.597202Z",
     "iopub.status.busy": "2026-09-03T10:12:15.597075Z",
     "iopub.status.idle": "2026-09-03T10:12:15.784217Z",
     "shell.execute_reply": "2026-09-03T10:12:15.783733Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pygame-ce 2.5.8 (SDL 2.32.10, Python 3.14.6)\n",
      "BASE_DIR зафиксирован один раз: /home/astra/Projects/Python_001/notebooks/chapter-20\n",
      "Путь от Path.cwd(): /assets/igrok.png\n",
      "Путь от BASE_DIR:  /home/astra/Projects/Python_001/notebooks/chapter-20/assets/igrok.png\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "from pathlib import Path\n",
    "\n",
    "import pygame\n",
    "\n",
    "pygame.init()\n",
    "screen = pygame.display.set_mode((600, 400))\n",
    "\n",
    "# В ноутбуке нет переменной __file__, поэтому \"каталог самого файла\" взять неоткуда:\n",
    "# Jupyter делает текущей директорией каталог ноутбука, и Path.cwd() указывает туда же.\n",
    "# Но это совпадение, а не надёжный приём — сейчас увидим, почему.\n",
    "# В обычном .py-файле пишут так (раздел 20.19):\n",
    "#     BASE_DIR = Path(__file__).resolve().parent\n",
    "BASE_DIR = Path.cwd()\n",
    "print(\"BASE_DIR зафиксирован один раз:\", BASE_DIR)\n",
    "\n",
    "try:\n",
    "    os.chdir(\"/\")  # как будто игрок запустил игру не из её папки\n",
    "    print(\"Путь от Path.cwd():\", Path.cwd() / \"assets\" / \"igrok.png\")\n",
    "    print(\"Путь от BASE_DIR: \", BASE_DIR / \"assets\" / \"igrok.png\")\n",
    "finally:\n",
    "    os.chdir(BASE_DIR)  # возвращаемся, чтобы не сломать остальные ячейки\n",
    "\n",
    "pygame.quit()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f8378e00",
   "metadata": {},
   "source": [
    "## Проверка результата"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1d301df7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-03T10:12:15.786886Z",
     "iopub.status.busy": "2026-09-03T10:12:15.786658Z",
     "iopub.status.idle": "2026-09-03T10:12:15.791298Z",
     "shell.execute_reply": "2026-09-03T10:12:15.790668Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Верно: путь от BASE_DIR не изменился, а путь от Path.cwd() — изменился.\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "from pathlib import Path\n",
    "\n",
    "put_ot_base = BASE_DIR / \"assets\" / \"igrok.png\"\n",
    "\n",
    "# Главное свойство надёжного пути: он не меняется от смены рабочей директории.\n",
    "try:\n",
    "    os.chdir(\"/\")\n",
    "    put_ot_cwd_v_drugom_meste = Path.cwd() / \"assets\" / \"igrok.png\"\n",
    "    put_ot_base_v_drugom_meste = BASE_DIR / \"assets\" / \"igrok.png\"\n",
    "finally:\n",
    "    os.chdir(BASE_DIR)\n",
    "\n",
    "assert put_ot_base.is_absolute()\n",
    "assert put_ot_base.name == \"igrok.png\"\n",
    "assert put_ot_base.parent.name == \"assets\"\n",
    "\n",
    "# Путь от зафиксированного BASE_DIR устоял, а путь от текущей директории — нет:\n",
    "assert put_ot_base_v_drugom_meste == put_ot_base\n",
    "assert put_ot_cwd_v_drugom_meste != put_ot_base\n",
    "\n",
    "print(\"Верно: путь от BASE_DIR не изменился, а путь от Path.cwd() — изменился.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "11243269",
   "metadata": {},
   "source": [
    "## Задание ★ Базовая практика\n",
    "\n",
    "Постройте от того же `BASE_DIR` путь к звуковому файлу `assets/sounds/prygok.wav` и проверьте оба его родительских каталога (`.parent.name` и `.parent.parent.name`)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "12e51d0f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-03T10:12:15.792990Z",
     "iopub.status.busy": "2026-09-03T10:12:15.792808Z",
     "iopub.status.idle": "2026-09-03T10:12:15.796232Z",
     "shell.execute_reply": "2026-09-03T10:12:15.795758Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Путь к звуку: /home/astra/Projects/Python_001/notebooks/chapter-20/assets/sounds/prygok.wav\n",
      "Верно: структура папок читается из самого пути.\n"
     ]
    }
   ],
   "source": [
    "put_k_zvuku = BASE_DIR / \"assets\" / \"sounds\" / \"prygok.wav\"\n",
    "\n",
    "assert put_k_zvuku.is_absolute()\n",
    "assert put_k_zvuku.parent.name == \"sounds\"\n",
    "assert put_k_zvuku.parent.parent.name == \"assets\"\n",
    "print(\"Путь к звуку:\", put_k_zvuku)\n",
    "print(\"Верно: структура папок читается из самого пути.\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Cartesian Python 3.14",
   "language": "python",
   "name": "cartesian-python314"
  },
  "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.14.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
