【C#.NET】2048というゲームをさくっと作る

2021.11.08

CATEGORY : C#.NET プログラミング

こんにちは、あんみんどうふです。

2年ぐらい前に流行った「2048」というパズルゲームをC#.NETで作ってみたので紹介します。

前回のヨットはもう少しで完成するので近いうちに・・・。

2048とは

(画像元: https://github.com/gabrielecirulli/2048

4×4マスの中で同じ数字同士を足していき、2048が完成したらゲームクリア。

上、下、左、右の4方向に移動可能で、移動した方向へすべての数字が移動します。移動する量は1マスだけでなく、端まで移動します。
移動した際に同じ数字がぶつかることで足されます。例えば、44がぶつかると8になります。

移動する度に空いてる場所に2か4の数字が生成されます。これをどんどん足していき、「2048」を目指していくゲームです。

 

開発環境

いつも通りです。

  • Visual Studio 2019
  • C#.NET (.NET Core 3.1)

 

ゲーム画面

スコアと盤面だけでシンプルな感じにしています。方向キーで操作。

 

進めていく度に数字が大きくなり、足すのが難しくなっていきます。
盤面もかなり荒れてきました・・・。

 

盤面が全て埋まり、かつ隣接した同じ数字が無くなったら移動できないのでゲームオーバーです。2048まで増やすのはかなり根気が要ります・・・。

 

中身

全部だと長いので主要部分だけコード公開します。

静的フィールド(グローバル変数)

全メソッドで使う変数です。現在スコア、フィールド、1辺のマス数、ステータス。
今更ですけどメソッドの外の領域を「静的フィールド」っていうんですね、初めて知りました。

 

描画処理

各数字の色は1つ1つ定義しています。違和感なくグラデーション状に取得出来たらスマートだったのですが、技術が足りず。

 

移動処理

「入力した方向に空間があれば移動、なければそのまま」といった処理を列(行)数分ループすることで、端から端まで移動しています。
移動が終わると移動した方向と逆方向の端にランダムで2か4の数字が生成されます。訳あって原作と仕様が異なるポイントです。
(原作では方向関係なく空いてるマスのうちのランダム)

また、1つの行(列)に同じ数字が4つ並んでいる時、1回の移動で複数回加算されないようにちょっと工夫しています。(38~56行目)
一度の移動で加算される回数は各数字1回のみです。

例えば、2222の順に並んでいる状態で1回右へ移動すると0-0-44になるようにしています。(0-0-0-8では2回加算されているので×)

 

ゲームチェック

全マスチェックしてどこかのマスに2048が存在していればクリア、動けないようであればゲームオーバー。
(クリア後も高スコアを目指して継続することができます。通常時と同様、動けなくなるとゲームオーバーになります。)

 


 

以上です。全部で500行ぐらいのコードで収まりました。

今回の開発でこのゲーム初めてプレイしたんですけど、めちゃめちゃハマってしまいました。
テトリスしかり、どうもこういう単純なパズルゲームには沼にはまってしまうようで・・・。

また何か作ったら紹介します。それでは。