Skip to main content

第1回 倉庫お片付けゲーム(コスコマン)を作る

第1回 倉庫お片付けゲーム(コスコマン)を作る

これから、**倉庫お片付けゲーム「(コスコマン」**) を作ります。

コスコマンは、倉庫の中にある荷物を押して、決められたゴールへ片付けていくパズルゲームです。

コスコマンの基本ルールコスコマンの基本ルール

今回はまだプログラムを書きません。まず、どんなゲームを作るのかを見ていきましょう。


1.どうして「コスコマン」?

名前の元になっているのは、倉庫型のお店として有名なCOSTCOです。

日本では「コストコ」と呼ばれていますが、英語での発音をカタカナへ無理やり近づけると「コスコ」に近く聞こえます。

そこで、倉庫の中で荷物を片付ける人を、今回はコスコマンと呼ぶことにします。

ちなみにIKEAも、日本では「イケア」と呼びますが、英語圏(アメリカ限定)では「アイキア」に近い発音で呼ばれることがあります。外国の会社名や製品名は、日本で定着した読み方と現地での読み方が違うことがあります。ゲームを作っていると海外の技術資料や製品名に触れることも多いので、こういう違いも少し面白いところです。


2.元になっているのは「倉庫番」

コスコマンは、いわゆる倉庫番タイプのゲームです。

ルールはとても単純です。

コスコマンを動かす
        ↓
荷物を押す
        ↓
すべての荷物をゴールへ置く
        ↓
クリア!

単純なのですが、実際に遊ぶとかなり頭を使います。

理由は、荷物を押すことはできても、引っ張ることはできないからです。

例えば、荷物を部屋の角へ押し込んでしまうと、

#####
#$  #
# @ #
#####

荷物の反対側へ回り込めなくなり、もう動かせなくなる場合があります。

つまり、

今、この荷物を押せるか?

だけでなく、

押したあと、自分は次にどこへ回り込めるか?

まで考える必要があります。

少ないルールから、考えることがたくさん生まれるのが倉庫番の面白いところです。 また、これを拡張して、荷物を戻せたり(Undo機能)いろいろな機能を追加したバージョンもあったりします。単純ながら頭を使う楽しさを体験できる良いルールです☺


3.コスコマンの操作

コスコマンはWASDキーで上下左右へ1マスずつ動かします。(アローキーにすればよかったなぁ、アローキーにしたい人は自分で変更してみて)

        W
        ↑
   A ← @ → D
        ↓
        S

床やゴールの上は歩けます。

壁は通り抜けられません。


4.荷物は押して動かす

コスコマンの隣に荷物があり、その先が空いていれば荷物を押せます。

押す前

@  $  空き床

右へ進むと、

押した後

空き床  @  $

になります。

コスコマンが荷物のあった場所へ進み、荷物は同じ方向へ1マス動きます。

荷物の先が壁なら押せない

@  $  #

荷物の先が別の荷物でも押せない

@  $  $

2個まとめて押すことはできません。

荷物は引っ張れない

荷物を左へ動かしたければ、コスコマン自身が荷物の右側へ回り込み、左へ押す必要があります。

この「回り込める場所を残しておく」という考えがパズルになります。


5.全部の荷物をゴールへ運ぶ

ゴールは、荷物を片付ける場所です。

荷物        ゴール

 $            .

荷物がゴールの上へ乗ると、その荷物はゴールへ運べたことになります。

ただし、一度ゴールへ置いた荷物も、必要ならもう一度押して動かせます。

すべての荷物がゴールへ乗ればステージクリアです。

コスコマン自身がゴールの上に立っただけではクリアになりません。


6.最初は文字だけで作る

最終的には画像を使って、コスコマンや荷物を表示します。

でも、最初は次のような文字だけでゲームを作ります。

##########
#        #
#   .    #
#   $    #
#   @    #
#        #
##########

文字の意味は次の通りです。

文字 意味
床
# 壁
. ゴール
$ 荷物
@ コスコマン
* ゴールの上にある荷物
+ ゴールの上にいるコスコマン

