# Своя игра - Multiplayer Quiz Game

Многопользовательская игра в стиле "Своя игра" с поддержкой команд и режимом реального времени.

## Возможности

- ✅ Создание игровых комнат с уникальными кодами
- ✅ Поддержка нескольких команд
- ✅ Два раунда с разными стоимостями вопросов (100-500 и 200-1000)
- ✅ **Рандомный выбор 5 категорий на каждый раунд без повторений**
- ✅ **Поддержка трех типов вопросов: текст, изображения, аудио**
- ✅ Таймер на ответ (60 секунд)
- ✅ Система очков (правильный ответ = +баллы, неправильный = -баллы)
- ✅ WebSocket для синхронизации в реальном времени

## Технологии

### Backend
- Node.js + Express
- Socket.io
- JSON-хранилище вопросов

### Frontend
- React + Vite
- TailwindCSS
- Socket.io-client
- React Router

## Установка и запуск

### Вариант 1: Docker (Рекомендуется) 🐳

Самый простой способ - использовать Docker Compose:

```bash
# Запустить всё одной командой
docker-compose up

# Или в фоновом режиме
docker-compose up -d

# Остановить
docker-compose down
```

После запуска:
- Frontend: http://localhost:5173
- Backend: http://localhost:3001
- MongoDB: localhost:27017

**Все зависимости и MongoDB установятся автоматически!**

#### Доступ из локальной сети (с телефона/планшета)

1. **Узнайте IP-адрес вашего компьютера:**

   **Windows:**
   ```bash
   ipconfig
   ```
   Найдите IPv4-адрес (например, `192.168.1.100`)

   **Linux/Mac:**
   ```bash
   ifconfig
   # или
   ip addr show
   ```

2. **Запустите Docker как обычно:**
   ```bash
   docker-compose up -d
   ```

3. **Откройте на любом устройстве в сети:**
   ```
   http://192.168.1.100:5173
   ```
   (замените на ваш IP-адрес)

4. **Если не работает:**
   - Проверьте firewall (разрешите порты 5173 и 3001)
   - Убедитесь, что все устройства в одной Wi-Fi сети
   - Попробуйте перезапустить Docker: `docker-compose down && docker-compose up -d`

### Вариант 2: Ручная установка

```bash
# Установка всех зависимостей
npm run install-all

# Или вручную
npm install
cd server && npm install
cd ../client && npm install
```

#### Настройка MongoDB

Для сохранения игр установите MongoDB:

1. Установите MongoDB: https://www.mongodb.com/try/download/community
2. Запустите MongoDB сервер
3. Создайте файл `server/.env`:

```env
PORT=3001
MONGODB_URI=mongodb://localhost:27017/svoya-igra
NODE_ENV=development
```

**Важно:** Без MongoDB игры будут храниться только в памяти сервера и пропадут при перезагрузке страницы или сервера.

#### Запуск

```bash
# Запустить всё одновременно
npm run dev

# Или по отдельности
npm run server  # Backend на порту 3001
npm run client  # Frontend на порту 5173
```

## Использование

1. Откройте http://localhost:5173
2. Создайте новую игру или присоединитесь к существующей
3. Пригласите другие команды используя код игры
4. Начните игру - игра автоматически выберет 5 случайных категорий
5. Выбирайте вопросы и отвечайте

## Управление вопросами

### Структура JSON файла

Редактируйте `server/src/data/questions.json`:

```json
{
  "categories": [
    {
      "id": "unique-id",
      "name": "Название категории",
      "round": 1,
      "questions": [
        {
          "points": 100,
          "type": "text",
          "question": "Ваш вопрос?",
          "answer": "Правильный ответ"
        },
        {
          "points": 200,
          "type": "image",
          "question": "/images/photo.jpg",
          "questionText": "Что изображено на фото?",
          "answer": "Описание"
        },
        {
          "points": 300,
          "type": "audio",
          "question": "/audio/song.mp3",
          "questionText": "Что это за песня?",
          "answer": "Название песни"
        }
      ]
    }
  ]
}
```

### Типы вопросов

1. **Текстовые (`type: "text"`)**:
   - `question` - текст вопроса
   - `answer` - правильный ответ

2. **Изображения (`type: "image"`)**:
   - `question` - путь к файлу (например `/images/photo.jpg`)
   - `questionText` - дополнительный текст вопроса
   - `answer` - правильный ответ
   - Файлы размещать в: `server/public/images/`

3. **Аудио (`type: "audio"`)**:
   - `question` - путь к файлу (например `/audio/song.mp3`)
   - `questionText` - дополнительный текст вопроса
   - `answer` - правильный ответ
   - Файлы размещать в: `server/public/audio/`

### Добавление медиа файлов

1. Поместите изображения в `server/public/images/`
2. Поместите аудио в `server/public/audio/`
3. В JSON используйте относительные пути: `/images/filename.jpg` или `/audio/filename.mp3`

## Структура проекта

```
my-game/
├── server/
│   ├── public/
│   │   ├── images/           # Изображения для вопросов
│   │   └── audio/            # Аудио файлы для вопросов
│   ├── src/
│   │   ├── data/
│   │   │   └── questions.json      # Вопросы и категории
│   │   ├── models/
│   │   │   ├── Game.js             # Модель игры
│   │   │   └── Question.js         # Модель вопроса
│   │   ├── routes/
│   │   │   ├── games.js            # API игр
│   │   │   └── questions.js        # API вопросов
│   │   ├── socket/
│   │   │   └── handlers.js         # WebSocket + логика выбора категорий
│   │   └── index.js                # Главный файл сервера
│   └── package.json
├── client/
│   ├── src/
│   │   ├── components/
│   │   │   ├── GameBoard.jsx       # Игровое поле
│   │   │   ├── QuestionModal.jsx   # Модальное окно с медиа-поддержкой
│   │   │   └── TeamScores.jsx      # Счет команд
│   │   ├── pages/
│   │   │   ├── Home.jsx            # Главная страница
│   │   │   ├── CreateGame.jsx      # Создание игры
│   │   │   ├── JoinGame.jsx        # Присоединение к игре
│   │   │   └── Game.jsx            # Игровая страница
│   │   ├── App.jsx
│   │   └── main.jsx
│   └── package.json
└── README.md
```

## Игровой процесс

1. **Создание игры**: Первый игрок создает игру и получает уникальный код. Система автоматически выбирает 5 случайных категорий для раунда 1.
2. **Присоединение**: Другие команды присоединяются по коду
3. **Выбор вопроса**: Команды по очереди выбирают категорию и стоимость
4. **Ответ**: Первая нажавшая кнопку "Ответить" команда отвечает
5. **Правильный ответ**: Команда получает баллы, вопрос закрывается
6. **Неправильный ответ**: Команда теряет баллы, другие могут попробовать
7. **Раунд 2**: После первого раунда выбираются новые 5 категорий для раунда 2, стоимость вопросов удваивается

## Особенности

- **Случайный выбор категорий**: В каждой игре будут разные категории
- **Без повторений**: Категории не повторяются между раундами
- **Мультимедиа**: Поддержка изображений и аудио делает игру разнообразнее
- **Простое управление**: Все через JSON файл, не нужна админ-панель
- **Персистентность**: Игры сохраняются в MongoDB и доступны после перезагрузки страницы
- **Роль ведущего**: Ведущий управляет игрой, выбирает вопросы и контролирует процесс

## Лицензия

MIT
