てくね のバックアップの現在との差分(No.5)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
#setlinebreak(on)
ここに書いてあるのは全部推測で、事実とは異なる場合があります
鵜呑みにしないでください

----

ユニットの移動ルーチン(目的地指令)
以前から気になっていた隊移動についても調べる
隊移動に関する不思議な挙動をあげていく

一言でまとめると
''&size(20){最短経路を索敵順で移動};''
-''挙動1'':同一ターンに何回隊移動させても、派遣位置は1回目の隊移動と2回目の隊移動以外の位置にはならない
 3回目の隊移動の派遣位置は1回目の隊移動の派遣位置と同じ、4回目の隊移動の派遣位置は2回目の隊移動の派遣位置と同じ
 5回目の隊移動の派遣位置は1回目の隊移動の派遣位置と同じ、6回目の隊移動の派遣位置は2回目の隊移動の派遣位置と同じ
 ...... 以下ループ
-''挙動2'':飛行・海上のユニットと海中のユニットを別の隊にして、同一ターンに同一の島にそれぞれ派遣すると、海中のユニットは(敵・味方問わず)飛行・海上のユニットの下に派遣される

1 指定したユニットと目的地の座標を取得
2 目的地の座標からその座標へ、何HEX離れているかを表した距離MAPを作成
----
上記の挙動が説明できるような隊移動のアルゴリズムを推測
艦隊1:飛行・海上ユニット
艦隊2:海中ユニット

距離MAPの例
''挙動1の発生原理''
-1回目の隊移動
 乱数によって艦隊1の派遣位置を(X1,Y1)に決定
 艦隊1を(X1,Y1)に派遣
-2回目の隊移動
 乱数によって艦隊1の派遣位置を(X1,Y1)に決定
 (X1,Y1)には既に艦隊1がいるため派遣不可
 再度乱数によって艦隊1の派遣位置を(X2,Y2)に決定
 艦隊1を(X2,Y2)に派遣
-3回目の隊移動
 乱数によって艦隊1の派遣位置を(X1,Y1)に決定
 2回目の隊移動で艦隊1は(X1,Y1)から(X2,Y2)に移動したため、(X1,Y1)に派遣可能
 艦隊1を(X1,Y1)に派遣
-4回目の隊移動
 ……以下ループ

