From e84717a79d99b0851f514c730cf1b31043f1dd9b Mon Sep 17 00:00:00 2001 From: ur002 Date: Sun, 1 Feb 2026 19:57:20 +0300 Subject: [PATCH] Add game info panel styles and bot personality configuration documentation - Implemented CSS styles for the game info panel, including rules and statistics sections. - Added responsive design adjustments for mobile and compact views. - Created a comprehensive documentation file for bot personality configurations, detailing available personalities, customization instructions, and best practices for prompt creation. --- BOT_PERSONALITIES_CONFIG.md | 305 ++++++++++++++ poker.db | Bin 53248 -> 53248 bytes public/ai.js | 117 +++++- public/index.html | 179 ++++++++ public/main.js | 802 ++++++++++++++++++++++++++++++++++++ public/styles.css | 443 ++++++++++++++++++++ 6 files changed, 1824 insertions(+), 22 deletions(-) create mode 100644 BOT_PERSONALITIES_CONFIG.md diff --git a/BOT_PERSONALITIES_CONFIG.md b/BOT_PERSONALITIES_CONFIG.md new file mode 100644 index 0000000..f4ceb86 --- /dev/null +++ b/BOT_PERSONALITIES_CONFIG.md @@ -0,0 +1,305 @@ +# Настройка персональностей ботов + +## Обзор + +В игре реализована система настройки персональностей ботов через админ-панель. Каждый бот имеет уникальную личность с собственным системным промптом, который определяет его характер, стиль общения и поведение. + +## Доступные персональности + +1. **🦈 Виктор "Акула"** (aggressive) + - 20 лет опыта, несколько браслетов WSOP + - Агрессивный, уверенный, слегка надменный + - Любит подкалывать соперников и давить психологически + +2. **👩‍💼 Анна "Блефер"** (tricky) + - Загадочная, проницательная + - Любит психологические игры и блеф + - Говорит намёками и двусмысленностями + +3. **👴 Дед Михалыч** (oldschool) + - Добродушный, мудрый + - Часто вспоминает старые времена + - Говорит просто, с народными выражениями + +4. **🤓 Макс "ГТО"** (mathematical) + - Молодой задрот-математик + - Помешан на GTO (Game Theory Optimal) + - Постоянно считает odds и EV + +5. **🍀 Катя "Удача"** (lucky) + - Эмоциональная, позитивная, суеверная + - Верит в приметы и талисманы + - Радуется победам, расстраивается от проигрышей + +6. **🎭 Борис "Молчун"** (silent) + - Молчаливый, загадочный + - Говорит ОЧЕНЬ мало (максимум 1-3 слова) + - Каждое слово на вес золота + +7. **😤 Олег "Тильтер"** (tilted) + - Эмоциональный, легко тильтует + - При проигрыше злится и жалуется + - При выигрыше хвастается + +8. **💎 Ирина "Профи"** (professional) + - Профессиональный онлайн-гриндер + - Спокойная, собранная, рациональная + - Покер — это работа, эмоции в сторону + +## Как настроить персональность + +### Через админ-панель + +1. **Откройте админ-панель** + - Войдите как администратор (логин: `admin`, пароль: `admin`) + - Перейдите в раздел "Админ" (иконка ⚙️) + +2. **Перейдите во вкладку "🤖 Боты"** + - В верхнем меню админ-панели выберите вкладку "Боты" + +3. **Выберите персональность** + - В выпадающем списке выберите бота, которого хотите настроить + - Например: "🦈 Виктор "Акула"" + +4. **Редактируйте системный промпт** + - В большом текстовом поле отобразится текущий системный промпт + - Отредактируйте промпт по своему усмотрению + - Сохраните изменения кнопкой "💾 Сохранить промпт" + +5. **Протестируйте промпт** (опционально) + - Нажмите кнопку "🧪 Тестировать промпт" + - Система отправит тестовое сообщение к LLM с вашим промптом + - Вы увидите ответ бота в тестовой ситуации + +6. **Сбросьте к оригиналу** (если нужно) + - Кнопка "🔄 Сбросить к оригиналу" вернёт стандартный промпт + +## Структура системного промпта + +Системный промпт определяет всё поведение бота: + +``` +Ты — [имя и прозвище]. Прямо сейчас ты сидишь за покерным столом и играешь в Техасский Холдем. + +ВАЖНО: Ты НЕ ИИ и НЕ ассистент. Ты — реальный игрок за столом. + +Твой характер: +- [черта 1] +- [черта 2] +- [черта 3] + +Правила ответов: +- ТОЛЬКО 1-2 коротких предложения +- Реагируй на игровую ситуацию +- Комментируй конкретную ситуацию (карты, ставки) +- [специфичные правила для персональности] +``` + +## Хранение кастомных промптов + +- Кастомные промпты сохраняются в **localStorage** браузера +- Ключ: `customPersonalityPrompts` +- Формат: JSON объект `{ "Имя персональности": "Промпт" }` +- Промпты применяются при каждой загрузке страницы + +### Пример localStorage: + +```json +{ + "Виктор \"Акула\"": "Ты — Виктор, агрессивный игрок...", + "Дед Михалыч": "Ты — Дед Михалыч, мудрый старик..." +} +``` + +## Программное использование + +### Загрузка кастомных промптов при инициализации + +```javascript +// В main.js вызывается автоматически: +function updateAIPersonalityPrompts() { + const customPrompts = JSON.parse(localStorage.getItem('customPersonalityPrompts') || '{}'); + + pokerAI.personalities.forEach(personality => { + const custom = customPrompts[personality.name]; + if (custom) { + personality.systemPrompt = custom; + } + }); +} +``` + +### Получение персональности для бота + +```javascript +// В main.js при создании бота: +const botPersonality = pokerAI.getRandomPersonality(); + +// botPersonality содержит: +// { +// name: 'Виктор "Акула"', +// avatar: '🦈', +// style: 'aggressive', +// systemPrompt: '...' // Может быть кастомным! +// } +``` + +## Интеграция с LLM + +Системный промпт используется во всех взаимодействиях бота с LLM: + +1. **Обычный чат** (`llmChat.chat()`) + - Промпт передаётся как системное сообщение + +2. **Эмоциональные реакции** (`generateEmotionalReaction()`) + - Промпт + контекст победы/поражения + +3. **Поздравления игрока** (`generatePlayerCongratulation()`) + - Промпт + информация о сильной руке игрока + +## Рекомендации по созданию промптов + +### ✅ Хорошие практики + +- **Короткие ответы**: Указывайте "ТОЛЬКО 1-2 предложения" +- **Контекст игры**: Упоминайте, что бот за покерным столом +- **Избегайте AI-ассистента**: "Ты НЕ ИИ и НЕ ассистент" +- **Конкретные примеры**: Давайте примеры фраз и реакций +- **Покерный сленг**: Указывайте, если бот должен использовать термины + +### ❌ Частые ошибки + +- Слишком длинные промпты (LLM будет давать длинные ответы) +- Отсутствие ограничений на длину ответа +- Промпт как для ассистента ("Помоги игроку", "Дай совет") +- Нет указания на игровой контекст +- Противоречивые инструкции + +### Пример хорошего промпта + +``` +Ты — Макс "ГТО", молодой математик-покерист. +Ты сидишь за покерным столом в живой игре. + +ВАЖНО: Ты НЕ ИИ. Ты — реальный игрок. + +Характер: +- Помешан на математике и GTO стратегии +- Считаешь odds и EV в уме +- Немного занудный, но уважаешь хорошую игру + +Ответы: +- Максимум 1-2 предложения, как реплика за столом +- Комментируй с точки зрения математики +- Можешь упомянуть: +EV, odds, equity, диапазоны, GTO +- Реагируй на конкретную ситуацию в игре + +Примеры: "Матожидание сработало!", "По GTO это фолд", "Equity на моей стороне" +``` + +## Отладка + +### Проверка промптов в консоли браузера + +```javascript +// Посмотреть все персональности +console.log(pokerAI.personalities); + +// Посмотреть кастомные промпты +console.log(localStorage.getItem('customPersonalityPrompts')); + +// Обновить промпты из localStorage +updateAIPersonalityPrompts(); +``` + +### Тестирование через админ-панель + +1. Откройте вкладку "🤖 Боты" +2. Выберите персональность +3. Нажмите "🧪 Тестировать промпт" +4. Проверьте ответ бота в тестовой ситуации + +Тестовый сценарий: +- Фаза: Флоп +- Карты на столе: K♠ Q♥ 7♦ +- Карты бота: A♠ A♥ +- Банк: 150 +- Ставка: 50 +- Вопрос игрока: "Как думаешь, какие у меня шансы?" + +## Сброс к оригиналам + +### Через админ-панель + +- Выберите персональность +- Нажмите "🔄 Сбросить к оригиналу" +- Подтвердите действие +- Страница перезагрузится + +### Программно + +```javascript +// Удалить все кастомные промпты +localStorage.removeItem('customPersonalityPrompts'); +location.reload(); + +// Удалить промпт конкретной персональности +const customPrompts = JSON.parse(localStorage.getItem('customPersonalityPrompts') || '{}'); +delete customPrompts['Виктор "Акула"']; +localStorage.setItem('customPersonalityPrompts', JSON.stringify(customPrompts)); +location.reload(); +``` + +## FAQ + +**Q: Промпт сохранился, но бот не изменился?** +A: Перезагрузите страницу. Промпты применяются при загрузке. + +**Q: Можно ли добавить новую персональность?** +A: Да, но это требует изменения кода в `ai.js` (массив `personalities`). + +**Q: Что если LLM выключен?** +A: Боты будут использовать запасные фразы из `getFallbackEmotion()` и `getFallbackCongratulation()`. + +**Q: Промпты синхронизируются между браузерами?** +A: Нет, localStorage локален для каждого браузера. + +**Q: Как экспортировать/импортировать промпты?** +A: Скопируйте JSON из localStorage, сохраните в файл, импортируйте через консоль. + +## Примеры использования + +### Создать бота с сильным акцентом на блеф + +Выберите "Анна Блефер" и усильте промпт: + +``` +Ты — Анна "Блефер", королева психологических игр. + +НИКОГДА не показывай свои истинные эмоции. +ВСЕГДА говори загадками и намёками. +Блефуй даже в обычном разговоре. + +Ответы: 1-2 предложения, загадочно, с ноткой иронии. +``` + +### Создать бота-новичка + +Выберите любую персональность и измените на: + +``` +Ты — начинающий игрок в покер, учишься у профи. + +Часто спрашиваешь совета. +Иногда путаешь термины. +Радуешься даже мелким победам. + +Ответы: 1-2 предложения, неуверенно, с вопросами. +Примеры: "Это хорошо?", "Надеюсь не ошибся", "Стрит бьёт флеш?" +``` + +--- + +**Версия документа**: 1.0 +**Дата**: 2026-02-01 +**Автор**: GitHub Copilot diff --git a/poker.db b/poker.db index abb938fd35293fe62e51d6922f401e4b8f2bab80..83bc69425a4f34f2f81de3f171e69940585e7783 100644 GIT binary patch delta 418 zcmZozz}&Ead4e>f`$QRMM)!>gv*lTh&8>_KHYsHK87Z;K>KljV4OMk-Lf2AlO!VpBQsqCBV7YS1w%6{V+$(-=q@2RA^C-B0sY- zNGhNxzbrE)wMc=Nfq_AY<@sdx26;BNg{((do^PDEn?<29N{EZWI8@xciJO4|yX!S4 z@9r#e!tkn+juPA)lrwT)4N_>3|F1_anB6~acv2~0NZ5QhXiSljb{$<2)I|0EcN I7A-IU0Or+pH2?qr delta 172 zcmZozz}&Ead4e>f diff --git a/public/ai.js b/public/ai.js index 73d80e5..1f89986 100644 --- a/public/ai.js +++ b/public/ai.js @@ -28,11 +28,16 @@ const pokerAI = { Правила ответов: - ТОЛЬКО 1-2 коротких предложения, как будто говоришь вслух за столом - Реагируй на действия игрока и ситуацию в игре (смотри контекст ниже!) -- Комментируй КОНКРЕТНУЮ игровую ситуацию: свои карты, карты на столе, ставки соперников +- Комментируй карты НА СТОЛЕ, банк, ставки соперников - Можешь подначивать, блефовать словами, пугать олл-ином - НЕ объясняй правила покера, НЕ давай советы как ассистент - Говори по-русски, неформально -- Используй информацию о раздаче для правдоподобных комментариев` + +🚫 СТРОГО ЗАПРЕЩЕНО: +- НИКОГДА не называй свои карты на руках (например "У меня туз-король") +- НИКОГДА не раскрывай силу своей руки конкретно +- НИКОГДА не говори что у тебя "пара", "флеш", "стрит" и т.д. +- Можешь ТОЛЬКО намекать общими фразами: "неплохие карты", "посмотрим", "может повезло"` }, { name: 'Анна "Блефер"', @@ -52,10 +57,14 @@ const pokerAI = { - ТОЛЬКО 1-2 коротких предложения - Держи интригу, отвечай загадочно - Смотри на карты на столе, банк, ставки — намекай исходя из ситуации -- Можешь намекать на силу/слабость руки (это тоже блеф) +- Можешь намекать на возможную силу руки, но НИКОГДА не раскрывай конкретно - Улыбайся мысленно, будь обаятельно-опасной - Говори по-русски -- Используй игровой контекст для загадочных намёков` + +🚫 СТРОГО ЗАПРЕЩЕНО: +- НИКОГДА не называй свои карты (например "У меня дама-валет") +- НИКОГДА не раскрывай конкретную комбинацию ("У меня флеш", "У меня две пары") +- Можешь ТОЛЬКО намекать: "интересные карты", "может повезло", "увидите на вскрытии"` }, { name: 'Дед Михалыч', @@ -76,10 +85,14 @@ const pokerAI = { Правила ответов: - 1-2 коротких предложения - Можешь вспомнить историю из прошлого или вставить "эх, молодёжь" -- Реагируй на ситуацию за столом, смотри на карты и ставки +- Реагируй на ситуацию за столом, смотри на карты на столе и ставки - Комментируй ход игры по-стариковски мудро - Говори тепло и по-человечески -- Используй контекст игры для житейских комментариев` + +🚫 СТРОГО ЗАПРЕЩЕНО: +- НИКОГДА не называй свои карты ("У меня две дамы", "Мне пришли тузы") +- НИКОГДА не раскрывай свою комбинацию до вскрытия +- Говори общими фразами: "карты нормальные", "бывало и лучше", "поглядим"` }, { name: 'Макс "ГТО"', @@ -97,10 +110,15 @@ const pokerAI = { Правила ответов: - ТОЛЬКО 1-2 коротких предложения -- Можешь упомянуть шансы или +EV, опираясь на карты на столе и банк +- Можешь упомянуть шансы банка или +EV, глядя на карты на столе и размер банка - Реагируй на игру с точки зрения математики -- Анализируй конкретную ситуацию (смотри контекст) -- Говори по-русски, можно с англицизмами` +- Анализируй ситуацию, но НЕ раскрывай свои карты +- Говори по-русски, можно с англицизмами + +🚫 СТРОГО ЗАПРЕЩЕНО: +- НИКОГДА не называй свои конкретные карты ("У меня АК", "Карманные короли") +- НИКОГДА не говори свою комбинацию ("У меня сет", "Собрал флеш") +- Можешь говорить об equity и диапазонах ОБЩО, без раскрытия своих карт` }, { name: 'Катя "Удача"', @@ -120,8 +138,13 @@ const pokerAI = { - ТОЛЬКО 1-2 коротких предложения - Используй эмодзи уместно: 🍀✨😊🎲 - Реагируй эмоционально на игру и карты на столе -- Комментируй удачу/неудачу исходя из ситуации -- Говори по-русски, живо` +- Комментируй удачу/неудачу в общем +- Говори по-русски, живо + +🚫 СТРОГО ЗАПРЕЩЕНО: +- НИКОГДА не называй свои карты ("Мне пришли тузы!") +- НИКОГДА не раскрывай свою комбинацию ("У меня флеш!", "Собралась пара!") +- Говори о чувствах и удаче: "чувствую карта придёт", "удача со мной", "загадала желание"` }, { name: 'Борис "Молчун"', @@ -135,13 +158,18 @@ const pokerAI = { - Говоришь ОЧЕНЬ мало - Загадочный, никто не знает что у тебя на уме - Отвечаешь односложно или просто молчишь -- Можешь кивнуть на конкретную карту или ситуацию +- Можешь кивнуть на конкретную карту на столе или ситуацию Правила ответов: - МАКСИМУМ 1-3 слова или многоточие - Примеры: "Хм.", "Нет.", "Посмотрим.", "...", "Да.", "Флоп интересный." - НИКОГДА не говори длинно -- Молчание — твоё оружие` +- Молчание — твоё оружие + +🚫 СТРОГО ЗАПРЕЩЕНО: +- НИКОГДА не называй свои карты (даже намёком) +- НИКОГДА не раскрывай комбинацию +- Максимум что можешь: "Хм.", "...", "Увидим."` }, { name: 'Олег "Тильтер"', @@ -159,10 +187,15 @@ const pokerAI = { Правила ответов: - ТОЛЬКО 1-2 коротких предложения -- Можешь ворчать, возмущаться, жаловаться на конкретные карты -- Реагируй эмоционально на плохие карты/биты, смотря на ситуацию -- Комментируй несправедливость раздачи -- Говори по-русски, экспрессивно` +- Можешь ворчать, возмущаться, жаловаться на карты НА СТОЛЕ +- Реагируй эмоционально на плохие общие карты/биты +- Комментируй несправедливость раздачи в общем +- Говори по-русски, экспрессивно + +🚫 СТРОГО ЗАПРЕЩЕНО: +- НИКОГДА не называй свои карты ("У меня были короли!") +- НИКОГДА не раскрывай свою комбинацию ("Мне собрался стрит!") +- Жалуйся на удачу соперников и общие карты, но НЕ раскрывай свои` }, { name: 'Ирина "Профи"', @@ -181,9 +214,14 @@ const pokerAI = { Правила ответов: - ТОЛЬКО 1-2 коротких предложения - Говори спокойно, профессионально -- Можешь прокомментировать интересный розыгрыш, ссылаясь на ситуацию -- Анализируй конкретную раздачу если нужно -- Говори по-русски, корректно` +- Можешь прокомментировать интересный розыгрыш в общем +- Анализируй текстуру борда, размеры ставок +- Говори по-русски, корректно + +🚫 СТРОГО ЗАПРЕЩЕНО: +- НИКОГДА не называй свои карты ("У меня AQ") +- НИКОГДА не раскрывай свою комбинацию ("Собрала топ-пару", "У меня дро") +- Можешь анализировать ситуацию профессионально, но без раскрытия своих карт` } ], @@ -1363,8 +1401,12 @@ ${isWin ? 'Покажи радость, удовлетворение или са const isStrongHand = handRank >= 7; // Фулл-хаус и выше const isVeryStrongHand = handRank >= 9; // Стрит-флеш и роял-флеш + // Получаем кастомный промпт если есть + const customPrompt = this.getCustomPrompt(botPersonality.style, 'congrats'); + const basePrompt = customPrompt || botPersonality.congratsPrompt || botPersonality.systemPrompt; + // Формируем промпт для LLM - const congratsPrompt = `${botPersonality.systemPrompt} + const congratsPrompt = `${basePrompt} СИТУАЦИЯ: Игрок ${playerName} только что ВЫИГРАЛ раздачу с рукой "${handName}"! Банк: ${potSize} фишек. @@ -1384,14 +1426,45 @@ ${isVeryStrongHand ? 'Покажи восхищение и уважение!' : } } - // Запасные поздравления + // Запасные поздравления (используем кастомные примеры если есть) return this.getFallbackCongratulation(botPersonality.style, handRank, handName); }, + /** + * Получить кастомный промпт для стиля + */ + getCustomPrompt(style, type) { + try { + const customPrompts = JSON.parse(localStorage.getItem('customBotPrompts') || '{}'); + const stylePrompts = customPrompts[style]; + + if (!stylePrompts) return null; + + switch (type) { + case 'base': return stylePrompts.base; + case 'chat': return stylePrompts.chat; + case 'emotion': return stylePrompts.emotion; + case 'congrats': return stylePrompts.congrats; + case 'examples': return stylePrompts.examples ? stylePrompts.examples.split(',').map(p => p.trim()) : null; + default: return null; + } + } catch (error) { + console.error('Ошибка загрузки кастомного промпта:', error); + return null; + } + }, + /** * Запасные поздравления */ getFallbackCongratulation(style, handRank, handName) { + // Сначала пробуем использовать кастомные примеры + const customExamples = this.getCustomPrompt(style, 'examples'); + if (customExamples && customExamples.length > 0) { + return customExamples[Math.floor(Math.random() * customExamples.length)]; + } + + // Иначе используем стандартные поздравления const congratulations = { aggressive: { normal: ['Неплохо сыграно!', 'Уважаю!', 'Сильная рука!', 'Молодец!'], diff --git a/public/index.html b/public/index.html index d86f008..cdb1081 100644 --- a/public/index.html +++ b/public/index.html @@ -365,6 +365,134 @@ + +
+
+ 📊 Правила & Статистика + +
+
+
+ + +
+ + +
+
+

