Midjourney Оптимальные перспективы автомобиля
230 ₽
-
Экономия времени. Быстрый старт. Возможность адаптировать и изменять стратегию игры под свои предпочтения. Готовый код за минуту! Минимальные знания программирования. Личный ассистент за доступную цену. Промт всего лишь ключ к созданию собственного продукта. Создайте бизнес-симулятор своей мечты за 5 минут. Настройте правила, цены и события под себя, просто общаясь с чат-ботом!
Оперативная информация:
Модель: 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>
```
Управление лавкой и ключевые механики
Игра строится вокруг ежедневного выбора и управления ресурсами. Вот на что стоит обратить внимание:
· Ежедневные события: В центре экрана появляется описание дня и три варианта реакции. Ваш выбор влияет на экспертность, отношения с поставщиками и лояльность клиентов.
· Ресурсы и риски: Вкладка «Хранилище» показывает запас чая и риск порчи. Кнопки позволяют закупать сырьё или снижать риски. Вкладка «Команда» отвечает за наём и обучение персонала, что напрямую влияет на продажи.
· Стратегия и кризисы: Взаимодействуйте с поставщиками для получения скидок, создавайте рецепты и украшайте лавку. Случайные кризисы (плесень, конкуренты) потребуют быстрого решения через специальные кнопки выбора.
Создатель промта
766 ₽