{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "cell-23-03-00",
   "metadata": {},
   "source": [
    "# 23-03 · Камень, ножницы, бумага\n",
    "\n",
    "Практика к разделу [«Домашний проект C: игра «Камень, ножницы, бумага»»](../../site/chapters/glava-23/23-hw-03-kamen-nozhnicy-bumaga.html). Полный файл — `projects/console/rock-paper-scissors/rps.py`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-03-01",
   "metadata": {},
   "source": [
    "## Цель\n",
    "\n",
    "Проверить логику победителя для всех девяти комбинаций и симулировать несколько раундов."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-03-02",
   "metadata": {},
   "source": [
    "## Example — все комбинации"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cell-23-03-03",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "import random\n",
    "\n",
    "sys.path.insert(0, \"../../projects/console/rock-paper-scissors\")\n",
    "import rps\n",
    "\n",
    "for a in rps.VARIANTY:\n",
    "    for b in rps.VARIANTY:\n",
    "        print(f\"{a} против {b}: {rps.opredelit_pobeditelya(a, b)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-03-04",
   "metadata": {},
   "source": [
    "## Проверка результата"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cell-23-03-05",
   "metadata": {},
   "outputs": [],
   "source": [
    "assert rps.opredelit_pobeditelya(\"камень\", \"ножницы\") == \"игрок\"\n",
    "assert rps.opredelit_pobeditelya(\"ножницы\", \"камень\") == \"компьютер\"\n",
    "assert rps.opredelit_pobeditelya(\"бумага\", \"бумага\") == \"ничья\"\n",
    "print(\"Верно: словарь POBEZHDAET определяет победителя правильно.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-03-06",
   "metadata": {},
   "source": [
    "## Эксперимент — симулируем 200 раундов и считаем статистику"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cell-23-03-07",
   "metadata": {},
   "outputs": [],
   "source": [
    "random.seed(5)\n",
    "schet = {\"игрок\": 0, \"компьютер\": 0, \"ничья\": 0}\n",
    "\n",
    "for _ in range(200):\n",
    "    _, pobeditel = rps.sygrat_raund(\"камень\")\n",
    "    schet[pobeditel] += 1\n",
    "\n",
    "print(\"Статистика за 200 раундов (всегда «камень»):\", schet)\n",
    "assert sum(schet.values()) == 200\n",
    "assert schet[\"игрок\"] > 0 and schet[\"компьютер\"] > 0\n",
    "print(\"Верно: за 200 случайных раундов встретились все три исхода.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-03-08",
   "metadata": {},
   "source": [
    "## Starter\n",
    "\n",
    "Заполните отмеченное место. Неизменённый starter не проходит tests."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "task-23-03",
   "metadata": {
    "tags": [
     "exercise",
     "starter"
    ]
   },
   "outputs": [],
   "source": [
    "def tablica_ishodov():\n",
    "    \"\"\"Map every (player, computer) pair to its outcome.\"\"\"\n",
    "    # TODO: use two nested loops over rps.VARIANTY.\n",
    "    raise NotImplementedError\n",
    "\n",
    "\n",
    "ishody_vseh_par = tablica_ishodov()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-03-10",
   "metadata": {},
   "source": [
    "## Task\n",
    "\n",
    "Постройте словарь исходов всех девяти пар ходов через `rps.opredelit_pobeditelya()`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-03-11",
   "metadata": {},
   "source": [
    "## Tests\n",
    "\n",
    "Запустите после task cell: есть основной пример и хотя бы один крайний случай."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "tests-23-03",
   "metadata": {
    "tags": [
     "exercise-tests"
    ]
   },
   "outputs": [],
   "source": [
    "assert len(ishody_vseh_par) == 9\n",
    "assert ishody_vseh_par[(\"камень\", \"ножницы\")] == \"игрок\"\n",
    "assert ishody_vseh_par[(\"ножницы\", \"камень\")] == \"компьютер\"\n",
    "assert ishody_vseh_par[(\"бумага\", \"бумага\")] == \"ничья\"\n",
    "print(\"Tests passed\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-03-13",
   "metadata": {},
   "source": [
    "## Hint\n",
    "\n",
    "Dictionary comprehension может содержать два `for`: один для хода игрока, другой для хода компьютера."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-03-14",
   "metadata": {},
   "source": [
    "## Solution\n",
    "\n",
    "<details><summary>Показать решение после собственной попытки</summary>\n",
    "\n",
    "```python\n",
    "def tablica_ishodov():\n",
    "    return {\n",
    "        (player, computer): rps.opredelit_pobeditelya(player, computer)\n",
    "        for player in rps.VARIANTY\n",
    "        for computer in rps.VARIANTY\n",
    "    }\n",
    "\n",
    "\n",
    "ishody_vseh_par = tablica_ishodov()\n",
    "```\n",
    "\n",
    "</details>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Cartesian Python 3.14",
   "language": "python",
   "name": "cartesian-python314"
  },
  "language_info": {
   "name": "python",
   "version": "3.14.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
