[英]How can I solve the ACE value problem with JavaScript?
So Ace should have value 11 or value 1 depending on the other cards.所以 A 的值应该是 11 或值 1,这取决于其他牌。 Let's say our starting cards are ACE and SIX.
假设我们的起始牌是 ACE 和 6。 That's 7 or 17. If we hit for another card and it's FOUR, we have Blackjack and the value of ACE should be 11. And other scenarios like this
那是 7 或 17。如果我们打出另一张牌,结果是 4,我们有二十一点,ACE 的值应该是 11。其他类似的情况
I'm converting the ACE value from the API in the convertToNum function.我正在 convertToNum 函数中从 API 转换 ACE 值。
Here is the whole code: https://jsfiddle.net/unote2zf/这是整个代码: https ://jsfiddle.net/unote2zf/
Here is my JS code:这是我的 JS 代码:
//DOM
let deckId = ""; //we store our deck in global variable
let playerCardOne,
playerCardTwo,
dealerClosedCard,
dealerCardTwo,
sumPlayersCards,
sumDealersCards;
//first card for the dealer
let dealerCardOne = document.querySelector(".dealer-card1");
let result = document.querySelector(".result");
const dealerCards = document.querySelector(".dealer-cards");
const playerCards = document.querySelector(".player-cards");
const dealerScore = document.querySelector(".dealer-score");
const playerScore = document.querySelector(".player-score");
//Buttons
const dealButton = document.querySelector(".deal");
const hitButton = document.querySelector(".hit");
const standButton = document.querySelector(".stand");
//we store value from the cards here
let addPlayersCards = [];
let addDealersCards = [];
//Event listeners
dealButton.addEventListener("click", dealCards);
hitButton.addEventListener("click", hit);
standButton.addEventListener("click", stand);
async function getDeck() {
try {
let res = await fetch("https://www.deckofcardsapi.com/api/deck/new/shuffle/?deck_count=2");
let data = await res.json()
console.log(data);
deckId = data.deck_id;
} catch (err) {
console.log(err)
}
};
getDeck();
async function dealCards() {
addDealersCards.push(await getCard());
addPlayersCards.push(await getCard());
addDealersCards.push(await getCard());
addPlayersCards.push(await getCard());
// dealerScore.textContent = convertToNum(addDealersCards[1].cards[0].value);
dealButton.classList.toggle("hide");
hitButton.classList.toggle("hide");
standButton.classList.toggle("hide");
dealerScore.classList.toggle("hide");
playerScore.classList.toggle("hide");
console.log(addPlayersCards)
console.log(addDealersCards)
renderCards();
sumCards();
if (sumPlayersCards === 21) {
result.innerText = "BLACKJACK PLAYER WINS";
flipDealersFirstCard();
checkForWinner();
}
}
async function hit() {
addPlayersCards.push(await getCard());
sumCards();
renderPlayersCard();
//If player goes over 21 to finish the game and open the dealers cards
if (sumPlayersCards >= 21) {
flipDealersFirstCard();
checkForWinner();
}
}
async function stand() {
flipDealersFirstCard();
//To hit the Dealer till he's over 17 or over
while (sumDealersCards < 17) {
addDealersCards.push(await getCard());
sumCards();
renderDealersCard();
}
// sumCards()
checkForWinner();
}
//Deal one card
async function getCard() {
try {
let res = await fetch(`https://deckofcardsapi.com/api/deck/${deckId}/draw/?count=1`);
let data = await res.json()
console.log(data)
return data.cards[0];
} catch (err) {
console.log(err)
}
};
function sumCards() {
sumPlayersCards = 0;
addPlayersCards.forEach(element => {
sumPlayersCards += convertToNum(element.value);
console.log(element.value)
});
sumDealersCards = 0;
addDealersCards.forEach(element => {
sumDealersCards += convertToNum(element.value);
console.log(element.value)
})
dealerScore.textContent = convertToNum(addDealersCards[addDealersCards.length - 1].value);
playerScore.textContent = sumPlayersCards;
console.log(sumDealersCards)
console.log(sumPlayersCards)
}
//Draw the cards in the arrays
function renderCards() {
addDealersCards.forEach(element => {
let cardElement = document.createElement("img");
dealerCards.appendChild(cardElement);
cardElement.src = element.image;
dealerCards.firstElementChild.src = "https://opengameart.org/sites/default/files/card%20back%20red.png";
})
addPlayersCards.forEach(element => {
let cardElement = document.createElement("img");
playerCards.appendChild(cardElement);
cardElement.src = element.image;
})
}
function renderPlayersCard() {
let cardElement = document.createElement("img");
playerCards.appendChild(cardElement);
cardElement.src = addPlayersCards[addPlayersCards.length - 1].image;
// playerScore.textContent = sumCards();
}
function renderDealersCard() {
let cardElement = document.createElement("img");
dealerCards.appendChild(cardElement);
cardElement.src = addDealersCards[addDealersCards.length - 1].image;
dealerScore.textContent = sumDealersCards;
}
//To flip the first card for the dealer and sum dealers cards.
function flipDealersFirstCard() {
dealerCards.firstElementChild.src = addDealersCards[0].image;
dealerScore.textContent = sumDealersCards;
console.log(sumDealersCards);
}
//To convert the cards with string Values
function convertToNum(val) {
if (val === "ACE") {
return 11;
}
else if (val === "KING" || val === "QUEEN" || val === "JACK") {
return 10;
}
else {
return Number(val);
}
}
//Checks who won
function checkForWinner() {
if (sumPlayersCards > sumDealersCards && sumPlayersCards < 21) {
result.classList.toggle("hide");
result.innerText = "PLAYER WINS";
} else if (sumDealersCards > 21 && sumPlayersCards <= 20) {
result.classList.toggle("hide");
result.innerText = "PLAYER WINS";
} else if (sumPlayersCards === 21 && sumDealersCards <= 20) {
result.classList.toggle("hide");
result.innerText = "BLACKJACK PLAYER WINS";
} else if (sumDealersCards > sumPlayersCards && sumDealersCards < 21) {
result.classList.toggle("hide");
result.innerText = "DEALER WINS";
} else if (sumPlayersCards > 21 && sumDealersCards <= 20) {
result.classList.toggle("hide");
result.innerText = "BUST! DEALER WINS";
} else if (
(sumDealersCards === 21 && sumPlayersCards <= 20) ||
sumPlayersCards > 21
) {
result.classList.toggle("hide");
result.innerText = "BLACKJACK DEALER WINS";
} else {
result.classList.toggle("hide");
result.innerText = "DRAW";
}
}
In sumCards() count ACE as 11 by default.在 sumCards() 中,默认将 ACE 计数为 11。
If the total is > 21 :如果总数 > 21 :
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.