これは as3 と FlashPunk で書かれています。
私の問題?4 方向に 4 タイルを移動できる戦車があります。北、南、東、西。
画像はhttp://www.aroderick.com/isolatedTiles.jpgにあります。
正方形のグリッド (画像では灰色) から始めて、配列を使用して正方形のグリッドから菱形のパターン (画像では赤) をマークしました。これは、タンクが移動できることを考えると、すべての可能な移動の選択肢です。 4方向に4スペース。画像に数字が付いているタイルは、ゲームで実際に表示されるタイルです。数字は「列の列」の数字です。
もう少し複雑なのは、障害物 (水、木、山) があるダイヤモンドからタイルを削除したことです。これにより、障害物を越えてタイルに到達するための移動コストが増加します。
この時点で、これは A* アルゴリズムに基づいており、移動に A* を使用していますが、これらは移動先のタイルを選択する前に確立する必要がある移動の選択肢です。
私の問題は、タンクの移動能力を超えており、タイルが結合されて A * の完全なパスを作成し、タンクをあるタイルから次のタイルに移動できる主な移動領域から独自に分離されている孤立したタイルです。
これらの不正なタイルに対処する (取り除く) シンプルでエレガントな方法はありますか?
私はルールのシステムを試しました。
//same row going east
if(ob.row == co.row && ob.row == startNode.row && ob.col < co.col && ob.col > startNode.col && ob.c < co.c )
{
extraCost = co.c;
reason = 1;
break;
}
//same row going west
else if(ob.row == co.row && ob.row == startNode.row && ob.col > co.col && ob.col < startNode.col && ob.c < co.c )
{
extraCost = co.c;
reason = 2;
break;
}
ここで、「c」は、カラスが飛ぶときのタイルの動き「コスト」を表すプロパティです。しかし、これらは解決するのと同じくらい多くの問題を生み出すようです。
//reusable tile grid
public static function makeTileGrid(entityLoc:Point,moveGrid:Array,travelMax:int,tsize:int = 64):Array
{
//node list
var nodeLst:Array = [];
//counter
var tileCount:int = 0;
//for tile naming
var co_ordX:String = "";
var co_ordY:String = "";
if(moveNode == null) var moveNode:Object;
//subtract the tile range from the current location
//tile range times two because you can go forewards
//or backwards tRange spaces
for (var col:int = travelMax * 2; col >=0;col--)
{
//placeX is an x value so you must multiply both row and tRange by the tile width
var placeX:Number = entityLoc.x - (travelMax*64 - col*64);
//trace(placeX);
for(var row:int = travelMax * 2; row >=0;row--)
{
var placeY:Number = entityLoc.y - (travelMax*64 - row*64);
//trace(moveGrid[col]);
//use tile grid map array
if(moveGrid[tileCount] == 1)
{
//use coordinates for the name value e.g.
co_ordX = col.toString();
co_ordY = row.toString();
moveNode = {col:col,row:row,obst:false,node:co_ordX+"-"+co_ordY,nX:placeX,nY:placeY,ph:0,h:0,g:0,f:0,c:0};
nodeLst.push(moveNode);
}
tileCount ++;
}
}
return nodeLst;
}
私のグリッドコード。万一に備えて。
みんなありがとう、
ジェームズ-