ウォーシミュレーションと呼ばれるジャンルで採用されるゲームでは六角形のマップを使うことが多いです。
こんなマップですね。
これをプログラムで実装するとして、どういう風にデータを持つかという問題があります。
ずれているのが厄介で、うまく表現することができません。
結局、この形が一番やりやすいだろうという結論に落ち着きました。
チェスのようなマップです。
白い部分だけを使って灰色の部分は使いません。
無駄なメモリが増えるように見えますが、座標の管理だけは上の図で行い、
実際にチップにデータは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;
}
}
こんな感じで、さっくり計算できます。