ゲームの Node.JS バージョンを作成する方法

ゲームの Node.JS バージョンを作成する方法

概要

今日は、Node.JS を使用して、シンプルで面白いじゃんけんゲームを紹介します。

ビルドプロセス

  • モジュールのインポート
  • 単純なじゃんけん動作コマンド、現在のゲーム数(ベスト 3)、スコア、コンピュータのランダム動作(じゃんけん/じゃんけん/紙)を定義します。
  • 関連する行単位の読み取りストリームを定義する
  • 画面をクリア
  • 起動プロンプト情報の印刷
  • ラインイベントをリッスンし、読み取られたストリーム(ユーザー入力)に基づいて、ユーザーがゲームを終了するか、移動するかを判断します。
  • クローズ イベントをリッスンします。3 つのゲームがプレイされた場合は、最終結果を出力します。それ以外の場合は、プロセスを直接終了します。
  • ルールに従ってスコアを決定するためのscoreRuleメソッドを定義する

関連API

まずは関連する API を見てみましょう。呼び出し順に API を理解すると、全体のプロセスが明確になります。

リードライン

読み取り可能なストリームからデータを行ごとに読み取ります

基本的な使い方

  • readline.createInterface() メソッドは、新しい readline.Interface インスタンスを作成し、関連付けられた入力読み取り可能ストリームと出力書き込み可能ストリームを定義します。出力ストリームは、入力ストリームの内容を読み取り、印刷プロンプトを出力できます。
  • `process.stdin` と `process.stdout` は、プロセスの読み取り可能ストリームと書き込み可能ストリームに対応します。
  • readline.close() メソッドは、インスタンスが終了し、入力ストリームと出力ストリームの制御が放棄されたことを示すために呼び出されます。ゲームオーバー ~
  • process.exit([code]) メソッド: ノード プロセスを終了します。code のデフォルト値は 0 で、正常に終了したことを示します。読み取り可能なストリームの読み取りであれ、インスタンスの完了イベントであれ、リッスンして何かを行う必要があります。そうでなければ、何の意味があるのでしょうか?
  • 行イベントのリッスン: 入力ストリームが行末入力 (\n、\r、または \r\n) を受信するたびに、それがトリガーされます。つまり、ノード コンソールで Enter キーまたは Return キーを押すと、読み取り可能なストリームによって受信された文字列を使用して、リッスン コールバック関数が呼び出されます。

チョーク

Chalk は、ノード端末用のスタイル ライブラリで、端末出力文字列の色、太字、非表示、背景色、その他のスタイルを変更できます。

const チョーク = require('チョーク')
const logText = chalk.green(`
こんにちは、一緒にゲームをしましょう!
`)
コンソール.log(ログテキスト)

クリア

画面クリアコマンド、ノードターミナルは画面をクリアし、現在のターミナルビュー表示をクリアします

これは最も使いやすい方法です。画面をクリアする必要がある場所で clear() メソッドを実行するだけです。

定数クリア = require('クリア')
クリア()

手順に関する追加情報

