const prob = h.perf / sumPerf; // přidej margin 8% const price = 1 / (prob * 0.92); h.odds = round(price, 2); }); renderHorseList(); setupTrack(); ui.betView.textContent = 0; } function toOdds(x){ return round(Math.max(1.2, x), 2); } function round(n, p){ const m = Math.pow(10,p); return Math.round(n*m)/m; } // Render seznamu koní function renderHorseList(){ ui.horses.innerHTML = ''; horses.forEach((h, i)=>{ const row = document.createElement('div'); row.className = 'horse'; row.innerHTML = `
${h.name}
Forma: ${h.perf.toFixed(2)}
Kurz: ${h.odds.toFixed(2)}
`; ui.horses.appendChild(row); }); ui.horses.querySelectorAll('input[type="radio"]').forEach(r=>{ r.addEventListener('change', (e)=>{ selectedHorse = horses[parseInt(e.target.value,10)]; }); }); } // Spustit závod se sázkou ui.placeBetBtn.addEventListener('click', placeBet); ui.quickBtn.addEventListener('click', quickRace); ui.resetBtn.addEventListener('click', ()=>{ bankroll=1000; wins=0; raceId=0; updateStats(); newRace(); }); document.addEventListener('keydown', (e)=>{ const k = e.key.toLowerCase(); if(k==='enter') placeBet(); if(k==='r') quickRace(); }); function placeBet(){ if(running) return; const amt = +ui.betAmount.value; if(!selectedHorse){ alert('Vyber koně.'); return; } if(!Number.isFinite(amt) || amt<=0){ alert('Zadej platnou částku.'); return; } if(amt > bankroll){ alert('Nemáš dostatek prostředků.'); return; } bankroll -= amt; ui.betView.textContent = amt; updateStats(); runRace(amt, selectedHorse); } function quickRace(){ if(running) return; // malá sázka 10 na náhodného koně selectedHorse = horses[Math.floor(Math.random()*horses.length)]; ui.betAmount.value = 10; placeBet(); } function updateStats(){ ui.bankroll.textContent = Math.max(0, Math.floor(bankroll)); ui.racesCount.textContent = raceId; ui.winsCount.textContent = wins; } // Simulace závodu function runRace(betAmt, pick){ running = true; // reset pozic horses.forEach(h=>{ h.dist = 0; h.node.style.left = '6px'; }); const start = performance.now(); const duration = 8000 + Math.random()*2000; // 8–10 s závod let finished = false; function step(now){ const dt = (now - start) / 1000; horses.forEach(h=>{ // drobná náhoda v rychlosti v čase const jitter = 0.9 + Math.random()*0.2; h.dist = Math.min(TRACK_WIDTH, h.speed * dt * 0.7 * jitter); h.node.style.left = (6 + h.dist) + 'px'; }); // kontrola cíle const leaders = horses.filter(h=>h.dist >= TRACK_WIDTH); if(leaders.length && !finished){ finished = true; const winner = resolveWinner(leaders); settleBet(betAmt, pick, winner); running = false; newRace(); return; } if(!finished) requestAnimationFrame(step); } requestAnimationFrame(step); } // Rozhodni vítěze při těsném doběhu function resolveWinner(candidates){ // preferuj toho s vyšší formou, ale přidej náhodu candidates.sort((a,b)=> b.perf - a.perf); const top = candidates[0]; if(candidates.length===1) return top; return Math.random() < 0.7 ? top : candidates[Math.floor(Math.random()*candidates.length)]; } // Vyhodnocení sázky function settleBet(amount, pick, winner){ raceId++; const win = (pick.name === winner.name); let payout = 0; if(win){ wins++; payout = Math.floor(amount * winner.odds); bankroll += payout; addHistory(`Závod #${raceId}: Výhra na ${pick.name} • Výplata ${payout}`, 'win'); } else { addHistory(`Závod #${raceId}: Prohra. Vítěz ${winner.name}. Ztráta ${amount}`, 'loss'); } updateStats(); } function addHistory(text, cls){ const entry = document.createElement('div'); entry.className = cls === 'win' ? 'win' : 'loss'; entry.textContent = text; ui.history.prepend(entry); } // Start newRace(); updateStats();