この記号の並びは、倉庫番系のステージデータで昔から使われてきた表現に近いものです。

例えば、

押す前          押した後

#   .    #      #   *    #
#   $    #  →   #   @    #
#   @    #      #        #

のように、荷物がゴールへ乗ると*で表します。

盤面の「今」を1つのMapにまとめる

実際のプログラムでは、この記号に対応する数字を、Mapの中にある二次元配列へ入れます。

Mapの1マスは、そこが床なのか、壁なのか、ゴールなのか、荷物やコスコマンがいるのかという、その場所の現在の状態を表します。

ここで考えたいのが、荷物やコスコマンがゴールの上へ乗った場合です。

.  ゴール
+  ゴール上のコスコマン
*  ゴール上の荷物

今回は、+や*のように、2つのものが重なった状態にも専用の値を用意する方針で作ります。

そのため、移動はコスコマンや荷物の座標だけを動かすのではなく、Mapのマスを別の状態へ書き換える処理になります。

ゴール → ゴール上のコスコマン → ゴール
ゴール → ゴール上の荷物       → ゴール

ゴールから移動したあとは、元のマスが再びゴールへ戻ります。

プレイヤーの位置、荷物の位置、床やゴールを別々のデータで管理する方法もあります。しかし、別々に持つと、移動のたびに関係するデータを一緒に更新しなければなりません。片方だけを書き換えると、表示と判定が食い違う原因になります。

盤面上の状態を1つのMapへまとめておけば、Mapを見るだけで現在の盤面が分かります。画面表示、移動できるかの判定、荷物押し、クリア判定も、同じMapをもとに考えられます。

今は「この方針で作る」ということだけ覚えておいてください。重なった状態を実際にどう書き換えるかは、ゴールや荷物の処理を作るときに詳しく扱います。 (ちなみにこの表現方法は、Unixなどで流通していたフリーソフト(今でいうOSSかな)XSOKOBANの表記方法です。興味ある人は調べてみてください。


7.文字だけのゲームは昔からある

今のゲームでは、キャラクターも背景もきれいな画像で表示されるのが普通です。

しかし、昔からコンピュータでは、文字そのものを地形やキャラクターとして使うゲームがたくさん作られてきました。

有名なものには、**Rogue(ローグ)やNetHack(ネットハック)**などがあります。

@   プレイヤー
#   壁
.   床

画面には記号しか出ていなくても、遊んでいる人は、

@が自分で、#の向こうには行けない

と理解できます。

グラフィックがなくても、

  • マップがある
  • プレイヤーが動く
  • 壁で止まる
  • 荷物を押す
  • 条件を満たすとクリアになる

というルールが動けばゲームになるわけです。


8.どうして半角文字を使うの?

全角文字を使って、

人 箱 壁 床

のように表すこともできます。

ただし、文字コードやフォントの違いによって、別のPCで文字化けしたり、幅がずれたりすることがあります。

そこで今回は、

@  $  #  .  *  +

という半角記号を使います。

1マスを1文字として扱いやすく、ステージの形も追いやすいからです。


9.ゲームの仕組みを作ってから見た目を付ける

まず、文字だけで最後まで遊べるゲームを作ります。

文字でステージを表示
        ↓
コスコマンを動かす
        ↓
壁・ゴールを判定
        ↓
荷物を押す
        ↓
クリアできる

そのあとで画像や音を追加します。

2部構成2部構成

文字でゲームのルールを完成
        ↓
画像へ置き換える
        ↓
滑らかに動かす
        ↓
効果音とBGMを付ける
        ↓
TITLE / PLAY / CLEARを付ける

ゲームの中身を先に作っておけば、見た目を変えても、移動や当たり判定の処理を使い続けられます。

今回使うMapを画像で描くと、最終的には次のような表示になります。

Mapデータをスプライトで描画Mapデータをスプライトで描画

次回は、まずMapを作って、文字のステージをDxLibの画面へ表示します。