Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

C++とかC#とか数学ネタを投下していく予定です。

[その他のページ]
日々の四方山話を綴った日記出水の日記帳

書庫

日記カテゴリ

[アルゴリズム]六角対応

ウォーシミュレーションと呼ばれるジャンルで採用されるゲームでは六角形のマップを使うことが多いです。
こんなマップですね。

これをプログラムで実装するとして、どういう風にデータを持つかという問題があります。
ずれているのが厄介で、うまく表現することができません。

結局、この形が一番やりやすいだろうという結論に落ち着きました。

チェスのようなマップです。
白い部分だけを使って灰色の部分は使いません。

無駄なメモリが増えるように見えますが、座標の管理だけは上の図で行い、
実際にチップにデータはxの値を半分にして取得すれば問題ありません。
こんな感じですね。

int getData(int x, int y){
  return data[x / 2][y];
}

黒い部分か白い部分かの判定は、xとyの座標を足し、奇数か偶数かでみればよいでしょう。
上の図の場合、偶数ならおける場所、奇数ならおけない場所です。

また、移動する場合もxとyの移動量を足して偶数になっていることをチェックすればいいでしょう。
奇数になっている場合は、上の図の黒い部分に入ってしまうため、移動できません。

さて、移動です。

このように6方向に進むことができます。
実際のヘックスも6方向に動けるので一致します。

そして、距離の求め方です。

距離はこのような図になります。
この図では結構複雑な式になりそうですが、実はそれほど難しくありません。

紫と橙の部分に分けています。
このとき、紫の領域はxとyの絶対値を足して2で割った値、
橙の部分は、単純にyの絶対値です。
ソースで書くとこうなります。

int distance(int dx, int dy){
  int ax = abs(dx);
  int ay = abs(dy);
  if (ax < ay){
    /* Yの移動量が多い場合 */
    return ay;
  }else{
    /* Xの移動量が多い場合 */
    return (ax + ay) / 2;
  }
}

こんな感じで、さっくり計算できます。

投稿日時 : 2009年6月26日 20:48

Feedback

# [アルゴリズム]とらいあんぐるはーど 2009/06/28 2:15 Garbage Collection

[アルゴリズム]とらいあんぐるはーど

# re: [アルゴリズム]六角対応 2009/06/29 13:40 なぎせ

もうひとつの方法としては
□□□□□
□□□□□
□□□□□
□□□□□
といった座標系をとる方法ですね。
どっちがいいのかいまだに結論を出せないでいる。

# re: [アルゴリズム]六角対応 2009/06/29 14:07 なぎせ

うわ。図示しようにもスペースが潰れちゃうか。
平行四辺形のような座標系といえば分かりますかね。

タイトル
名前
Url
コメント