JavaScript
console.clear();
// エースカードの数字
const ace = [1, 11];
// 山札を生成
const cardsInDeck = Array.from({length: 13}, (_, i) => Array(4).fill((i===0 ? 'A' : i+1))).flat();
// ['A', 'A', 'A', 'A', 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13]
console.log(cardsInDeck)
// クラスを定義
class Player {
constructor() {
this.cardsInHand = []; // 手札
}
// 配列の長さの範囲内(残りの山札数)で、ランダムな番号を生成するメソッド
getRandomIndex(allCardsArr) {
return Math.floor(Math.random() * allCardsArr.length - 1);
}
// 配列(残りの山札)から、カードを選択するメソッド
getRandomCard(allCardsArr, index) {
return allCardsArr[index];
}
// 配列(手札)の合計値が、22未満か確認するメソッド
// エースの時は1として扱う
isSmallerThan22(numOrStr) {
return this.cardsInHand.reduce((acc, cur) => acc + (cur === 'A' ? ace[0] : cur), 0) + (numOrStr === 'A' ? ace[0] : numOrStr) < 22;
}
// 山札からカードを引いて、手札にいれるメソッド
drawCard(allCardsArr) {
let randIdx = this.getRandomIndex(allCardsArr);
let card = this.getRandomCard(allCardsArr, randIdx);
// 配列の長さが3未満(今持っている手札が2枚まで)の場合
if (this.cardsInHand.length < 3) {
while (true) {
// 手札と新しくひいたカードの合計値が22未満か確認
const flag = this.isSmallerThan22(card);
// 22未満なら、whileループを終了する
if (flag) {
break;
// 22以上なら、カードを引き直す
} else {
console.log('手札が2枚以下、かつ、合計が21を超えるので、カードを引き直します。');
randIdx = this.getRandomIndex(allCardsArr);
card = this.getRandomCard(allCardsArr, randIdx);
}
}
}
// 引いたカードを、山札から削除する
const [pickedCard] = allCardsArr.splice(randIdx, 1);
// 引いたカードを、手札にいれる
this.cardsInHand.push(pickedCard);
}
}
const user = new Player();
const enemy = new Player();
const btnDraw = document.querySelector('#btn-draw');
btnDraw.addEventListener('click', drawCard);
function drawCard() {
// 山札のカードが0枚の時、処理を終了する
if (cardsInDeck.length === 0) {
console.log('山札にカードがありません。');
...