Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】How to Build a Minesweeper CLI Game in Node.js (Part 2/3)

2025年09月25日に「Dev.to」が公開したITニュース「How to Build a Minesweeper CLI Game in Node.js (Part 2/3)」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Node.jsでマインスイーパCLIゲームの第2部。前回の基本機能に続き、ターミナルUIの整備、ゲームループ、マス開示(r)/フラグ設定(f)のコマンド入力、入力検証、そして勝利・敗北判定を実装。これにより、コマンドラインで遊べるマインスイーパが完成した。

ITニュース解説

この記事では、Node.jsを使ってコマンドラインインターフェース(CLI)版のマインスイーパーゲームを完成させる方法を解説する。前回の記事では、ゲームの核となるグリッドの生成、地雷の配置、そして各マスに隣接する地雷の数を計算する部分を構築した。今回は、これらの基盤の上に、実際にプレイヤーが操作できるゲームとしての機能を追加していく。具体的には、ターミナル上での見やすい画面表示、ゲームの進行を制御するループ、ユーザーからの入力を受け取って解析する仕組み、入力の誤りをチェックする機能、そしてゲームの勝敗を判定するロジックを実装する。

まず、ゲームの開始時に画面を準備する「ゲームループのセットアップ」から始める。プレイヤーがゲームを始める前に、画面をきれいに表示し、操作方法を伝える必要がある。このため、ターミナル画面をクリアする関数、ゲームの遊び方を説明するウェルカムメッセージを表示する関数、プレイヤーに次の入力を促すプロンプトを表示する関数が用意される。特に重要なのは、ゲームの盤面であるグリッドを整形して表示する関数だ。この関数は、グリッドの各マスの状態(まだ開いていないマスは「■」、数字は開かれた安全なマス、旗を立てたマスは「⚑」、地雷を踏んだマスは「*」)を適切に表現し、上部に列番号、左側に行番号を表示して、プレイヤーがマスの位置を把握しやすいようにする。これらの初期設定の関数を順番に呼び出すことで、ゲーム開始時の準備が整い、プレイヤーは最初の盤面とプロンプトを目にすることになる。

次に、「ユーザー入力の読み込みと解析」の段階に移る。ゲームを進行させるためには、プレイヤーからの入力(どのマスをどう操作するか)を受け取って理解する必要がある。Node.jsでは、process.stdin.on('data', ...)という仕組みを使うことで、プレイヤーがキーボードで入力し、エンターキーを押したときにそのデータを受け取ることができる。受け取った入力データは、まず文字列に変換され、不要な空白や改行が取り除かれて整形される。その後、その入力が「rROW,COL」(マスを開く)または「fROW,COL」(旗を立てる/外す)という形式に沿っているかを検証する。この検証には「正規表現」というパターンマッチングの技術が使われる。もし入力が正しい形式でなければ、「無効なコマンド」というエラーメッセージを表示し、再度グリッドとプロンプトを表示してプレイヤーに再入力を促す。入力形式が正しければ、入力された文字列からコマンド(rまたはf)、行番号、列番号を抽出し、それぞれ数値に変換する。さらに、抽出された行番号と列番号が、実際にゲーム盤面の範囲内にあるかどうかもチェックする。範囲外のマスを指定された場合は、「無効なマス」というエラーメッセージを表示して、同様に再入力を促す。

そして、「コマンドの実行とゲーム状態の更新」の段階で、プレイヤーのコマンドに応じてゲームの状態が変化する。 「rROW,COL」コマンド、つまりマスを開くコマンドが入力された場合、まず対象のマスが「開かれた」状態に設定される。もしそのマスにすでに旗が立てられていた場合、旗は取り除かれ、使用可能な旗の数が一つ増える。その後、ターミナル画面をクリアし、更新されたグリッドを再表示する。もし開かれたマスが地雷であった場合、ゲームは「ゲームオーバー」となり、プログラムは終了する。地雷でなかった場合は、全ての安全なマスが「開かれた」状態になったかどうかをcheckRevealedSquares関数で確認し、全て開かれていれば「勝利」メッセージを表示してプログラムを終了する。 「fROW,COL」コマンド、つまり旗を立てる/外すコマンドが入力された場合は、少し複雑なロジックが適用される。まず、現在利用可能な旗の数を管理するflagsという変数が用いられる。もしプレイヤーが旗を立てようとしているのに、利用可能な旗が残っていない場合、「旗がありません」というエラーメッセージが表示される。対象のマスにすでに旗が立てられていた場合、その旗は取り除かれ、利用可能な旗の数が一つ増える。まだ開かれていないマスに旗を立てようとした場合、そのマスに旗が立てられ、利用可能な旗の数が一つ減る。この操作の後も、ターミナル画面をクリアし、更新されたグリッドを再表示する。この際、全ての地雷が正しく旗で示されているか、または全ての安全なマスが開かれているか(どちらかの条件で勝利となる)をcheckFlaggedMines関数とcheckRevealedSquares関数で確認し、条件を満たしていれば「勝利」メッセージを表示してプログラムを終了する。

これらのステップを通じて、プレイヤーからの入力を受け付け、盤面を更新し、勝敗を判定しながらゲームを進行させる、完全にプレイ可能なマインスイーパーのCLIゲームがNode.jsで構築される。これにより、グリッドの生成や地雷の配置といった基本的な機能に加え、実際にゲームとして楽しめるインタラクティブな要素が加わったことになる。次のパートでは、プレイヤーのスコアやプレイ時間などをファイルに保存し、「ハイスコア」画面を実装することで、ゲームにさらなる深みとやりこみ要素を追加する予定だ。

関連コンテンツ

関連IT用語

関連ITニュース