牧場アプリを作りたいと思っております。
ざっくり仕様的には
・平面上100X100マス
・小屋とか木、バケツ、牛、馬などのアイテムを100X100マス以内に自由に配置できる
・各アイテムは縦横何マス使うか定義してある
・アイテムが正方形長方形の場合は基点を左下とし、横は右方向、縦は上方向に大きくなるとする
・マスが被る場合はそこに新たにアイテムは置けない
です。
これを実現するテーブルの構造を考えました。
間違っているとか、こうした方が良いとかありましたらアドバイスいただけますでしょうか?
(とりあえずアイテムの配置の記憶と判定をどうするかのみで、グラフィックとかそういうのはここでは考えません。)
ユーザーテーブルusers:
id(int 主キー)
name(varchar)
アイテムテーブルitems:
id(int 主キー)
name(varchar)
vertical(int) 縦方向に何マス分使うか
horizontal(int) 横方向に何マス分使うか
ユーザーとアイテムの中間テーブルitems_users:
id(int 主キー)
user_id(int)
item_id(int)
x(int) あるユーザーの牧場のあるアイテムが置いてあるx座標
y(int) あるユーザーの牧場のあるアイテムが置いてあるy座標
テーブルの設計は以上です。
そして問題は、新しいアイテムをそこに置けるかどうかの判定ですが、
x:アイテムを置こうとしているx座標
y:アイテムを置こうとしているy座標
h:置こうとしているアイテムの横の長さ
v:置こうとしているアイテムの縦の長さ
とするとき、
1.100X100マスからはみ出してないかの判定
x+h > 100 または y+v > 100 のときは置けないと判定
2.置こうとしているアイテムが、既に配置してあるアイテムと被ってないかの判定
まず、配置してある全てのアイテムの座標と縦横の長さを元に、100X100マス中どこが使われているか表す配列を定義する。
下記のような感じです。
itemCoordinate = {
x: [1,2,3,4,10,11],
y: [1,2,3,4,10,11,12,13]
}
そして、
置こうとしているアイテムの(x,y), (x+h, y), (x, y+v), (x+h, y+v)の範囲の全てのxy座標を算出して
それがitemCoordinateに1つでも含まれているならば置けないと判定
1.と2.がfalseなら置けると判定してそこにそのアイテムを置く。
置いたらitems_usersに登録してitemCoordinateも更新。
長くなりましたが以上となります。
ちょっと2.がよくわからなくなってきました。
ご意見いただければ大変ありがたいです。
よろしくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。