From c9a81f8119f0b77ea29c21e62a8340429a25f50c Mon Sep 17 00:00:00 2001 From: ody Date: Thu, 20 Nov 2025 18:27:34 +0700 Subject: [PATCH] reload js --- ody git.js | 375 ++++++++++++++++++++++------------------------------- 1 file changed, 152 insertions(+), 223 deletions(-) diff --git a/ody git.js b/ody git.js index d8df560..c63272f 100644 --- a/ody git.js +++ b/ody git.js @@ -1,242 +1,171 @@ -// Simple Blackjack implementation -const SUITS = ['♠','♥','♦','♣']; -const RANKS = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']; + // Simple Blackjack implementation + const SUITS = ['♠','♥','♦','♣']; + const RANKS = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']; -const dealerHandEl = document.getElementById('dealer-hand'); -const playerHandEl = document.getElementById('player-hand'); -const dealerValueEl = document.getElementById('dealer-value'); -const playerValueEl = document.getElementById('player-value'); -const balanceEl = document.getElementById('balance'); -const betInput = document.getElementById('bet-input'); -const betBtn = document.getElementById('bet-btn'); -const currentBetEl = document.getElementById('current-bet'); -const hitBtn = document.getElementById('hit'); -const standBtn = document.getElementById('stand'); -const doubleBtn = document.getElementById('double'); -const newRoundBtn = document.getElementById('new-round'); -const messageEl = document.getElementById('message'); + // DOM + const dealerHandEl = document.getElementById('dealer-hand'); + const playerHandEl = document.getElementById('player-hand'); + const dealerValueEl = document.getElementById('dealer-value'); + const playerValueEl = document.getElementById('player-value'); + const balanceEl = document.getElementById('balance'); + const betInput = document.getElementById('bet-input'); + const betBtn = document.getElementById('bet-btn'); + const currentBetEl = document.getElementById('current-bet'); + const hitBtn = document.getElementById('hit'); + const standBtn = document.getElementById('stand'); + const doubleBtn = document.getElementById('double'); + const newRoundBtn = document.getElementById('new-round'); + const messageEl = document.getElementById('message'); -let deck = []; -let dealer = []; -let player = []; -let dealerHidden = true; -let balance = 1000; -let currentBet = 0; -let inRound = false; + let deck = []; + let dealer = []; + let player = []; + let dealerHidden = true; + let balance = 1000; + let currentBet = 0; + let inRound = false; -// Membuat deck kartu -function makeDeck() { - deck = []; - for (let s of SUITS) { - for (let r of RANKS) { - deck.push({ suit: s, rank: r }); - } - } -} - -// Shuffle -function shuffle() { - for (let i = deck.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [deck[i], deck[j]] = [deck[j], deck[i]]; - } -} - -// Nilai kartu -function cardValue(card) { - if (card.rank === 'A') return 11; - if (['J','Q','K'].includes(card.rank)) return 10; - return Number(card.rank); -} - -// Nilai total tangan -function handValues(hand) { - let total = 0; - let aceCount = 0; - - for (let c of hand) { - total += cardValue(c); - if (c.rank === 'A') aceCount++; - } - - while (total > 21 && aceCount > 0) { - total -= 10; - aceCount--; - } - - return total; -} - -// Render kartu -function renderHand(container, hand, hideFirst = false) { - container.innerHTML = ''; - - hand.forEach((card, i) => { - const div = document.createElement('div'); - div.className = 'card'; - - // warna merah ♥ ♦ - if (card.suit === '♥' || card.suit === '♦') { - div.classList.add('red'); + function makeDeck(){ + deck = []; + for(const s of SUITS){ + for(const r of RANKS){ + deck.push({suit:s,rank:r}); + } + } } - if (hideFirst && i === 0) { - div.className = "card back"; - div.textContent = "🂠"; - } else { - div.innerHTML = ` -
${card.rank}${card.suit}
-
${card.rank}${card.suit}
- `; + function shuffle(){ + for(let i=deck.length-1;i>0;i--){ + const j = Math.floor(Math.random()*(i+1)); + [deck[i],deck[j]] = [deck[j],deck[i]]; + } } - container.appendChild(div); - }); -} + function cardValue(card){ + const r = card.rank; + if(r==='A') return [1,11]; + if(['J','Q','K'].includes(r)) return [10]; + return [parseInt(r,10)]; + } -// Update UI -function updateUI() { - renderHand(playerHandEl, player, false); - renderHand(dealerHandEl, dealer, dealerHidden); + function handValues(hand){ + // returns best value <=21 or smallest if bust + let totals = [0]; + for(const c of hand){ + const vals = cardValue(c); + const newTotals = []; + for(const t of totals){ + for(const v of vals){ newTotals.push(t+v); } + } + totals = Array.from(new Set(newTotals)); + } + // separate <=21 and >21 + const valid = totals.filter(t=>t<=21); + if(valid.length) return Math.max(...valid); + return Math.min(...totals); + } - dealerValueEl.textContent = dealerHidden ? "?" : handValues(dealer); - playerValueEl.textContent = handValues(player); + function renderHand(el,hand,hideFirst=false){ + el.innerHTML=''; + hand.forEach((c,i)=>{ + const div = document.createElement('div'); + div.className='card'+(c.suit==='♥'||c.suit==='♦'?' red':''); + if(hideFirst && i===0){ div.className='card back'; div.textContent='TERSEMBUNYI'; } + else{ + const top = document.createElement('div'); top.textContent = c.rank + ' ' + c.suit; // top-left + const bot = document.createElement('div'); bot.style.alignSelf='flex-end'; bot.textContent = c.rank + ' ' + c.suit; // bottom-right + div.appendChild(top); div.appendChild(bot); + } + el.appendChild(div); + }); + } - balanceEl.textContent = balance; - currentBetEl.textContent = currentBet; + function updateUI(){ + renderHand(dealerHandEl,dealer,dealerHidden); + renderHand(playerHandEl,player,false); + dealerValueEl.textContent = dealerHidden ? '??' : 'Nilai: '+handValues(dealer); + playerValueEl.textContent = 'Nilai: '+handValues(player); + balanceEl.textContent = balance; + currentBetEl.textContent = currentBet; + } - hitBtn.disabled = !inRound; - standBtn.disabled = !inRound; - doubleBtn.disabled = !inRound; + function startRound(){ + if(inRound) return; + const bet = Number(betInput.value) || 0; + if(bet <=0 || bet > balance){ alert(' BANK TIDAK CUKUP! '); return; } + currentBet = bet; balance -= bet; inRound=true; dealerHidden=true; messageEl.textContent=''; - if (!inRound) { - messageEl.textContent = "Pasang taruhan untuk mulai."; - } -} + makeDeck(); shuffle(); + dealer = [deck.pop(), deck.pop()]; + player = [deck.pop(), deck.pop()]; -// Mulai ronde -function startRound() { - if (inRound) return; + // Check for natural blackjack + updateUI(); + if(handValues(player)===21){ + dealerHidden=false; updateUI(); + const dealerVal = handValues(dealer); + if(dealerVal===21){ // push + balance += currentBet; messageEl.textContent = 'Tie (seri). Taruhan dikembalikan.'; + } else { + // player blackjack 3:2 + const payout = Math.floor(currentBet * 2.5); + balance += payout; messageEl.textContent = 'Blackjack! You Win.'; + } + inRound=false; currentBet=0; updateUI(); + } else { + updateUI(); + } + } - const bet = Number(betInput.value); + function playerHit(){ + if(!inRound) return; player.push(deck.pop()); updateUI(); + const val = handValues(player); + if(val>21){ // bust + dealerHidden=false; messageEl.textContent='Bust! Dealer Win!'; inRound=false; currentBet=0; updateUI(); + } + } - if (bet <= 0 || bet > balance) { - messageEl.textContent = "Taruhan tidak valid!"; - return; - } + function playerStand(){ + if(!inRound) return; dealerHidden=false; // reveal dealer + // dealer plays + while(handValues(dealer)<17){ dealer.push(deck.pop()); } + const pv = handValues(player); const dv = handValues(dealer); + if(dv>21 || pv>dv){ // player wins + const payout = currentBet*2; balance += payout; messageEl.textContent='You Win!'; + } else if(pv===dv){ // push + balance += currentBet; messageEl.textContent='Tie (seri).'; + } else { messageEl.textContent='Dealer Win!'; } + inRound=false; currentBet=0; updateUI(); + } - balance -= bet; - currentBet = bet; + function playerDouble(){ + if(!inRound) return; + if(balance < currentBet){ alert('Bank tidak cukup untuk double.'); return; } + // double: take exactly one card then stand + balance -= currentBet; currentBet = currentBet*2; player.push(deck.pop()); updateUI(); + const val = handValues(player); + if(val>21){ dealerHidden=false; messageEl.textContent='Bust setelah double. Dealer Win!'; inRound=false; currentBet=0; updateUI(); return; } + playerStand(); + } - makeDeck(); - shuffle(); + // Events + betBtn.addEventListener('click', startRound); + hitBtn.addEventListener('click', playerHit); + standBtn.addEventListener('click', playerStand); + doubleBtn.addEventListener('click', playerDouble); + newRoundBtn.addEventListener('click', ()=>{ + // reset everything + if(inRound){ if(!confirm('Masih dalam ronde. Ingin reset?')) return; } + balance = 1000; currentBet=0; inRound=false; dealer=[]; player=[]; deck=[]; dealerHidden=true; messageEl.textContent='Bank di-reset.'; updateUI(); + }); - dealer = [deck.pop(), deck.pop()]; - player = [deck.pop(), deck.pop()]; + // keyboard shortcuts + window.addEventListener('keydown', e=>{ + if(e.key==='h') playerHit(); + if(e.key==='s') playerStand(); + if(e.key==='d') playerDouble(); + if(e.key==='Enter') startRound(); + }); - dealerHidden = true; - inRound = true; - - messageEl.textContent = "Permainan dimulai!"; - updateUI(); - - // Natural blackjack - if (handValues(player) === 21) { - playerStand(); - } -} - -// Player hit -function playerHit() { - if (!inRound) return; - player.push(deck.pop()); - updateUI(); - - if (handValues(player) > 21) { - dealerHidden = false; - messageEl.textContent = "Kamu bust! Dealer menang."; - inRound = false; - updateUI(); - } -} - -// Player stand -function playerStand() { - if (!inRound) return; - - dealerHidden = false; - - while (handValues(dealer) < 17) { - dealer.push(deck.pop()); - } - - const pv = handValues(player); - const dv = handValues(dealer); - - if (dv > 21 || pv > dv) { - messageEl.textContent = "Kamu menang!"; - balance += currentBet * 2; - } else if (pv === dv) { - messageEl.textContent = "Seri!"; - balance += currentBet; - } else { - messageEl.textContent = "Dealer menang!"; - } - - currentBet = 0; - inRound = false; - updateUI(); -} - -// Double down -function playerDouble() { - if (!inRound) return; - if (balance < currentBet) { - messageEl.textContent = "Saldo tidak cukup untuk double!"; - return; - } - - balance -= currentBet; - currentBet *= 2; - - player.push(deck.pop()); - updateUI(); - - if (handValues(player) > 21) { - dealerHidden = false; - messageEl.textContent = "Bust saat double! Dealer menang."; - inRound = false; - return updateUI(); - } - - playerStand(); -} - -// Reset game -newRoundBtn.addEventListener('click', () => { - balance = 1000; - currentBet = 0; - dealer = []; - player = []; - deck = []; - inRound = false; - dealerHidden = true; - messageEl.textContent = "Bank di-reset."; - updateUI(); -}); - -// Events -betBtn.addEventListener('click', startRound); -hitBtn.addEventListener('click', playerHit); -standBtn.addEventListener('click', playerStand); -doubleBtn.addEventListener('click', playerDouble); - -// Keyboard shortcut -window.addEventListener('keydown', e => { - if (e.key === 'h') playerHit(); - if (e.key === 's') playerStand(); - if (e.key === 'd') playerDouble(); - if (e.key === 'Enter') startRound(); -}); - -updateUI(); \ No newline at end of file + // initial UI + updateUI(); \ No newline at end of file