{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "19383208",
   "metadata": {},
   "source": [
    "# 17-29 · Debug Labs\n",
    "\n",
    "Praktyka do rozdziału [„Debug Labs”](/pl/chapters/rozdzial-17/17-29-debug-labs.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5eceff9d",
   "metadata": {},
   "source": [
    "## Cel\n",
    "\n",
    "Znajdź błąd przez objaw: nieprawidłowa kolejność sprawdzania wygranej/remisu."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a8662e1f",
   "metadata": {},
   "source": [
    "## Złamany kod – Losowanie jest sprawdzane przed wygraną"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "7d64bc02",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-03T10:13:27.557326Z",
     "iopub.status.busy": "2026-09-03T10:13:27.557110Z",
     "iopub.status.idle": "2026-09-03T10:13:27.590747Z",
     "shell.execute_reply": "2026-09-03T10:13:27.590163Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Сломанный результат: Ничья!\n"
     ]
    }
   ],
   "source": [
    "def find_winner_ok(board):\n",
    "    lines = ((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6))\n",
    "    for a, b, c in lines:\n",
    "        if board[a] and board[a] == board[b] == board[c]:\n",
    "            return board[a]\n",
    "    return None\n",
    "\n",
    "def status_broken(board):\n",
    "    if all(board):\n",
    "        return \"Ничья!\"\n",
    "    winner = find_winner_ok(board)\n",
    "    if winner:\n",
    "        return f\"Победил игрок {winner}!\"\n",
    "    return \"Игра продолжается\"\n",
    "\n",
    "# 9. ruch wypełnia pole I wygrywa przekątną — ale zepsuty kod najpierw sprawdza remis\n",
    "poslednij_hod = [\"X\", \"O\", \"O\", \"O\", \"X\", \"X\", \"O\", \"X\", \"X\"]\n",
    "print(\"Сломанный результат:\", status_broken(poslednij_hod))  # неверно покажет \"Ничья!\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b83ca3bc",
   "metadata": {},
   "source": [
    "## Zadanie ★★ zadania samozadaniowe - Poprawka"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "6f9c20c8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-03T10:13:27.592131Z",
     "iopub.status.busy": "2026-09-03T10:13:27.591911Z",
     "iopub.status.idle": "2026-09-03T10:13:27.595135Z",
     "shell.execute_reply": "2026-09-03T10:13:27.594579Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "status_fixed() находит победителя там, где status_broken() ошибочно объявляет ничью.\n"
     ]
    }
   ],
   "source": [
    "def status_fixed(board):\n",
    "    winner = find_winner_ok(board)\n",
    "    if winner:\n",
    "        return f\"Победил игрок {winner}!\"\n",
    "    if all(board):\n",
    "        return \"Ничья!\"\n",
    "    return \"Игра продолжается\"\n",
    "\n",
    "assert status_broken(poslednij_hod) == \"Ничья!\", \"так ведёт себя СЛОМАННАЯ версия\"\n",
    "assert status_fixed(poslednij_hod) != \"Ничья!\", \"исправленная версия обязана найти победителя\"\n",
    "assert \"Победил\" in status_fixed(poslednij_hod)\n",
    "print(\"status_fixed() находит победителя там, где status_broken() ошибочно объявляет ничью.\")"
   ]
  }
 ],
 "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
}
