R言語

R言語 マインスイーパー

  1. HOME >
  2. R言語 >

R言語 マインスイーパー

スポンサーリンク

こんにちは、usagi-sanです。

今回は、統計解析やデータ解析用のスクリプト言語であるR言語を用いてマインスイーパーを作成しました。

R言語は手続き型の言語であるため、クラスを定義することはほとんどありませんが、今回ゲームを作成するということでクラスを定義し、オブジェクト指向でスクリプトを書いてみました。

マインスイーパーは、次の画像のようにR言語のwindow上で遊ぶことができます。

マインスイーパ実行画面

マインスイーパーのプログラミングコードはこの記事の一番下でダウンロードできます

クラスの定義の仕方の勉強したい方や興味のある方は、是非是非ダウンロードしてください。

クラス mineSweeper

マインスイーパーのアルゴリズムや描画するメソッドなどから成るクラスmineSweeperを紹介します。

クラスmineSweeperは次のフィールドとメソッドから構成されています。

フィールド

  • n_row = "numeric"
  • n_col = "numeric"
  • n_bomb = "numeric"
  • df = "data.frame"
  • exploredTile = "data.frame"
  • flaggedTile = "data.frame"
  • gameEnd = "logical"
  • mode = "character"
  • remainingCells = "numeric"

メソッド

  • Initialize = function()
  • Start = function()
  • Explore = function(x,y)
  • GameStartPlot = function()
  • GamePlot = function()
  • MousePointer = function(x,y)
  • ConvertMode = function(x, y)
  • RemainingCells = function()

このクラスのインスタンスを生成し、メソッドをmain()で実行することで、マインスイーパーを実行することができます。

これらのフィールドメソッドの意味や役割は次で紹介していきます。

フィールド

n_row

マインスイーパーの行の数を指定する。ゲーム開始時に指定した行数がn_rowに代入されます。

n_col

マインスイーパーの列の数を指定する。ゲーム開始時に指定した列数がn_colに代入されます。

n_bomb

マインスイーパーの地雷の数を指定する。ゲーム開始時に指定した地雷の数がn_bombに代入されます。

df

マインスイーパーの盤面の地雷の位置や、接している地雷の数などの情報を格納するためのデータフレーム。接している地雷の数が1,2,3,4,...の場合dfには、対応する地雷の数が代入されます。また地雷は-1として表現されます。

exploredTile

探索済みの盤面を代入します。TRUEはすでに探索済みのセルであり、FALSEの場合は探索していないセルを表現します。TRUEの盤面のみがGUI上で描画されます。

flaggedTile

旗付きのセルを格納するデータフレーム。TRUEの場合、旗が付いていて、FALSEの場合、旗がついていないことを表現します。後述するmodeがflagのときにクリックしたセルに対応するflaggedTileがTRUEとなります。

gameEnd

ゲームが続いているか、終了しているかを表すlogical型の変数。

mode

探索するか、旗を付けるかを表すcharacter型の変数。modeがexploreの場合、選択したセルを探索します(セルを開ける)。flagの場合、選択したセルに旗を付けます。

remainingCells

未探索のセルの数を表すnumeric型の変数。

メソッド

Initialize

Initializeは、フィールドの変数を初期化するためのメソッドです。

インスタンスの生成後に、このメソッドを実行することで、フィールドの変数を初期化できます。

gameEnd、mode、remainigCells、df、eploredTile、flaggedTileなどの変数を初期化しています。

Start

Initializeで初期化したdfに盤面の情報を与えるメソッドです。

dfに地雷の数n_bombの数だけ、-1を代入し地雷の情報を与えます。

そのあとはdfの-1の位置を頼りに、-1に接している数をdfの各要素に代入していきます。

 Explore

マウスでクリックした座標をもとに、dfを探索していくメソッドです。

マインスイーパーの探索法と同様に、指定された座標x,yから再帰的に探索していきます。

