コンピュータ: 2014年12月アーカイブ

帰りの電車で考えて、やっと解決した。
さっきは六角形の位置情報を X, Y の 2軸で考えていたのが敗因だったな。

結局、

・各マスの位置を、X,Y,Z の 3軸で表現する。
・移動元と移動先の X,Y,Z の各差(絶対値)の中で一番大きな値を採用。

というやり方で最短距離が取れるわ。

20141216_masu2.JPG

ちょっとわかりづらいと思うが、上の写真を見てちょ。
(そのうち、Excel かなんかで綺麗にまとめる予定)

横の軸が X軸、左から右に降りていく軸が Y軸、右から左に降りていく軸を Z軸として、一番左上のマスに 1-8-1 という位置情報を与える。X=1,Y=8,Z=1 だ。

同じルールで、右下の方にある黄色いマスに位置情報を与えると 9-6-11 となる。X=9,Y=6,Z=11 の位置だ。

で、X,Y,Z の差をそれぞれ絶対値で求めると、8,2,10 となるよね。この中で一番大きな数字、つまり 10 がこの二点間の距離(マス数)なんだね。

逆方向もバッチリよ。
一番右上のマス(1-1-8)から、黄色いマス(9-6-11)までの距離(最短距離)は 8 である。
ほんじゃ、ホントに 8 になるか計算してみよう。Z,Y,Z の差の絶対値がそれぞれ 8,7,3 だから、バッチリ 8 で正解やん!

ふむふむ。これでどうにかなりそうやな。

Perl で書けばこんな感じ。

#!/usr/bin/perl

print "開始位置=";
$start = <STDIN>;
chomp $start;

print "終了位置=";
$end = <STDIN>;
chomp $end;

if ($start =~ /^(\d+)\-(\d+)\-(\d+)$/) {
($x1, $y1, $z1) = ($1, $2, $3);
}
else {
print "ERROR\n";
exit();
}

if ($end =~ /^(\d+)\-(\d+)\-(\d+)$/) {
($x2, $y2, $z2) = ($1, $2, $3);
}
else {
print "ERROR\n";
exit();
}

@dist = (abs($x1 - $x2), abs($y1 - $y2), abs($z1 - $z2));
@dist = sort {$a <=> $b} @dist;

print "最短距離=" . $dist[2] . "\n";

exit();

実行してみたら、ばっちり正しい距離が出た。

$ ./hex_dist.pl
開始位置=1-8-1
終了位置=9-6-11
最短距離=10

ふむ。じゃ、戦車戦ボードゲームサポートプログラム(笑)に実装するか。
例えば戦争もののシミュレーションゲームをやってる人であれば、ヘックスマップは馴染みがあるだろう。
あの、六角形のマス目が続くやつね。
そうそう。俺はドラクエも FF も全然やらないんだけど、昔の RPG ゲームなんかもヘックスマップやったよね。

ちょっと今、友人と戦車戦のボードゲームを楽しむために、そのサポートプログラム的なものを作ってる。
要は、ルールを覚えるのが面倒なので、パソコンに

・・・
「はい、カード引いて」
「どのカードを使う?」
「じゃあ、どの戦車でどの戦車を攻撃するの?」
「もう一回サイコロ振って、当たり判定して」

みたいに、ゲームの進行にそってやることを逐一教えてもらおうかと(笑)
いや、パソコンに操られているなんて思わないでほしい!(笑)要は、細かいルールを覚える暇があれば、戦略・戦術立案に使いたいということだ(笑)

その中で、「この場所の戦車で、あの場所の戦車を攻撃します」ってときにそれが射程距離内なのかどうかも判定させたい。
なにせ、戦車ごとに射程距離が違うから、それをいちいち調べては自分たちで判定するのも面倒だし。
そこで、マップ上のヘックス(六角マス)間のマス数(距離)の計算方法を考えてみた。
その距離がわからないと、当然、攻撃の射程距離内なのか?とか、1回のフェーズで移動可能な距離なのか?という判定できんからね。(まあ、自分たちで距離を数えて入力する方法であれば計算は必要ないんだけど。もしかしたら、座標位置をいちいち入力するより、そのほうが使い勝手もいいかもしれないんだけど(^^;)

とりあえず今考えているのは、六角形なので 60度/120度で交わる座標軸になってしまうんだけど、X軸、Y軸を引いて、その差分で計算する方法。

20141216_masu.JPG

このメモの写真(ホントにさっき色々考えながら書いたものなんで汚いんだけど(^^;すまん)を見てもらうとわかりやすいと思うけど、青い線が X軸、赤い線が Y軸だ。
こうすると、例えば 14 のマス(X=1,Y=4)から 32のマス(X=3,Y=2)間の距離は、X軸、Y軸のそれぞれの差の絶対値の足し算でいけるかなと。つまり、X軸の差の絶対値 2、Y軸の差の絶対値 2で、足し算すれば 4が距離。

合ってる(笑)

25(X=2,Y=5)から 11(X=1,Y=1)への距離は、1 + 4 で 5。これも合ってる!!
・・・いや、合ってない(^^; 4 にならんといかんのに・・・

25(X=2,Y=5)から 22(X=2,Y=2)への移動であれば、差の絶対値が X=0 と Y=3 だから 0 + 3 で 3 だ。あれ?これは合ってる。

この計算方法、いけた!と思ったのに、全然いけてないな(^^;
数学マスターからのご指摘・ご指導をお待ちしております。

よろちくび。

<追記1>
これ、一定方向に進む時しか正しい距離でないなあ。やり直し(^^;

<追記2>
正しい答えは、
というエントリーにて。

このアーカイブについて

このページには、2014年12月以降に書かれたブログ記事のうちコンピュータカテゴリに属しているものが含まれています。

前のアーカイブはコンピュータ: 2014年10月です。

次のアーカイブはコンピュータ: 2015年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら