{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "396127b2",
   "metadata": {},
   "source": [
    "# 20-33 · Projekt końcowy: Ball Pro\n",
    "\n",
    "Praktyka do sekcji [„Projekt końcowy - Ball Pro” `projects/pygame/bouncing-ball/bouncing_ball.py`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9e95aef4",
   "metadata": {},
   "source": [
    "## Cel\n",
    "\n",
    "Uruchom finalną wersję BouncingBallGame i sprawdź jej kluczowe gwarancje: ruch przez delta time, pauzę i wynik."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "575f9aa1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-03T10:12:26.712159Z",
     "iopub.status.busy": "2026-09-03T10:12:26.712004Z",
     "iopub.status.idle": "2026-09-03T10:12:27.282284Z",
     "shell.execute_reply": "2026-09-03T10:12:27.280437Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pygame-ce 2.5.8 (SDL 2.32.10, Python 3.14.6)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Отскоков: 2\n",
      "Счёт: 20\n",
      "Состояние: SostoyanieIgry.IGRA\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "import sys\n",
    "\n",
    "sys.path.insert(0, \"../../projects/pygame/bouncing-ball\")\n",
    "import bouncing_ball as bb\n",
    "\n",
    "# Początkowy kierunek piłki wybierany jest losowym kątem, dlatego ustalamy seed\n",
    "# (Rozdział 5): w przeciwnym razie poniższe liczby zmieniałyby się za każdym razem, gdy uruchamiasz laptopa.\n",
    "random.seed(20)\n",
    "\n",
    "game = bb.BouncingBallGame()\n",
    "for _ in range(180):\n",
    "    game.update(1 / 60)\n",
    "    game.render()\n",
    "\n",
    "print(\"Отскоков:\", game.otskokov)\n",
    "print(\"Счёт:\", game.schet)\n",
    "print(\"Состояние:\", game.state)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "39614cf7",
   "metadata": {},
   "source": [
    "## Sprawdzenie wyniku"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "8d9ef20f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-03T10:12:27.283754Z",
     "iopub.status.busy": "2026-09-03T10:12:27.283577Z",
     "iopub.status.idle": "2026-09-03T10:12:27.287170Z",
     "shell.execute_reply": "2026-09-03T10:12:27.286697Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Верно: счёт растёт строго вместе с числом отскоков, мяч не покидает поле.\n"
     ]
    }
   ],
   "source": [
    "assert game.otskokov > 0\n",
    "assert game.schet == game.otskokov * bb.OCHKOV_ZA_OTSKOK\n",
    "assert bb.RADIUS <= game.x <= bb.SHIRINA - bb.RADIUS\n",
    "assert bb.RADIUS <= game.y <= bb.VYSOTA - bb.RADIUS\n",
    "print(\"Верно: счёт растёт строго вместе с числом отскоков, мяч не покидает поле.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d4caab9",
   "metadata": {},
   "source": [
    "## Zadanie niezależne od zadania ★★\n",
    "\n",
    "Zatrzymaj grę, ubiegnij kolejne 60 klatek i upewnij się, że ani wynik, ani pozycja piłki nie zmieniły się ani o piksel."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "8503012a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-03T10:12:27.288517Z",
     "iopub.status.busy": "2026-09-03T10:12:27.288320Z",
     "iopub.status.idle": "2026-09-03T10:12:27.291761Z",
     "shell.execute_reply": "2026-09-03T10:12:27.290767Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Верно: пауза останавливает игру полностью, а не только отрисовку.\n"
     ]
    }
   ],
   "source": [
    "game.toggle_pause()\n",
    "do = (game.x, game.y, game.schet, game.otskokov)\n",
    "for _ in range(60):\n",
    "    game.update(1 / 60)\n",
    "posle = (game.x, game.y, game.schet, game.otskokov)\n",
    "\n",
    "assert do == posle\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
}
