commit f7cfa6f10d89b07faf6e904f7cec1207f12df113
parent de7362ac7b9033cf50476e4cd235f7189fdf4f09
Author: masayoshi <masayoshi@example.com>
Date: Tue, 24 Feb 2026 19:17:36 +0900
Upload
Diffstat:
| A | blackjack.js | | | 100 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | omikuji.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