&ref(http://hakojoy.net/~bbs/cgi/navyimg/img/1489.png);

※目的地から目的地への距離は0HEX
''挙動2の発生原理''
-艦隊1の隊移動
 乱数によって艦隊1の派遣位置を(X1,Y1)に決定
 艦隊1を(X1,Y1)に派遣
-艦隊2の隊移動
 乱数によって艦隊2の派遣位置を(X1,Y1)に決定
 (X1,Y1)には既に艦隊1がいるが、海中階層では派遣可能
 艦隊2を(X1,Y1)に派遣

3 ユニットの座標の距離を距離MAPから取得
----
乱数の発生について、仮説を立てる

&ref(http://hakojoy.net/~bbs/cgi/navyimg/img/1490.png);
''仮説1''
隊移動する際に乱数の初期化が行われている

ユニットから目的地への距離は2HEX
隊移動

乱数初期化

乱数による派遣位置決定

4 索敵順に周囲1HEXの距離を全て取得
''仮説2''
あらかじめ乱数によって派遣位置と順番を決めておき、隊移動する際は順番通りに決められた位置に派遣する

右上:距離3
右  :距離3
右下:距離2
左下:距離1
左  :距離2
左上:距離3
乱数発生

乱数による派遣位置配列作成

5 移動可能かつ、距離が一番近い(複数ある場合は取得した順、つまり索敵順)座標に移動する
隊移動

派遣位置配列を参照

派遣位置決定

このとき、距離が今よりも遠くなる場合は移動しない(同じ距離の場合は移動する)
----
仮説1と仮説2の違い

優先度一覧
左下:距離1
右下:距離2
左  :距離2
―――移動しない―――
右上:距離3
右  :距離3
左上:距離3
もし仮説1であれば、擬似乱数のseed値を特定すると乱数調整が可能になる
乱数調整ができると……
-''派遣位置を自由に決められる''
-''掘削数量1で必ず油田が見つかる''(高速掘削でも同様)
-''残骸売却で必ずクリスタルが見つかる''(どのクリスタルを発見するかも決められる)
-''全ての災害を操れる''(敵の艦隊に隕石を落とす等)

左下が移動可能なら左下に
左下が移動不可なら右下に
右下が移動不可なら左に
左が移動不可なら移動しない
仮説2であれば、擬似乱数のseed値を特定すると
-''派遣位置が事前に分かる''

左下が移動可能なので左下に移動
----
前回同様、ソースコードを読む

&ref(http://hakojoy.net/~bbs/cgi/navyimg/img/1491.png);
ターン消費無しの隊移動はhakojoy独自の改造

通常の隊移動のソースコードから推測

6 目的地に到着するか、移動力分の移動をするまで4~5を繰り返す
hako-turn.cgiに関数moveFleetを発見

----
	# 艦隊移動
	my($tx, $ty, $tLv);
	foreach $i (0..$tIsland->{'pnum'}) {
		$tx = $tIsland->{'rpx'}[$i];
		$ty = $tIsland->{'rpy'}[$i];
		$tLv = $tLandValue->[$tx][$ty];

おまけ 目的地が移動不可な場合
pnum,rpx,rpyの定義を探す
hako-main.cgiに関数makeRandomIslandPointArrayを発見

&ref(http://hakojoy.net/~bbs/cgi/navyimg/img/1493.png);
	# (0,0)から(size - 1, size - 1)までの数字が一回づつ出てくるように
	# $pnum($pointNumber)(@rpx, @rpy)を設定
	sub makeRandomIslandPointArray {
		my($island) = @_;

ユニットから目的地への距離1
		undef $island->{'rpx'};
		undef $island->{'rpy'};
		my(@rpx, @rpy, $map, @x, @y, $xsize, $ysize, $pnum);
		$map = $island->{'map'};
		@x = @{$map->{'x'}};
		@y = @{$map->{'y'}};
		$xsize = @x;
		$ysize = @y;
		$pnum = $xsize * $ysize;

右上:距離2
右  :距離2
右下:距離2
左下:距離1
左  :距離0
左上:距離1
		my($x);
		# 初期値
		@rpx = (@x) x $ysize;
		foreach $y (@y) {
			push(@rpy, ($y) x $xsize);
		}

優先度一覧
左  :距離0
左下:距離1
左上:距離1
―――移動しない―――
右上:距離2
右  :距離2
右下:距離2
		# シャッフル
		my($i, $j);
		for ($i = $pnum; --$i; ) {
			$j = int(rand($i+1)); 
			next if($i == $j);
			@rpx[$i,$j] = @rpx[$j,$i];
			@rpy[$i,$j] = @rpy[$j,$i];
		}

左が移動不可なので左下に移動
		$island->{'pnum'} = $pnum - 1;
		$island->{'rpx'} = \@rpx;
		$island->{'rpy'} = \@rpy;
	}

&ref(http://hakojoy.net/~bbs/cgi/navyimg/img/1492.png);
再び関数moveFleetを読む
……関数makeRandomIslandPointArrayの呼び出しは無し

ユニットから目的地への距離1
関数makeRandomIslandPointArrayの呼び出されている箇所を探す
hako-turn.cgiの関数turnMainで発見

右上:距離1
右  :距離2
右下:距離2
左下:距離2
左  :距離1
左上:距離0
		# 座標配列を作る
		foreach $i (0..$islandNumber) {
			$island = $Hislands[$order[$i]];
			makeRandomIslandPointArray($island);
		}

優先度一覧
左上:距離0
右上:距離1
左  :距離1
―――移動しない―――
右  :距離2
右下:距離2
左下:距離2
更新の最初に、島ごとに座標配列を作っている
この後、コマンドチェックが入るので''仮説2が正しいと推測''

左上が移動不可なので右上に移動
----
seed値の特定

&ref(http://hakojoy.net/~bbs/cgi/navyimg/img/1493.png);
hako-main.cgiで発見

以下ループ
	# 乱数の初期化
	srand(time() ^ ($$ + ($$ << 15)));

hako-main.cgiが実行される時間は決まっているため、一見するとseed値の特定は可能そうだが......
特殊変数$$はプロセスIDの値を持つため、seed値の推測は不可能

乱数を使って悪さはできない

----
どんな事ができるか

上記の通り移動しなかった場合
対象ユニット、対象座標、目標座標、そのときの状況を書いてください
-隊移動の派遣位置をループさせない

このぐらいしか思いつかない
----
意見や指摘
#comment(below)
- 目標を2HEXより遠くに設定した場合と、2HEXの場合で動き方に差があるか検証していただきたいです -- [[てくね]] &new{2013-02-10 (日) 16:21:02};
- 今確認しましたが結構バラバラに動いているようですね -- [[てくね]] &new{2013-02-10 (日) 16:19:35};
- 関係あるかわかりませんが、18,3には陸地、18,2には浅瀬がありました。索敵順通りなら19,2を経由すると思っていたのですが、誤解などありましたら教えていただきたいです。 -- [[葉月]] &new{2013-02-10 (日) 11:49:27};
- 〆【非公式】初心者~中級者指導用の『僕は神山満月ちゃん!!』(〆【非公式】初心者~中級者指導用:スパイダー工作艇)が(19, 1)から(18, 2),(19, 3)の順に移動(自動操縦)し到着しました。 対象座標が19,1で目標座標が19,3 -- [[葉月]] &new{2013-02-10 (日) 11:42:17};
- 前言ってたやつですねwwすげー!www -- [[なちゅらる]] &new{2013-02-10 (日) 07:19:16};
- オナニー乙wwwwwwwwwwwwwwwwwwwww --  &new{2013-02-12 (火) 21:49:41};

----
参照回数 &counter(total);