javascript

My JavaScript Scripts Collection
git clone https://fab.ddns.me.uk/stagit/javascript
Log | Files | Refs | README

commit f7cfa6f10d89b07faf6e904f7cec1207f12df113
parent de7362ac7b9033cf50476e4cd235f7189fdf4f09
Author: masayoshi <masayoshi@example.com>
Date:   Tue, 24 Feb 2026 19:17:36 +0900

Upload

Diffstat:
Ablackjack.js | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aomikuji.js | 9+++++++++
2 files changed, 109 insertions(+), 0 deletions(-)

diff --git a/blackjack.js b/blackjack.js @@ -0,0 +1,100 @@ +#!/usr/bin/env node + +const fs = require('fs'); + +/** + * OpenBSDなどの環境で外部ライブラリを使わずに + * 標準入力から同期的に入力を取得する関数 + */ +function prompt(message) { + process.stdout.write(message); + const buffer = Buffer.alloc(1024); + try { + // 標準入力 (File Descriptor 0) から同期読み込み + const bytesRead = fs.readSync(0, buffer, 0, 1024); + return buffer.toString('utf8', 0, bytesRead).trim(); + } catch (err) { + return ""; + } +} + +// 1. 山札(デッキ)の作成 +const base = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']; +let deck = [...base, ...base, ...base, ...base]; + +// 2. 手札の合計を計算する関数 +function countScore(hand) { + let total = 0; + let aces = 0; + + for (const card of hand) { + if (!isNaN(card)) { + total += parseInt(card); + } else if (card === 'A') { + aces += 1; + total += 11; + } else { + total += 10; // J, Q, K + } + } + + while (total > 21 && aces > 0) { + total -= 10; + aces -= 1; + } + return total; +} + +// 3. ゲーム開始 (Fisher-Yates 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]]; +} + +let player = [deck.pop(), deck.pop()]; +let dealer = [deck.pop(), deck.pop()]; + +// プレイヤーのターン +while (true) { + const pScore = countScore(player); + console.log(`Your hand: ${player.join(', ')} (Score: ${pScore})`); + + if (pScore > 21) { + console.log("Bust! You lose. 🇬🇧 Dreadful luck!"); + process.exit(); + } + if (pScore === 21) { + console.log("Blackjack! 🇬🇧 Top-hole!"); + break; + } + + const choice = prompt("Do you want to (H)it or (S)tand? "); + if (choice.toLowerCase().startsWith('h')) { + player.push(deck.pop()); + } else { + break; + } +} + +// 4. ディーラーのターン +console.log(`\nDealer's hand: ${dealer.join(', ')}`); +while (countScore(dealer) < 17) { + dealer.push(deck.pop()); + console.log(`Dealer hits: ${dealer.join(', ')} (Score: ${countScore(dealer)})`); +} + +// 5. 結果判定 +const pTotal = countScore(player); +const dTotal = countScore(dealer); + +console.log(`\nFinal Scores - You: ${pTotal}, Dealer: ${dTotal}`); + +if (dTotal > 21) { + console.log("Dealer busts! You win! 🇬🇧 Brilliant!"); +} else if (pTotal > dTotal) { + console.log("You win! 🇬🇧 Jolly good!"); +} else if (pTotal < dTotal) { + console.log("Dealer wins. 🇬🇧 Better luck next time!"); +} else { + console.log("It's a push (Tie)."); +} diff --git a/omikuji.js b/omikuji.js @@ -0,0 +1,8 @@ +#!/usr/bin/env node + +const fortunes = ["Great-luck", "Middle-luck", "Small-luck", "Misfortune"]; + +// 配列からランダムに1つ選ぶ処理 +const pick = fortunes[Math.floor(Math.random() * fortunes.length)]; + +console.log(`Your fortune is... ${pick}`); +\ No newline at end of file