ゲームの 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アドレスを取得する方法の詳細な説明

推薦する

JS は Web ページナビゲーションバーの特殊効果を実現します

この記事では、ネイティブ JS を使用して実装された実用的な Web ナビゲーション バー効果を紹介...

MySQL データベースにおける高同時実行性の問題を解決する方法

序文スタートアップ企業が最初はモノリシック アプリケーションを主要なアーキテクチャとして使用し、通常...

Linux7 ベースの Hadoop のインストールと構成の詳細なグラフィック説明

上記のように材料を準備します(ps: hadoop-3.1.2-srcはhadoop-3.1.2に変...

MySQL 作成ルーチン権限に関する注意事項

1. ユーザーにルーチン作成権限がある場合は、プロシージャ | 関数を作成できます。 2. ユーザー...

jsBridgeの動作メカニズムを1つの記事で学ぶ

目次js 呼び出しメソッドアンドロイド1.jsはネイティブを呼び出す2. ネイティブコールjs iO...

Linux nohup はプログラムをバックグラウンドで実行し、表示します (nohup と &)

1. バックグラウンド実行一般的に、Linux 上のプログラムは .sh ファイル (./sh フ...

Linux で履歴レコードを表示し、タイムスタンプを追加するためのヒント

Linux で履歴レコードを表示し、タイムスタンプを追加するためのヒントbashに詳しい人なら、hi...

mysql 5.7.20 win64 のインストールと設定方法

mysql-5.7.20-winx64.zipインストール手順のないインストール パッケージ: ht...

MySQL データ型の最適化の原則

MySQL は多くのデータ型をサポートしており、高パフォーマンスを得るには適切なデータ型を選択するこ...

Linux システムの .bash_profile ファイルの詳細な説明

目次1. 環境変数$PATH: 2. 環境変数を変更します。 3. bash_profileの目的要...

CentOS 6.6 ソースコードのコンパイルと MySQL 5.7.18 のインストールチュートリアルの詳細な説明

1. ユーザーとグループを追加する1. mysqlユーザーグループを追加する # グループ追加mys...

ウェブマスターが注目すべき、ウェブサイトのユーザビリティを向上させる 9 つのコード最適化のヒント

1. ロゴに代替テキストを追加するこれには 2 つの利点があります。スクリーン リーダーがロゴ画像の...

JavaScript フロー制御 (ループ)

目次1. forループ2. 二重の for ループ3. whileループ4. dowhileループ5...

ネイティブ JS カプセル化 vue タブ切り替え効果

この記事の例では、ネイティブJSカプセル化vueタブ切り替えの具体的なコードを参考までに共有していま...

MySQLクエリキャッシュの簡単な使い方の詳細な説明

目次1. クエリキャッシュの実装プロセス2. クエリキャッシュを構成する3. クエリキャッシュを有効...