// 命令リストを定義します。
// プレイヤーが入力した指示が正しいかどうかを判断し、ここからコンピューターのランダム出力を取得します。const act = ['Scissors', 'Rock', 'Cloth']
// 読み取ったストリームに基づいてプレーヤーの入力情報を決定する
// 読み取りストリーム入力をリッスンする rl.on('line', function (input) {
 (入力 === '終了')の場合{
   // [quit] と入力した場合は close() メソッドを実行します rl.close()
 } そうでない場合 (act.indexOf(input) !== -1) {
   // 入力文字列が命令リスト内にある場合 // 対応するコンピュータ命令をランダムに生成します const idx = Math.floor((Math.random() * 3))
   ゲーマー = 行為[idx]
   // スコアリングルールに基づいてプレイヤーがスコアを獲得したかどうかを判定します。const curScore = scoreRule(input, gamer)
   // スコアを累計する score += curScore

   // このラウンドの情報を出力します。let win = curScore === 1 ? '今回はプレイヤーが勝ちます' : curScore === -1 ? '今回はコンピュータが勝ちます' : '同点です。偶然に違いありません'
   結果 = `
   ※ ※ ※ ※ ※ ※ ※ ※ ※ ※
   ラウンド ${num}:
   -------------------
   プレイヤーは${input}をプレイしました
   コンピューターが故障しました: ${gamer}
   ${勝つ}
   ※ ※ ※ ※ ※ ※ ※ ※ ※ ※
   `
   // ストリームに書き込んだ後、次のラウンドに進みます num++;
   console.log(結果)
   // 3ラウンドがプレイされた場合、close()メソッドを実行します。if (num > 3) {
     rl.close()
   }
 } それ以外 {
   // その他の入力は正しい入力プロンプトを出力します console.log(`
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   ゲームを続けるには、[チョキ]、[グー]、[パー]を入力してください
   ゲームを終了するには【quit】と入力してください。
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   `)
 }
})

完全なコード

// ストーン.js
定数 readline = require('readline')
定数クリア = require('クリア')
const チョーク = require('チョーク')

const act = ['はさみ', '石', '布']
数値を1とします
スコアを0にする
ゲーマー = ''
結果 = ''

定数rl = readline.createInterface({
 入力: process.stdin、
 出力: process.stdout
})

クリア()

const beginText = chalk.green(`
============================================

ゲームを始めるには、[チョキ]、[グー]、[パー]を入力してください
ゲームを終了するには【quit】と入力してください。

============================================
`)
コンソール.log(テキスト開始)

rl.on('line', 関数(入力) {
 (入力 === '終了')の場合{
   rl.close()
 } そうでない場合 (act.indexOf(input) !== -1) {
   const idx = Math.floor((Math.random() * 3))
   ゲーマー = 行為[idx]
   const curScore = scoreRule(入力、ゲーマー)
   スコア += 現在のスコア

   win = curScore === 1 ? '今回はプレイヤーが勝ちます' : curScore === -1 ? '今回はコンピュータが勝ちます' : '同点です、偶然に違いありません'
   結果 = `
   ※ ※ ※ ※ ※ ※ ※ ※ ※ ※
   ラウンド ${num}:
   -------------------
   プレイヤーは${input}をプレイしました
   コンピューターが故障しました: ${gamer}
   ${勝つ}
   ※ ※ ※ ※ ※ ※ ※ ※ ※ ※
   `
   数値++;
   console.log(結果)
   (数値>3)の場合
     rl.close()
   }
 } それ以外 {
   コンソール.log(`
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   ゲームを続けるには、[チョキ]、[グー]、[パー]を入力してください
   ゲームを終了するには【quit】と入力してください。
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   `)
 }
})

// プロセスの終了と終了をリッスンする rl.on('close', function () {
 (数値>3)の場合
   winText = score > 0 ? 「プレイヤーは最終的に勝利しました」 : score < 0 ? 「プレイヤーは結局負けました、いい加減にしてください」 : 「信じられない引き分け」
   コンソール.log(`
   ==========================
   このラウンドは終了しました。プレイヤーの合計スコアは ${score} です。
   ${winText}
   ==========================
   `)
 }
 プロセス終了(0)
})

関数スコアルール(プレイヤー、NPC) {
 // チョキ、パー // グー、チョキ // パー、グー if (player === npc) {
   0を返す
 }
 if ((プレイヤー === 'はさみ' && npc === '布')
   || (プレイヤー === '石' && NPC === 'はさみ')
   || (プレイヤー === '布' && NPC === '石')) {
   戻り値 1
 } それ以外 {
   -1を返す
 }
}

アイデアを出す

Node を学習する過程で、依存するモジュールや API がどんどん増えていきますが、これは間接的に npm ライブラリの威力を示すものでもあります。検索することで、必要な機能を見つけて使用することができます。 API の波に迷わないでください。必要なときに検索スキルを使用することを忘れないでください。

ここでの[じゃんけん]はとてもうるさい(見るのが耐えられないほど)ですが、私たちの学習プロセスはそのうるさいところから始まり、どんどん深く進んでいき、あなたの繊細な姿がきっとうるさいところの上に残されるでしょう。私について文句を言うのは大歓迎、ノードにさらに深く入り込むのは大歓迎、さあ~

以上がNode.JS版ミニゲームの書き方の詳細です。Node.JS版ミニゲームの詳細については、123WORDPRESS.COMの他の関連記事もご覧ください。

以下もご興味があるかもしれません:
  • Node.js を使用してコマンドライン ゲームを実装する方法
  • Nodejs は、複数の人が同時にオンラインでマウスを動かして小さなゲームを共有することを実現します。
  • Node.js を使用したマルチプレイヤー ゲーム サーバー エンジンの実装
  • Node.js リアルタイム マルチプレイヤー ゲーム フレームワーク
  • node.js はゲームのバックエンド開発に適していますか?
  • Nodejs でタイムドクローラーを実装する完全な例
  • NodeJSとブラウザにおけるこのキーワードの違い
  • Node.js の TCP 接続処理のコア プロセス

<<:  MySQL Installer Community 5.7.16 インストール詳細チュートリアル

>>:  DockerコンテナのIPアドレスを取得する方法の詳細な説明

推薦する

HTML入力ボックスの最適化により、ユーザーエクスペリエンスと使いやすさが向上します。

ユーザーエクスペリエンスと使いやすさを向上させるために、入力ボックスなど、Web ページでユーザーが...

JavaScript BOMの構成と一般的なイベントの詳細な説明

目次1. 部品2. BOMの構成2. ウィンドウオブジェクトの共通イベント1. ウィンドウ読み込みイ...

HTML マルチメディア アプリケーション: Web ページにフラッシュ アニメーションと音楽を挿入する

1. HTML_falshアニメーションでのマルチメディアの応用(WebページへのFlashアニメー...

YUM を使用して Linux (CentOS 7) に MySQL 5.7.18 をインストールする方法の詳細なチュートリアル

このプロジェクトでは MySQL を使用する必要があります。これまで Windows では常に確実に...

React で遅延読み込みを使用して最初の画面の読み込み時間を短縮する方法

目次使用インストールルーティングでどのように使用しますか?読み込み速度の比較最近、中間およびバックエ...

時点別のMySQLデータベース復旧実績

はじめに: 時間ポイントによる MySQL データベースの復旧どの企業にとっても、データは最も価値の...

LeetCode の SQL 実装 (184. 部門内で最も高い給与)

[LeetCode] 184. 部門最高給与従業員テーブルにはすべての従業員が保存されます。すべて...

Linuxにpipパッケージをインストールする方法

1. システムの Python バージョンに応じて、pip インストール パッケージをダウンロードし...

Vue3ライフサイクル関数とメソッドの詳細な説明

1. 概要いわゆるライフサイクル機能とは、特定の条件下で自動的にトリガーされる機能です。 2. VU...

テーブルのネストと境界の結合の問題に対する解決策

【質問】外側のテーブルと内側のテーブルがネストされていて、内側のテーブルと外側のテーブルの両方に境界...

LinuxにVSCodeをダウンロードしてインストールし、プログラミングを使用して現在の時刻を出力する

rpmコマンドがソフトウェアのインストールに使用するパラメータはどれですか: -i rpm コマンド...

MySQL データベース面接に必須の 3 つのログの紹介

目次1. redo ログ (MySQL ストレージ エンジン InnoDB のトランザクション ログ...

両端揃えレイアウトを実現する CSS 列のサンプルコード

1. 堂々巡りいろいろ試行錯誤した結果、均等割り付けレイアウトを実現する最も簡単な方法は CSS ...

etcd クラスターをデプロイするための docker-compose の実装手順

目次docker-compose.ymlを書くdocker-composeを実行するビルドステータス...

スキン効果を実現するJavaScript(背景の変更)

この記事では、スキン変更効果を実現するためのJavaScriptの具体的なコードを参考までに紹介しま...