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();