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

推薦する

Vue の高度な構築プロパティの詳細な説明

目次1. ディレクティブカスタムディレクティブ2. ミックスイン3. 継承を拡張する4. 提供して注...

Tcl言語に基づくシンプルなネットワーク環境を構成するプロセスの分析

1. Tclスクリプトファイルcircle.tclコードコメント #シミュレーションに必要なプロパテ...

Vue3でカルーセルコンポーネントをカプセル化する方法

目的カルーセルコンポーネントをカプセル化して直接使用します。具体的な内容は以下のとおりです。一般的な...

html5 の新しいメソッドを使用して JavaScript で要素クラス名を操作する方法の詳細な説明

目次1. classList属性2. 実用化以前の JavaScript では、最初にクラス属性を取...

Docker に influxdb をインストールするための詳細なチュートリアル (パフォーマンス テスト)

1. 前提条件1. プロジェクトが展開されました2. Dockerはすでにインストールされている2...

Linux (Ubuntu) での MySQL 5.7.17 のインストールと設定のチュートリアル

序文以前、MySQL 5.6 をインストールしました。3 か月後、開発者から MySQL で JSO...

Linux でのスケジュールされたタスクと遅延タスクの詳細な説明

で+ 時間 17:23に at> touch /mnt/file{1..9} ##アクションを...

HTMLで下線を設定するには?HTMLでテキストに下線を付ける方法

HTML で下線を引くには、以前はテキストを <u></u> タグで囲む必要...

HTMLはWEB標準の開発の中心的な基盤です

HTML 中心のフロントエンド開発は、ほぼ Web 標準の意味です。共通しているのは「分離」という考...

DIV+CSS命名規則の詳細な説明はSEO最適化に役立ちます

1. CSSファイルの命名規則提案: 文字、_、-、数字を使用します。文字で始まる必要があり、純粋な...

Vue の computed と watch の違いを分析する

目次1. 計算入門1.1、getとsetの使い方1.2. 計算された属性キャッシュ2. 時計の紹介3...

WebpackはCSSファイルを読み込み、その設定方法

webpackはCSSファイルとその設定をロードします複数の CSS ファイルを作成した後、HTML...

Vue はシームレスなカルーセル効果を実現

この記事では、シームレスなカルーセル効果を実現するためのVueの具体的なコードを参考までに紹介します...

Nginx tp3.2.3 404 問題の解決

最近、Apache を nginx に変更しました。TP プロジェクトを実行に移すと、404 エラー...

MySQLデータベースの基礎知識

目次1. データベースを理解する1.1 データベースとデータ構造の関係1.2 なぜデータベースが必要...