{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e0be75dc",
   "metadata": {},
   "source": [
    "# 20-19 · Sprite'y i zasoby\n",
    "\n",
    "Praktyka do sekcji [„Sprite'y i zasoby”"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f6e90307",
   "metadata": {},
   "source": [
    "## Cel\n",
    "\n",
    "Zbudować niezawodną ścieżkę do zasobu przez pathlib, niezależną od bieżącego katalogu roboczego uruchomienia."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bed68dc2",
   "metadata": {},
   "source": [
    "## Sprawa robocza"
   ]
  },
  {
   "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",
    "# W laptopie nie ma zmiennej __file__, więc nie ma gdzie pobrać „katalogu samego pliku”\n",
    "# Jupyter ustawia katalog notebooka jako bieżący katalog, a Path.cwd() wskazuje tam samo.\n",
    "# Ale to przypadek, a nie wiarygodna technika – teraz zobaczymy dlaczego.\n",
    "# W zwykłym pliku .py- pisze się tak (sekcja 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": [
    "## Sprawdzenie wyniku"
   ]
  },
  {
   "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",
    "# Główna cecha wiarygodnej ścieżki: nie zmienia się wraz ze zmianą katalogu roboczego.\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",
    "# Ścieżka z zadeklarowanego BASE_DIR przetrwała, ale ścieżka z aktualnego katalogu nie:\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": [
    "## Podstawowa praktyka zadań ★\n",
    "\n",
    "Buduj na tym samym podstawie `BASE_DIR` ścieżka do pliku dźwiękowego `assets/sounds/prygok.wav` i sprawdź oba katalogi nadrzędne (`.parent.name` oraz `.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
}
