-

-

Код игры чайная лавка

Код игры чайная лавка

Экономия времени. Быстрый старт. Возможность адаптировать и изменять стратегию игры под свои предпочтения. Готовый код за минуту! Минимальные знания программирования. Личный ассистент за доступную цену. Промт всего лишь ключ к созданию собственного продукта. Создайте бизнес-симулятор своей мечты за 5 минут. Настройте правила, цены и события под себя, просто общаясь с чат-ботом!

Нейросеть: categories DeepSeek
Категория: Коды
Количество символов: 1535

Оперативная информация:

Модель: DeepSeek -

Пример результата:

Это профессиональный HTML-код симулятора чайной лавки с глубокой экономической моделью. Он готов для запуска в браузере на телефоне или компьютере.

```html

<!DOCTYPE html>

<html lang="ru">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=yes">

<title>Чайная лавка · симулятор эксперта</title>

<style>

* {

box-sizing: border-box;

margin: 0;

padding: 0;

}

body {

background: #2b4b3c;

background-image: radial-gradient(circle at 10% 20%, #3f6b53, #1d3529);

font-family: 'Segoe UI', Roboto, system-ui, -apple-system, sans-serif;

padding: 12px;

min-height: 100vh;

display: flex;

justify-content: center;

align-items: flex-start;

font-size: 18px;

}

#game-wrapper {

max-width: 700px;

width: 100%;

margin: 0 auto;

background: #f9f1e0;

background: linear-gradient(145deg, #fef7e9 0%, #f5e6cf 100%);

border-radius: 42px 42px 32px 32px;

box-shadow: 0 25px 40px rgba(0,0,0,0.5), 0 0 0 2px #c8a87e inset;

padding: 20px 16px 26px;

border: 1px solid #eccea7;

}

/* интерфейс */

.header-stats {

display: flex;

flex-wrap: wrap;

gap: 12px 10px;

background: #372e22d9;

background: #2d2319;

border-radius: 60px;

padding: 16px 18px;

margin-bottom: 18px;

color: #f7e9c3;

backdrop-filter: blur(4px);

border: 1px solid #b4946a;

box-shadow: inset 0 2px 5px #aa8b5f, 0 6px 0 #1e1710;

font-weight: 600;

}

.stat-item {

display: flex;

align-items: center;

gap: 6px;

background: #4d3b29;

padding: 6px 15px;

border-radius: 40px;

font-size: 1.1rem;

border: 1px solid #dbbd92;

box-shadow: 0 2px 0 #1f160e;

}

.stat-icon { font-size: 1.6rem; line-height: 1; }

.day-log {

background: #ece2cf;

border-radius: 30px;

padding: 18px 18px;

margin: 20px 0 20px;

border: 2px solid #b69264;

box-shadow: inset 0 0 0 2px #ffecca, 0 6px 0 #7a623b;

font-size: 1.1rem;

min-height: 120px;

}

.event-title {

font-weight: 800;

color: #3a280e;

font-size: 1.2rem;

margin-bottom: 10px;

display: flex;

gap: 10px;

align-items: center;

}

.choice-buttons {

display: flex;

flex-wrap: wrap;

gap: 12px;

margin: 16px 0 10px;

justify-content: center;

}

.choice-btn {

background: #ffd89a;

border: none;

border-radius: 60px;

padding: 14px 22px;

font-size: 1.1rem;

font-weight: 700;

color: #281e0f;

box-shadow: 0 5px 0 #a57c48, 0 6px 10px rgba(0,0,0,0.2);

transition: 0.06s linear;

flex: 1 0 auto;

border: 1px solid #ffe8b7;

cursor: pointer;

-webkit-tap-highlight-color: transparent;

}

.choice-btn:active {

transform: translateY(5px);

box-shadow: 0 1px 0 #a57c48;

}

.grid-panels {

display: grid;

grid-template-columns: repeat(2, 1fr);

gap: 14px;

margin: 18px 0;

}

.card {

background: #cfba9b;

background: linear-gradient(145deg, #ddceb2, #c0a987);

border-radius: 28px;

padding: 16px 12px;

border: 2px solid #b3905b;

box-shadow: 0 7px 0 #7b5d3a, inset 0 0 0 2px #ffe1b3;

}

.card h3 {

font-size: 1.3rem;

margin-bottom: 14px;

display: flex;

align-items: center;

gap: 8px;

color: #1e2f1a;

border-bottom: 2px dashed #846945;

padding-bottom: 6px;

}

.button-row {

display: flex;

flex-wrap: wrap;

gap: 8px;

margin-top: 12px;

}

.small-btn {

background: #f5e5c9;

border: none;

border-radius: 40px;

padding: 10px 12px;

font-size: 1rem;

font-weight: 600;

box-shadow: 0 4px 0 #8b6d44;

transition: 0.05s;

flex: 1 0 auto;

border: 1px solid #ffd89a;

cursor: pointer;

}

.small-btn:active { transform: translateY(4px); box-shadow: 0 1px 0 #8b6d44; }

.row-flex { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }

.value-badge {

background: #1e2e19;

color: #f2e1b9;

border-radius: 30px;

padding: 6px 14px;

font-weight: 600;

font-size: 1rem;

}

.competitor-line {

background: #824f4f;

color: #ffc6a0;

padding: 10px 18px;

border-radius: 50px;

font-size: 1rem;

margin: 15px 0 5px;

}

.graph-placeholder {

background: #324a31;

height: 40px;

border-radius: 30px;

margin: 10px 0;

display: flex;

align-items: center;

padding: 0 20px;

color: #a7f0a7;

font-weight: 600;

border: 1px solid #99bb77;

}

/* звук скрыт */

audio { display: none; }

@media (max-width: 480px) {

body { font-size: 16px; }

.stat-item { font-size: 0.95rem; padding: 5px 12px; }

.choice-btn { padding: 12px 14px; font-size: 1rem; }

}

</style>

</head>

<body>

<div id="game-wrapper">

<!-- шапка -->

<div class="header-stats">

<div class="stat-item"><span class="stat-icon">🍃</span> день <span id="dayCounter">1</span></div>

<div class="stat-item"><span class="stat-icon">💰</span> <span id="cashDisplay">15000</span> ₽</div>

<div class="stat-item"><span class="stat-icon">🧠</span> экспертность <span id="expertiseDisplay">35</span></div>

<div class="stat-item"><span class="stat-icon">👥</span> LTV ср <span id="ltvDisplay">420</span></div>

</div>

<!-- событие / сюжет -->

<div class="day-log" id="eventLog">

<div class="event-title">📜 день открытия: ваша лавка «Путь чая»</div>

<div id="eventText">Вы настоящий мастер. Первый гость зашёл на огонёк. Выберите действие →</div>

</div>

<div class="choice-buttons" id="choiceArea">

<button class="choice-btn" id="choice1">🍵 провести дегустацию (экспертность +2)</button>

<button class="choice-btn" id="choice2">🤝 учить сотрудника</button>

<button class="choice-btn" id="choice3">📦 позвать поставщика</button>

</div>

<!-- панели ресурсов -->

<div class="grid-panels">

<!-- хранение / редкие сорта -->

<div class="card">

<h3>🗃️ хранилище <span style="font-size:0.8rem;">(риск порчи <span id="moldRisk">5</span>%)</span></h3>

<div class="row-flex"><span>Пуэр 🍂: <span id="puers">2</span> кг</span> <span>Те Гуаньинь: <span id="oolong">1</span> кг</span></div>

<div class="row-flex"><span>Шэн/Шу: <span id="sheng">0</span> кг</span> <span>редкий 🏆: <span id="rareTea">0</span></span></div>

<div class="button-row">

<button class="small-btn" id="buyPuer">🌱 купить пуэр</button>

<button class="small-btn" id="improveStorage">🧹 проветрить</button>

</div>

</div>

<!-- персонал / обучение -->

<div class="card">

<h3>👥 команда (найм)</h3>

<div>продавцы: <span id="sellers">1</span> ⭐ обучение <span id="staffEdu">15</span>%</div>

<div>дегустатор: <span id="sommelier">0</span></div>

<div class="button-row">

<button class="small-btn" id="hireSeller">нанять за 3000₽</button>

<button class="small-btn" id="trainStaff">обучить (+5% экспертам)</button>

</div>

</div>

<!-- психотипы / ритуалы -->

<div class="card">

<h3>🧘 клиенты сегодня</h3>

<div>🔮 скептик · эстет · гедонист</div>

<div>⏳ время ожидания: <span id="waitTime">4</span> мин</div>

<div class="button-row">

<button class="small-btn" id="ritualMeditation">🧎 ритуал «медленный чай»</button>

<button class="small-btn" id="convertButton">🤝 конвертировать в постоянного</button>

</div>

</div>

<!-- поставщики / переговоры -->

<div class="card">

<h3>📞 стратег. поставки</h3>

<div>💼 Ли Чан (скидка <span id="supplierDiscount">7</span>%)</div>

<div>🌿 эксклюзив: шанс <span id="exclusiveChance">10</span>%</div>

<div class="button-row">

<button class="small-btn" id="negotiate">🤝 переговор за экспертность</button>

<button class="small-btn" id="buyRare">🍃 выкупить редкий лот</button>

</div>

</div>

</div>

<!-- конкурент и график -->

<div class="competitor-line" id="competitorBlock">🐉 конкурент «Старый мастер» активен · репутация 43</div>

<div class="graph-placeholder" id="graphDisplay">📈 график развития: 📊▰▰▰▰▰▰▰▰▰▰ 42% зрелости</div>

<!-- дополнительные кнопки управления -->

<div style="display: flex; gap: 8px; margin: 15px 0 5px; flex-wrap: wrap;">

<button class="small-btn" id="newRecipe">🧪 создать рецепт</button>

<button class="small-btn" id="makeDeal">🤝 заключить сделку с отелем</button>

<button class="small-btn" id="decorate">🖼️ украсить лавку</button>

<button class="small-btn" id="nextDayBtn">⏩ следующий день (прибыль)</button>

</div>

<!-- подсказка состояния -->

<div style="margin-top: 18px; background: #c7b595; border-radius: 40px; padding: 10px 16px; font-size: 1.0rem; border: 1px solid #6f5435;">

⏳ активные кризисы: <span id="crisisLine">нет</span> · рецептов: <span id="recipesCount">1</span>

</div>

</div>

<script>

// ================ ГЛУБОКАЯ МОДЕЛЬ ЧАЙНОЙ ЛАВКИ ================

(function() {

// состояние

let state = {

day: 1,

cash: 15000,

expertise: 35, // экспертность владельца

ltv: 420, // средняя пожизненная ценность (LTV)

// ресурсы

puerKg: 2,

oolongKg: 1,

shengKg: 0,

rareTeaKg: 0,

moldRisk: 5, // риск порчи %

// сотрудники

sellers: 1,

staffEdu: 15, // обученность продавцов %

sommelier: 0,

// поставщики

supplierDiscount: 7,

exclusiveChance: 10,

// клиенты / ожидание

waitTime: 4,

regulars: 0, // постоянные покупатели

// психологический профиль сегодня (генерится)

customerProfile: 'эстет',

// конкурент

competitorRep: 43,

competitorName: 'Старый мастер',

// кризисы

crisis: null,

crisisDays: 0,

recipes: 1,

decorationLevel: 1,

// график зрелости

maturity: 42, // %

// событие дня

lastEvent: 'Добро пожаловать',

choiceLock: false,

};

// вспомогательные функции обновления интерфейса

function refreshUI() {

document.getElementById('dayCounter').innerText = state.day;

document.getElementById('cashDisplay').innerText = Math.floor(state.cash);

document.getElementById('expertiseDisplay').innerText = Math.floor(state.expertise);

document.getElementById('ltvDisplay').innerText = Math.floor(state.ltv);

document.getElementById('moldRisk').innerText = state.moldRisk;

document.getElementById('puers').innerText = state.puerKg;

document.getElementById('oolong').innerText = state.oolongKg;

document.getElementById('sheng').innerText = state.shengKg;

document.getElementById('rareTea').innerText = state.rareTeaKg;

document.getElementById('sellers').innerText = state.sellers;

document.getElementById('staffEdu').innerText = state.staffEdu;

document.getElementById('sommelier').innerText = state.sommelier;

document.getElementById('waitTime').innerText = state.waitTime;

document.getElementById('supplierDiscount').innerText = state.supplierDiscount;

document.getElementById('exclusiveChance').innerText = state.exclusiveChance;

document.getElementById('competitorBlock').innerHTML = `🐉 конкурент «${state.competitorName}» · репутация ${Math.floor(state.competitorRep)}`;

document.getElementById('crisisLine').innerText = state.crisis ? state.crisis : 'нет';

document.getElementById('recipesCount').innerText = state.recipes;

let graphLen = Math.floor(state.maturity / 10);

let bar = '▰'.repeat(Math.min(10, graphLen)) + '▱'.repeat(10 - Math.min(10, graphLen));

document.getElementById('graphDisplay').innerHTML = `📈 график развития: 📊${bar} ${state.maturity}% зрелости`;

// LTV формула динамическая (обновляется в методах)

}

// обработка события дня и вариантов

function setEvent(title, text, choices = null) {

document.querySelector('.event-title').innerHTML = title;

document.getElementById('eventText').innerText = text;

// choices - массив из 3 объектов { text, handler }

if (choices) {

const btn1 = document.getElementById('choice1');

const btn2 = document.getElementById('choice2');

const btn3 = document.getElementById('choice3');

btn1.innerText = choices[0]?.text || '———';

btn2.innerText = choices[1]?.text || '———';

btn3.innerText = choices[2]?.text || '———';

// сброс обработчиков, назначаем новые

const newHandler1 = choices[0]?.handler || (()=>{});

const newHandler2 = choices[1]?.handler || (()=>{});

const newHandler3 = choices[2]?.handler || (()=>{});

btn1.replaceWith(btn1.cloneNode(true));

btn2.replaceWith(btn2.cloneNode(true));

btn3.replaceWith(btn3.cloneNode(true));

const freshBtn1 = document.getElementById('choice1');

const freshBtn2 = document.getElementById('choice2');

const freshBtn3 = document.getElementById('choice3');

freshBtn1.addEventListener('click', (e) => { e.preventDefault(); if(!state.choiceLock) newHandler1(); });

freshBtn2.addEventListener('click', (e) => { e.preventDefault(); if(!state.choiceLock) newHandler2(); });

freshBtn3.addEventListener('click', (e) => { e.preventDefault(); if(!state.choiceLock) newHandler3(); });

}

}

// продвинутая модель спроса и LTV

function recalcLTV() {

let base = 300 + state.regulars * 10 + (state.expertise * 2) + (state.staffEdu * 1.5) - (state.waitTime * 8);

if (base < 150) base = 150;

state.ltv = Math.floor(base * (1 + state.decorationLevel * 0.05));

}

// кризис генерация

function maybeTriggerCrisis() {

if (state.crisis) return; // уже кризис

if (Math.random() < 0.18 && state.day > 3) {

const crises = ['плесень на пуэре', 'скандал с поставщиком', 'уход постоянного клиента', 'конкурент переманил'];

let picked = crises[Math.floor(Math.random() * crises.length)];

state.crisis = picked;

state.crisisDays = 3;

if (picked.includes('плесень')) { state.puerKg = Math.max(0, state.puerKg-1); state.rareTeaKg = 0; }

if (picked.includes('скандал')) state.supplierDiscount -= 4;

setEvent('🔥 КРИЗИС!', `Случился: ${picked}. Придётся разбираться`, [

{ text: '💰 заплатить 5000', handler: ()=>{ state.cash-=5000; state.crisis=null; setEvent('✅', 'Кризис улажен', getDefaultChoices()); refreshUI(); } },

{ text: '🧠 использовать экспертность', handler: ()=>{ if(state.expertise>30){ state.expertise-=5; state.crisis=null; } else alert('мало экспертности'); refreshUI(); } },

{ text: '🙏 извиниться (репутация)', handler: ()=>{ state.competitorRep+=5; state.crisis=null; refreshUI(); } }

]);

}

}

// базовые события каждый день

function dailyProfitAndStory() {

if (state.crisis) state.crisisDays--;

if (state.crisisDays <= 0) state.crisis = null;

// прибыль от продаж (сложная модель)

let segment = Math.random();

let visitors = 5 + Math.floor(state.expertise / 8) + state.sellers * 2;

let conversion = (state.staffEdu / 100 + 0.2 + (state.sommelier * 0.1));

let income = visitors * conversion * (50 + state.ltv / 5) * (1 + (state.rareTeaKg * 0.3));

state.cash += Math.floor(income) + 800;

// влияние времени ожидания

if (state.waitTime > 7) conversion *= 0.7;

// риск порчи

if (Math.random() < state.moldRisk / 100) {

let loss = (state.puerKg + state.oolongKg) * 0.2;

state.puerKg = Math.max(0, Math.floor(state.puerKg - loss));

state.oolongKg = Math.max(0, Math.floor(state.oolongKg - loss*0.5));

setEvent('🍂 Плесень!', `Часть чая испорчена. Потеряно ${loss.toFixed(1)} кг.`, getDefaultChoices());

}

// конкурент двигается

state.competitorRep += (Math.random() * 3 - 0.5);

if (state.competitorRep > 70) state.competitorName = 'Лидер рынка';

// зрелость

state.maturity = Math.min(100, state.maturity + 1 + (state.expertise/50));

recalcLTV();

refreshUI();

}

// дефолтные кнопки (варианты ответов на день)

function getDefaultChoices() {

return [

{ text: '🍵 дегустация (+экспертность)', handler: ()=>{ state.expertise += 2; state.waitTime = Math.max(2, state.waitTime-1); setEvent('👅 дегустация', 'вы стали чувствовать оттенки тоньше', getDefaultChoices()); refreshUI(); } },

{ text: '🤝 тренировать сотрудника', handler: ()=>{ state.staffEdu = Math.min(100, state.staffEdu + 4); state.expertise += 1; setEvent('📚 обучение', 'продавцы увереннее', getDefaultChoices()); refreshUI(); } },

{ text: '📞 переговоры с поставщиком', handler: ()=>{ if(state.expertise>20) { state.supplierDiscount+=3; state.expertise-=2; } setEvent('🎍', 'скидка увеличена', getDefaultChoices()); refreshUI(); } }

];

}

// события по кнопкам

document.getElementById('buyPuer').addEventListener('click', ()=>{

if (state.cash >= 2000) { state.cash -= 2000; state.puerKg += 2; state.moldRisk += 2; }

refreshUI();

});

document.getElementById('improveStorage').addEventListener('click', ()=>{

state.moldRisk = Math.max(1, state.moldRisk-5); state.cash -= 300; refreshUI();

});

document.getElementById('hireSeller').addEventListener('click', ()=>{

if(state.cash>=3000){ state.sellers++; state.cash-=3000; refreshUI(); }

});

document.getElementById('trainStaff').addEventListener('click', ()=>{

if(state.cash>=1500){ state.staffEdu = Math.min(100, state.staffEdu+8); state.cash-=1500; refreshUI(); }

});

document.getElementById('ritualMeditation').addEventListener('click', ()=>{

state.waitTime = Math.max(1, state.waitTime-2); state.expertise += 1; refreshUI();

});

document.getElementById('convertButton').addEventListener('click', ()=>{

if(state.waitTime <= 3) { state.regulars++; state.ltv += 50; alert('гость стал постоянным!'); }

else alert('слишком долгое ожидание');

refreshUI();

});

document.getElementById('negotiate').addEventListener('click', ()=>{

if (state.expertise >= 20) { state.supplierDiscount += 4; state.expertise -= 3; refreshUI(); }

});

document.getElementById('buyRare').addEventListener('click', ()=>{

if (state.cash > 8000 && Math.random() < state.exclusiveChance/100) { state.rareTeaKg++; state.cash -= 7000; alert('редкий лот доставлен!'); refreshUI(); }

else alert('не вышло или нет денег');

});

document.getElementById('newRecipe').addEventListener('click', ()=>{

if(state.expertise>30) { state.recipes++; state.expertise-=2; alert('новый рецепт: молочный улун с лепестками'); refreshUI(); }

});

document.getElementById('makeDeal').addEventListener('click', ()=>{

if(state.cash>5000 && state.rareTeaKg>0){ state.cash+=15000; state.rareTeaKg--; alert('сделка с отелем!'); refreshUI(); }

});

document.getElementById('decorate').addEventListener('click', ()=>{

if(state.cash>4000){ state.decorationLevel++; state.cash-=4000; recalcLTV(); refreshUI(); }

});

document.getElementById('nextDayBtn').addEventListener('click', ()=>{

state.day++;

dailyProfitAndStory();

maybeTriggerCrisis();

let prof = ['эстет','скептик','гедонист','минималист'][Math.floor(Math.random()*4)];

setEvent(`📆 день ${state.day} · профиль: ${prof}`, 'выберите тактику на сегодня', getDefaultChoices());

refreshUI();

});

// инициализация

window.onload = ()=>{

setEvent('📜 день открытия', 'Ваша лавка «Путь чая» ждёт решений', getDefaultChoices());

refreshUI();

// эмуляция звуков (не реализована полноценно, но интерфейс готов)

};

})();

</script>

</body>

</html>

```

Управление лавкой и ключевые механики

Игра строится вокруг ежедневного выбора и управления ресурсами. Вот на что стоит обратить внимание:

· Ежедневные события: В центре экрана появляется описание дня и три варианта реакции. Ваш выбор влияет на экспертность, отношения с поставщиками и лояльность клиентов.

· Ресурсы и риски: Вкладка «Хранилище» показывает запас чая и риск порчи. Кнопки позволяют закупать сырьё или снижать риски. Вкладка «Команда» отвечает за наём и обучение персонала, что напрямую влияет на продажи.

· Стратегия и кризисы: Взаимодействуйте с поставщиками для получения скидок, создавайте рецепты и украшайте лавку. Случайные кризисы (плесень, конкуренты) потребуют быстрого решения через специальные кнопки выбора.

N
@NatalliaMyPrompt

Создатель промта

0

766 ₽

Отзывы

Отзывы (0)

0
0

Промты