1,2, . . . , 8まで探索し、探索後の座標はexploredTileの対応する座標にTRUEを代入し、return()を返し、探索を終了します。

GameStartPlot

マインスイーパーを開始したときのゲーム画面をplotで描画します。

マインスイーパーの盤面の格子や枠、exploreボタンやflagボタンの描画などをゲーム開始時に行います。

ゲームを開始した後はGameStartPlotではなく、次で紹介するGamePlotでゲームを描画していきます。

GamePlot

GamePlotは、マインスイーパーを実行中に、セルの選択やexploreやflagボタンを押した後に実行されるメソッドです。

盤面の情報が更新された後に、このメソッドを用いてGUI上の描画も更新していきます。

また画像ファイルを読み込み、ゲーム終了時のGame ClearやGame overなどの描画を行ったり、地雷の画像や旗の画像などを描画したりしています。

MousePointer

マウスの左クリックの座標を取得し、GUI上の[0, 1]の値をとる座標を対応する盤面の(x, y)座標に変換するメソッドです。

例えばGUI上では、x軸は0から1の値をとるように設定されています。フィールド中のdfやexploredTileの対応するx座標を得たい場合、x軸を、1から列の数に変換する必要があります。

ConvertMode

メソッドConvertModeは、ゲームモードをexploreやflagに切り替えます。

GUI上で左クリックした座標が、exploreボタンやflagボタンであった場合、そのボタンに対応するゲームモードに切り替えます

例えば、flagボタンがクリックされた場合、ゲームモードはflagに切り替わり、盤面に旗を設置できるようになります。

RemainingCells

メソッドRemainingCellsは、盤面に残っている地雷以外のセルの数を求めます。

メソッドGamePlotで、左下の残りのセル数を描画する際に、このメソッドで求めたセルの数が用いられます。

ゲームの開始方法

main()

ゲームを開始するには以下の関数main()を実行します。コンソール上でmain()と入力することで、ゲームを開始することができます。

 

main()を実行すると、マインスイーパーの行、列、地雷の数などをreadline()で入力した後に、mineSweeperクラスのインスタンスを生成し、各メソッドを動的に用いてゲームのシーンを描画しています。

ゲームの実行方法

マインスイーパーを実行するために、スクリプトファイル中のクラスmineSweeperと関数main()を読み込みます。

読み込んだ後は、コンソール上で次のようにmain()と実行しましょう

実行すると、盤面の行数、列数、地雷の数を入力を求められます。好きな数字を入力しエンターを押しましょう

エンターを入力すると、次の画像のようなwindowが起動します。

mineSweeper実行画面

盤面をクリックすることで、マインスイーパーを遊ぶことができます。

また、flagボタンがを押すことで、旗を置くことができます。flagを押した後はexploreボタンを押すと、探索モード(通常のモード)に切り替わります。

ゲームをクリアした後やゲームオーバーのとき、次の画像のようにwindow上にGame ClearやGame Overが表示された後に、コンソール上で"Do you wanto to Restart? Yes:1 No:0 "とゲームをリスタートするか質問されます。

mineSweeperゲーム終了

リスタートしたいときは1を、終了したいときは0を押してください。

マインスイーパーの実行方法は以上となります。

 

ダウンロード方法

今回、紹介したマインスイーパーは以下のダウンロードリンクから入手できます。

スクリプトファイル以外にもゲームで用いられるpngファイル等が含まれています。

是非是非ダウンロードしてください。

R言語でゲームを作成する際の参考にしてくれたら幸いです。

 

スポンサーリンク

  • この記事を書いた人
  • 最新記事

usagi-san

統計学とゲームとかをメインに解説していくよ。 数式とかプログラミングコードにミスがあったり質問があったりする場合はコメントで受け付けます。すぐに対応します。

-R言語
-,

© 2022 ウサギさんの統計学サロン Powered by AFFINGER5