本文介绍了php树的深层编程迷宫和A*自动布线算法,供大家参考,具体分析如下:

一位同事推荐了一个迷宫,它看起来不错,变成了PHP。

迷宫的迷宫,使用树的深度遍历原理,是相当薄的,死胡同的数目相对较小。

任何两点之间都有一条独特的路径。

A*路由算法是目前最流行的自动路由算法。

没有太多的谈话,把代码。

迷宫生成类:

复制代码如下:类迷宫{

迷宫创建

私人_w美元;

私人_h美元;

私人_grids美元;

私人_walkhistory美元;

私人_walkhistory2美元;

私人_targetsteps美元;

/构建

公共函数Maze(){

美元-> _w = 6;

美元-> _h = 6;

美元-> _grids =阵();

}

设置迷宫的大小

公共函数集(宽度= 6,高度= 6){

如果($宽度> 0)美元-> _w = $宽度;

如果($高> 0)美元-> _h = $高度;

返回$此;

}

到迷宫中去

公共函数获取(){

返回_grids美元->;

}

生成迷宫

公共函数创建(){

美元-> _init();

返回这个-> _walk(rand(0,计数(美元-> _grids)- 1));

}

获取/死/终止点

公共功能块($ = 0,$ = false){

$ L =计数(美元-> _grids);

($ i = 1;$ i $ l;$ + +){

$ V =美元-> _grids {我};

如果($ V = = 1 = = 2 = = $ V $ V | | | | 4 | | { $ V = = 8)

$;

}

}

随机访问点

如果($)洗牌(回报);



如果($ = 0)返回$返回;



如果($ = 1){

返回array_pop(美元收益);

{人}

返回array_slice(美元的回报,0,$ N);

}

}



| ---------------------------------------------------------------

|系列函数生成的迷宫

| ---------------------------------------------------------------

* /

私有函数_walk($ StartPos){

美元-> _walkhistory =阵();

美元-> _walkhistory2 =阵();

curpos =美元,让美元;

而美元->(_getnext0()!= 1){

curpos美元=美元-> _step($ curpos);

如果($ curpos = false)打破;

}

返回$此;

}

私有函数_gettargetsteps($ curpos){

$ = 0;

$ =数组();

P = $ curpos -美元-> _w;

如果(P - > _grids { $ P } = > 0 0!美元-> _isrepeating(P)){

array_push($,$ P);

{人}

array_push($,1);

}

P = curpos + 1美元;

如果($ P%美元-> _w!= 0美元-> _grids { $ P } = 0美元这-> _isrepeating(P){!)

array_push($,$ P);

{人}

array_push($,1);

}

P = $ curpos +美元-> _w;

If ($p _grids) $this->_grids{$p} = 0 $this->_isRepeating ($p)) {!

array_push($,$ P);

{人}

array_push($,1);

}

P = curpos美元1美元;

如果(($ curpos %美元-> _w)!= 0美元-> _grids { $ P } = 0美元这-> _isrepeating(P){!)

array_push($,$ P);

{人}

array_push($,1);

}

返回$;

}

私有函数_nostep(){

$ L =计数(美元-> _targetsteps);

($ i = 0;$ i $ l;$ + +){

如果(美元-> _targetsteps {我}!= - 1)返回false;

}

返回true;

}

私有函数_step($ curpos){

这_targetsteps =美元->美元-> _gettargetsteps($ curpos);

如果(美元-> _nostep()){

如果(计数(美元-> _walkhistory)> 0){

TMP = array_pop美元(美元-> _walkhistory);

{人}

返回false;

}

array_push(美元->美元_walkhistory2,TMP);

返回这个-> _step($ TMP);

}

$ =兰德(0, 3);

而(美元-> _targetsteps { $ R } = = 1){

$ =兰德(0, 3);

}

nextpos美元=美元-> _targetsteps { $ R };

跨美元=假;

如果(美元-> _grids { $ nextpos }!= 0)

$跨=真;

如果($ = 0){

美元-> _grids { 1 } ^ curpos美元;

美元-> _grids { 4 } ^ nextpos美元;

} elseif(r = = 1){

美元-> _grids { 2 } ^ curpos美元;

美元-> _grids { 8 } ^ nextpos美元;

} elseif(r = = 2){

美元-> _grids { 4 } ^ curpos美元;

美元-> _grids { 1 } ^ nextpos美元;

} elseif(r = = 3){

美元-> _grids { 8 } ^ curpos美元;

美元-> _grids { 2 } ^ nextpos美元;

}

array_push(美元-> _walkhistory,curpos美元);

跨虚假回归:nextpos美元美元;

}

