2007/11/23(Fri) 13:32:27 編集(投稿者)
■No10667 (επιστημη さん) に返信
> 芋虫がこの世に生を受けたときの
> - どっち向いてるか
> - この世に境界があるならその境界と
> 芋虫の位置と
> をください。
>
> directionが東西南北で定義されているならどっち向いてるかは要りません。
> # 立方体の芋虫がパタパタ転がってくよなイメージね。
GetNextDirectionの返り血は次に芋虫がどちらに移動するか、で定義します。
前、右、左です。
右に行った時、芋虫は右を向きます。
左に行った時、芋虫は左を向きます。
与えられる配列worldは芋虫の向きに応じて回転して渡されます。
世界には境界はありません。
無限に進めますが、ループしています。
ですので、芋虫の初期の方向と位置は考慮しなくていいことになります。
ランダムに与えられていると思ってください。
もうちょっときちんとインタフェースを考えてみました。
namespace WormWorld {
public interface IWorm {
string Name { get; }
direction GetNextDirection( leafstate[] world );
}
public enum leafstate {
worm = -1,
leaf = 0,
hole = 1
}
public enum direction {
right = -1,
forward = 0,
left = 1
}
}
ターン制で動きます。
毎ターン1回GetNextDirectionが呼ばれます。
動いた結果、他の芋虫がいたら、両方とも死にます。
配列は芋虫の現在向いてる方向を上とすると
00 01 02 03 04 05 06
07 08 09 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 32 33 34
35 36 37 38 39 40 41
42 43 44 45 46 47 48
という感じで与えられて、
world[0]が左前方、world[6]が右前方、
world[42]が左後方、world[48]が右後方になります。
world[24]は常にwormになります。
実際に競技をするときは、適当な密度でwormが配置されるようにします。
統計性を高めるため、同じアルゴリズムの虫を複数配置しようと思っています。
メモリの消費量は今のところ制限を考えていません。
リフレクションしたりディスアセンブルしたりして他人の情報を覗くのは禁止です:D
一定時間してもGetNextDirectionから帰らない場合はそのまま飢え死にです。
どうでしょう?
だいぶ簡単なルールではないかと。