{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "964da491",
   "metadata": {},
   "source": [
    "# 06-02 · Poruszanie się do przodu i do tyłu\n",
    "\n",
    "Praktyka do sekcji [„Moving forward and backward”\n",
    "(Rozdział 6 · Turtle książka „Python od zera”"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "40c17d13",
   "metadata": {},
   "source": [
    "## Cel\n",
    "\n",
    "Nauczyć się sterować żółwiem Turtle: `forward`, `backward`, `right`, `left` —\n",
    "i w praktyce odczuwać różnicę między **ruchem** a **obrotem**."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c6d22cb9",
   "metadata": {},
   "source": [
    "## Co trzeba wiedzieć\n",
    "\n",
    "Ten laptop to laboratorium do części teorii, którą już czytałem. Jeśli tu przyszedłeś\n",
    "po raz pierwszy, krótko: żółw ma pozycję i kurs (kierunek). `forward`/`backward`\n",
    "przesuwać go w linii prostej, `left`/`right` tylko skręcać trasę."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "693d95ec",
   "metadata": {},
   "source": [
    "## Krótkie przypomnienie\n",
    "\n",
    "- `artist.forward(n)` / `artist.fd(n)` — naprzód `n` pikseli\n",
    "- `artist.backward(n)` / `artist.bk(n)` / `artist.back(n)` — powrót do `n` pikseli\n",
    "- `artist.left(угол)` / `artist.lt(угол)` – obróć się przeciwnie do ruchu wskazówek zegara\n",
    "- `artist.right(угол)` / `artist.rt(угол)` – obróć zgodnie z ruchem wskazówek zegara\n",
    "\n",
    "**Cechy pracy w Jupyter:** okno Turtle otwiera się raz na cały notebook —\n",
    "tworzymy `screen` oraz `artist` w następnej celi. Przed każdym nowym rysunkiem\n",
    "wywołujemy `artist.reset()`oczyścić płótno i przywrócić żółwia na początek\n",
    "współrzędne; zamknąć okno za pomocą komendy `screen.bye()` tylko w ostatniej celi.\n",
    "(Technicznie rzecz biorąc, nie jest możliwe utworzenie i zamknięcie osobnego okna Turtle w każdej komórce —\n",
    "moduł `turtle` nie jest zaprojektowany do tego w ramach jednego procesu.)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "189328bf",
   "metadata": {},
   "source": [
    "## Ustawienie (wykonać raz)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "643261e0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:52:20.932841Z",
     "iopub.status.busy": "2026-08-14T20:52:20.932720Z",
     "iopub.status.idle": "2026-08-14T20:52:21.093681Z",
     "shell.execute_reply": "2026-08-14T20:52:21.093218Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Окно Turtle готово. Позиция: (0.00,0.00) | курс: 0.0\n"
     ]
    }
   ],
   "source": [
    "import turtle\n",
    "\n",
    "screen = turtle.Screen()\n",
    "artist = turtle.Turtle()\n",
    "print(\"Окно Turtle готово. Позиция:\", artist.position(), \"| курс:\", artist.heading())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8bd957fa",
   "metadata": {},
   "source": [
    "## Sprawa robocza"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "559236fc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:52:21.094693Z",
     "iopub.status.busy": "2026-08-14T20:52:21.094577Z",
     "iopub.status.idle": "2026-08-14T20:52:21.428378Z",
     "shell.execute_reply": "2026-08-14T20:52:21.427931Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Позиция: (120.00,80.00)\n",
      "Курс: 90.0\n"
     ]
    }
   ],
   "source": [
    "artist.reset()\n",
    "\n",
    "# przesunąć do przodu o 120 pikseli\n",
    "artist.forward(120)\n",
    "\n",
    "# obracamy o 90 stopni przeciwnie do ruchu wskazówek zegara\n",
    "artist.left(90)\n",
    "\n",
    "# znowu jedziesz do przodu – dostajesz literę „G”\n",
    "artist.forward(80)\n",
    "\n",
    "print(\"Позиция:\", artist.position())\n",
    "print(\"Курс:\", artist.heading())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "021e1f96",
   "metadata": {},
   "source": [
    "## Eksperyment 1\n",
    "\n",
    "Zmień odległość `120` dalej `250` i kąt `90` dalej `45`. Zanim zaczniesz, spróbuj\n",
    "przewidzieć: w którą stronę żółw „patrzy”"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "7f7085bb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:52:21.429406Z",
     "iopub.status.busy": "2026-08-14T20:52:21.429289Z",
     "iopub.status.idle": "2026-08-14T20:52:21.815854Z",
     "shell.execute_reply": "2026-08-14T20:52:21.815382Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Курс после поворота: 45.0 градусов\n"
     ]
    }
   ],
   "source": [
    "artist.reset()\n",
    "\n",
    "artist.forward(250)   # было 120\n",
    "artist.left(45)       # было 90\n",
    "artist.forward(80)\n",
    "\n",
    "print(\"Курс после поворота:\", artist.heading(), \"градусов\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f39b29a",
   "metadata": {},
   "source": [
    "## Eksperyment 2\n",
    "\n",
    "Dodaj trzecią parę poleceń `left(90)` oraz `forward(120)` na końcu programu. Jakie\n",
    "jaka figura powstanie?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "98ccfe06",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:52:21.816903Z",
     "iopub.status.busy": "2026-08-14T20:52:21.816787Z",
     "iopub.status.idle": "2026-08-14T20:52:22.396102Z",
     "shell.execute_reply": "2026-08-14T20:52:22.395696Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Позиция: (0.00,80.00)\n",
      "Курс: 180.0\n"
     ]
    }
   ],
   "source": [
    "artist.reset()\n",
    "\n",
    "artist.forward(120)\n",
    "artist.left(90)\n",
    "artist.forward(80)\n",
    "artist.left(90)        # новый поворот\n",
    "artist.forward(120)    # новая сторона\n",
    "\n",
    "print(\"Позиция:\", artist.position())\n",
    "print(\"Курс:\", artist.heading())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8195e683",
   "metadata": {},
   "source": [
    "## Podstawowa praktyka zadań ★\n",
    "\n",
    "Używanie tylko `forward`, `backward`, `left` oraz `right`, narysuj literę „T” jednym\n",
    "ciągłą linię pióra: najpierw górny pręt, potem noga w dół od środka.\n",
    "\n",
    "Jedno z rozwiązań znajduje się poniżej. Spróbuj napisać własną wersję tego, jak ****\n",
    "uruchomić tę komórkę."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "00d417c2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:52:22.398477Z",
     "iopub.status.busy": "2026-08-14T20:52:22.398292Z",
     "iopub.status.idle": "2026-08-14T20:52:22.798653Z",
     "shell.execute_reply": "2026-08-14T20:52:22.798173Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Позиция: (0.00,-100.00)\n",
      "Курс: 270.0\n"
     ]
    }
   ],
   "source": [
    "artist.reset()\n",
    "\n",
    "# górna poprzeczka: najpierw prawa połowa, potem przez środek – lewa\n",
    "artist.forward(40)\n",
    "artist.backward(80)\n",
    "artist.forward(40)  # возвращаемся точно в центр перекладины\n",
    "\n",
    "# trzonka litery „T”\n",
    "artist.right(90)\n",
    "artist.forward(100)\n",
    "\n",
    "print(\"Позиция:\", artist.position())\n",
    "print(\"Курс:\", artist.heading())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2c77357e",
   "metadata": {},
   "source": [
    "## Sprawdzenie wyniku\n",
    "\n",
    "Po wykonaniu celu zadania żółw musi zakończyć ruch w tym punkcie\n",
    "`(0.0, -100.0)` z kursem `270°` (patrzy w dół) to dolna część łodygi litery „T”\n",
    "\n",
    "Następna komórka powtarza rozwiązanie i automatycznie sprawdza ostateczny stan."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e523f39a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:52:22.799716Z",
     "iopub.status.busy": "2026-08-14T20:52:22.799605Z",
     "iopub.status.idle": "2026-08-14T20:52:23.198230Z",
     "shell.execute_reply": "2026-08-14T20:52:23.197711Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Проверка пройдена: буква «Т» нарисована корректно.\n"
     ]
    }
   ],
   "source": [
    "artist.reset()\n",
    "\n",
    "artist.forward(40)\n",
    "artist.backward(80)\n",
    "artist.forward(40)\n",
    "artist.right(90)\n",
    "artist.forward(100)\n",
    "\n",
    "x, y = artist.position()\n",
    "assert round(x, 1) == 0.0, f\"Неожиданная координата x: {x}\"\n",
    "assert round(y, 1) == -100.0, f\"Неожиданная координата y: {y}\"\n",
    "assert artist.heading() == 270.0, f\"Неожиданный курс: {artist.heading()}\"\n",
    "\n",
    "print(\"Проверка пройдена: буква «Т» нарисована корректно.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9671d153",
   "metadata": {},
   "source": [
    "## Typowy błąd\n",
    "\n",
    "Początkujący często się mylą `right()`/`left()` z ruchem – wydaje się, że żółw\n",
    "powinien przesunąć się w bok. W rzeczywistości te polecenia **tylko obracają** kurs\n",
    "i nie poruszają żółwia ani o piksel. Poniżej — program z tym błędem: zamiast litery\n",
    "„G” powstaje po prostu jako prosta linia o długości 200, ponieważ obrót „zginął” pomiędzy\n",
    "dwa identyczne ruchy do przodu."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "6574b240",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:52:23.199134Z",
     "iopub.status.busy": "2026-08-14T20:52:23.199030Z",
     "iopub.status.idle": "2026-08-14T20:52:23.409252Z",
     "shell.execute_reply": "2026-08-14T20:52:23.408797Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Курс (не изменился!): 0.0\n",
      "Черепашка проехала прямо, а не буквой «Г»: (200.00,0.00)\n"
     ]
    }
   ],
   "source": [
    "artist.reset()\n",
    "\n",
    "artist.forward(120)\n",
    "# błąd: zapomniano obrócić tutaj\n",
    "artist.forward(80)\n",
    "\n",
    "print(\"Курс (не изменился!):\", artist.heading())\n",
    "print(\"Черепашка проехала прямо, а не буквой «Г»:\", artist.position())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "81709aae",
   "metadata": {},
   "source": [
    "## Poprawka\n",
    "\n",
    "Dodaj nieudane zwroty między dwoma częściami:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "5cec8f52",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:52:23.410413Z",
     "iopub.status.busy": "2026-08-14T20:52:23.410295Z",
     "iopub.status.idle": "2026-08-14T20:52:23.744348Z",
     "shell.execute_reply": "2026-08-14T20:52:23.743809Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Курс после исправления: 90.0\n",
      "Позиция: (120.00,80.00)\n"
     ]
    }
   ],
   "source": [
    "artist.reset()\n",
    "\n",
    "artist.forward(120)\n",
    "artist.left(90)   # добавили поворот\n",
    "artist.forward(80)\n",
    "\n",
    "print(\"Курс после исправления:\", artist.heading())\n",
    "print(\"Позиция:\", artist.position())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15440492",
   "metadata": {},
   "source": [
    "## Praktyka samodzielne\n",
    "\n",
    "Narysuj schody z trzech identycznych „stopni”\n",
    "powtórzyć trzykrotnie). Dopóki nie poznano pętli (rozdział 10), po prostu powtórz potrzebny blok\n",
    "trzy polecenia z rzędu wykonuje ręcznie."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "16bbaf7f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:52:23.745342Z",
     "iopub.status.busy": "2026-08-14T20:52:23.745226Z",
     "iopub.status.idle": "2026-08-14T20:52:24.101664Z",
     "shell.execute_reply": "2026-08-14T20:52:24.101159Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Позиция после одной ступеньки: (40.00,40.00)\n"
     ]
    }
   ],
   "source": [
    "artist.reset()\n",
    "\n",
    "# jeden krok – dodaj jeszcze dwa według tego samego przykładu\n",
    "artist.forward(40)\n",
    "artist.left(90)\n",
    "artist.forward(40)\n",
    "artist.right(90)\n",
    "\n",
    "print(\"Позиция после одной ступеньки:\", artist.position())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "22fbc318",
   "metadata": {},
   "source": [
    "## Zadanie dodatkowe ★★★\n",
    "\n",
    "Narysuj pięcioramienną gwiazdę jedną linią, używając tylko `forward` i jeden i drugi\n",
    "ten sam kąt obrotu między wszystkimi pięcioma ruchami. Podpowiedź: Suma zewnętrznych narożników\n",
    "suma kątów wielokąta zawsze wynosi 360° — dla pięcioramiennej gwiazdy ten kąt wynosi 144°."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "dba437f9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:52:24.102596Z",
     "iopub.status.busy": "2026-08-14T20:52:24.102486Z",
     "iopub.status.idle": "2026-08-14T20:52:25.738185Z",
     "shell.execute_reply": "2026-08-14T20:52:25.737784Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Звезда нарисована. Финальная позиция: (-0.00,-0.00)\n"
     ]
    }
   ],
   "source": [
    "artist.reset()\n",
    "\n",
    "for _ in range(5):\n",
    "    artist.forward(150)\n",
    "    artist.right(144)\n",
    "\n",
    "print(\"Звезда нарисована. Финальная позиция:\", artist.position())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fd90d269",
   "metadata": {},
   "source": [
    "## Ukończenie (wykonaj raz, na samym końcu)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "de57dcdb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:52:25.739454Z",
     "iopub.status.busy": "2026-08-14T20:52:25.739287Z",
     "iopub.status.idle": "2026-08-14T20:52:25.743120Z",
     "shell.execute_reply": "2026-08-14T20:52:25.742430Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Окно Turtle закрыто.\n"
     ]
    }
   ],
   "source": [
    "screen.bye()\n",
    "print(\"Окно Turtle закрыто.\")"
   ]
  }
 ],
 "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
}