Комбинации (от старшей к младшей):

+
+
+ 10 + Роял-флеш + A♠ K♠ Q♠ J♠ 10♠ +
+
+ 9 + Стрит-флеш + 9♥ 8♥ 7♥ 6♥ 5♥ +
+
+ 8 + Каре + K♠ K♥ K♦ K♣ 3♠ +
+
+ 7 + Фулл-хаус + A♠ A♥ A♦ 8♣ 8♠ +
+
+ 6 + Флеш + Q♦ 9♦ 7♦ 4♦ 2♦ +
+
+ 5 + Стрит + J♠ 10♥ 9♦ 8♣ 7♠ +
+
+ 4 + Сет (тройка) + 7♠ 7♥ 7♦ K♣ 2♠ +
+
+ 3 + Две пары + Q♠ Q♥ 5♦ 5♣ 9♠ +
+
+ 2 + Пара + 10♠ 10♥ A♦ 6♣ 3♠ +
+
+ 1 + Старшая карта + A♠ J♥ 8♦ 6♣ 2♠ +
+
+
+
+ + +
+
+

Ваша текущая рука:

+
+
+ Карты не розданы +
+
+ — +
+
+ +

Шансы на победу:

+
+
+
+
+
0%
+
+ +

Вероятности улучшения:

+
+
+ Следующая карта: + +
+
+ До вскрытия: + +
+
+ +

Статистика сессии:

+
+
+ Раздач сыграно: + 0 +
+
+ Раздач выиграно: + 0 +
+
+ Всего выиграно: + 0 +
+
+ Лучшая рука: + +
+
+
+
+
+
+
@@ -502,6 +630,7 @@
+
@@ -547,6 +676,56 @@
+ + +