面白そうな動画をみたのでC#で作ってみることにしました。スネーキーというレトロなゲームを作ります。

元ネタの動画は下の動画です。

フィールドをつくる

最初につくるべきは自機(というか自蛇?)かもしれないのですが、後回しにして先にフィールドを描画します。通路の交差する点の座標を配列にいれておきます。

フィールドを描画する

最初にフィールドを描画するメソッドをつくります。背景は黒にして通路はライトグレーで描画します。配列 BranchXとBranchYの最大値と最小値を使うと碁盤の目のような通路を描画することができます。30ピクセルの幅で直線を描画すると隅がうまく直角にならないので別の矩形を描画することで調整しています。

その座標は交差点かどうか?

自機と敵は通路に沿って移動し、通路の交差点で進行方向を転換できます。そのときそのキャラクタが存在する座標は交差点なのかどうか、その座標に近い交差点はどこかを知る必要があるので、これを求めるメソッドをつくります。下記のメソッドは引数の値から一番近いX座標またはY座標を返します。

敵を生成する

次に敵を描画します。敵の動きはUターンはしない、停止せずに移動し続けるものとします。自機の位置関係から移動方向を変えるアルゴリズムは実装しません。

自機は敵に正面からぶつかると敵を倒すことができますが、それ以外の方向から衝突されるとミスとなります。また自分自身にかみついてしまった場合もミスとなります。

まず移動方向を管理するための列挙体をつくります。

敵の初期化

敵は内部が塗りつぶされた円とし、半径は15ピクセル、位置は現在位置の中心座標で管理することにします。方向転換のとき、どの方向に変更するかを乱数で決めるので静的変数としてRandomオブジェクトを生成しています。RandomオブジェクトをそれぞれのEnemyオブジェクトごとに生成すると、それらは同じ疑似乱数しか生成しないので生成するRandomオブジェクトはひとつだけにします。

コンストラクタでは初期のXY座標をCenterプロパティにセットします。敵の初期座標はフィールドの交点とし、移動方向もランダムに決めてしまいます。

敵を移動させる

敵を移動させる処理ですが、進行方向に1ピクセルだけ移動させます。またフィールドの交点に存在する場合は進行方向を変更できる方向のなかからひとつをランダムに選択します。

敵の中心座標が交点である場合(または最接近している場合)、方向転換をします。Uターンはしないので現在の進行方向が「上方向」である場合、候補として「下方向」はあり得ないことになります。またフィールドの上端、下端、左端、右端のときもそれ以上端へは進行できません。

移動できる方向を絞り込むことができたら乱数で新しい進行方向を決定します。

あとは敵をまとめて処理します。これはすべての敵を移動させるメソッドです。

敵を描画する

これはすべての敵を描画するメソッドです。

敵を新しく追加するメソッドやゲーム開始時やステージクリアのあとなどに初期化するメソッドも必要です。

敵全体の初期化と追加