私有函数_isrepeating(P){

$ L =计数(美元-> _walkhistory);

($ i = 0;$ i $ l;$ + +){

如果(美元-> _walkhistory { } = =我美元$ P)返回true;

}

$ L =计数(美元-> _walkhistory2);

($ i = 0;$ i $ l;$ + +){

如果(美元-> _walkhistory2 { } = =我美元$ P)返回true;

}

返回false;

}

私有函数_getnext0(){

$ L =计数(美元-> _grids);



($ i = 0;$ i $ l;$ + +){

如果(美元-> _grids {我} = = 0美元)返回的我;

}

返回- 1;

}

私有函数_init(){

美元-> _grids =阵();

为($ Y = 0;Y元_h;Y元+ +){

为($ x = 0;X元_w;X元+ +){

array_push(美元-> _grids,0);

}

}

返回$此;

}

}

A*路由算法

复制代码代码如下:类爱仕达{

/ / A

私人_open美元;

私人_closed美元;

私人_start美元;

私人_end美元;

私人_grids美元;

私人_w美元;

私人_h美元;

/构建

公共函数AStar(){

美元-> _w = null;

美元-> _h = null;

美元-> _grids = null;

}

公共函数集(宽度、高度、网格){

美元-> _w = $宽度;

美元-> _h = $高度;

美元-> _grids = $网格;

返回$此;

}

/ /迷宫寻路

公共函数搜索($ = false,$ = false){

返回这个-> _search(美元开始,美元);

}



| ---------------------------------------------------------------

|自动路由算法

| ---------------------------------------------------------------

* /

公共功能_search($开始= false,美元= false){

如果(开始)!= = false)美元-> _start = $开始;

如果($)!= = false)美元-> _end =美元;

_sh美元=美元-> _geth($开始);

$ $;

$点{ F } = $ _sh;

{一} $点= 0;

点错} = {美元_sh美元;

$点{ 'p' } = null;

美元-> _open { } = $点;

美元-> _closed {开始} = $点美元;

而(0 _open)){

$心智=假;

foreach(美元-> _open美元美元关键= maxnode){

如果($心智=假|美元美元|心智> maxnode { F }){

极小指标=美元美元的关键;

}

}

nownode美元=美元-> _open { $极小指标};

unset(美元-> _open { $极小指标});

如果($ nownode {我的} = =美元-> _end){

$ =数组();

而($ nownode { 'p' }!= NULL){

array_unshift($ TP,nownode美元{ 'p' });

nownode美元=美元-> _closed { $ nownode { 'p' } };

}

array_push($ TP,美元-> _end);

打破;

}

美元-> _setpoint($ nownode {我的});

}

美元-> _closed =阵();

美元-> _open =阵();

返回$ TP;

}

私有函数_setpoint($我){

$点=美元-> _grids { $我};

将所有可选方向放入队列中

如果($ 1){

接下来我=美元美元美元-> _w;

美元-> _checkpoint($我一美元);

}

如果($ 2){

$ $ = $ ME + 1;

美元-> _checkpoint($我一美元);

}

如果($ 4){

我+下=美元美元美元-> _w;

美元-> _checkpoint($我一美元);

}

如果($ 8){

$ $ = $ 1;

美元-> _checkpoint($我一美元);

}

}

私有函数_checkpoint(指向美元,一美元){

如果(美元-> _closed { $下}){

_g美元=美元-> _closed { } {一} $指向+ $这-> _getg(合一);

如果($ _g < {一} $检查){

美元-> _closed {一} {一}美元的美元_g =;

美元-> _closed {一} { } $ F =美元-> _closed {一} {一} $'+美元-> _closed {一} { } $ H;

美元-> _closed {一} {美元'p' } = $题目;

}

{人}

$点{ 'p' } = $题目;

点错} = {美元美元-> _geth(合一);

{一} = $点-> _getg美元(合一);

$点{ F } = { } $点H + $点{一};

下一个点;

美元-> _open { } = $点;

美元-> _closed {一} = $点美元;

}

}

私有函数_getg(合点){

返回ABS(美元-> _start $点);

}

私有函数_geth(合点){

返回ABS(美元-> _end $点);

}

}

完整的实例代码在这里下载。



每个人都需要直接去演示,看看效果如何!

希望本文能对大家的PHP程序设计有所帮助。