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

推薦する

Ubuntuがネットワークに接続できない場合の解決策

仮想マシン内の Ubuntu がネットワークに接続できない場合の効果的な解決策: 1. Ubuntu...

MySQL 集計関数のネストされた使用操作

目的: MySQL 集計関数のネストされた使用集計関数は直接ネストできません。例: max(coun...

PHP 開発環境の構築に関する win10 docker-toolsbox チュートリアル

画像をダウンロード docker プル mysql:5.7 docker pull php:7.2-...

停止したすべてのDockerコンテナを1つのコマンドで再起動する

停止したすべてのDockerコンテナを1つのコマンドで再起動するdocker ps -a | gre...

WeChatミニプログラムマップの使い方を詳しく解説

この記事の例では、WeChatアプレットマップで使用される具体的な実装コードを参考までに共有していま...

HTML の title 属性を正しく使用するためのヒント

コンテンツを携帯電話、タブレット、支援技術のユーザーから非表示にし、キーボードのユーザーにのみ表示す...

Linux の操作とメンテナンスの基本システムディスク管理チュートリアル

1. ディスクパーティション: 2. fdiskパーティションディスクが2 TB未満の場合はfdis...

CSS を使用して物流の進行状況のスタイルを実装するためのサンプルコード

効果: CSS スタイル: <スタイル タイプ="text/css">...

CSS3プロパティline-clampはテキスト行の使用を制御します

説明: ブロック要素に表示されるテキストの行数を制限します。 -webkit-line-clamp ...

Docker での Redis の永続ストレージの詳細な説明

この章では、dockerの下にあるSpring BootプロジェクトでRedisを操作し始めます。準...

Linux で文字化けしたファイルや特殊文字のファイルを削除する方法

エンコーディングの理由により、Linux サーバーに中国語のファイルやディレクトリをアップロードまた...

優れたグラフィックデザイナーが習得すべき7つのスキル

1》ウェブデザインが得意であること2》Webページのデザイン方法を知る3》計画する4. SEOを理解...

すべてのブラウザとの完全な互換性を実現するために最適なプリセットを選択してください

各ブラウザの select タグのプロパティと各ブラウザのサポートが多少異なるため、各ブラウザでの選...

よく使われるJavaScript配列メソッド

目次1. フィルター() 2. 各() 3. いくつか() 4. すべて() 5. 減らす() 6....

CSS で高さが不明な垂直中央揃えを実装する

この記事では主に、高さが不明な垂直方向の中央揃えを CSS で実装する方法を紹介し、皆さんと共有しま...