中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

PHP樹的深度編歷生成迷宮及A*自動尋路算法實例分析
來源:易賢網 閱讀:1027 次 日期:2015-03-12 10:56:46
溫馨提示:易賢網小編為您整理了“PHP樹的深度編歷生成迷宮及A*自動尋路算法實例分析”,方便廣大網友查閱!

這篇文章主要介紹了PHP樹的深度編歷生成迷宮及A*自動尋路算法,實例分析了php實現A*尋路算法的技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了PHP樹的深度編歷生成迷宮及A*自動尋路算法。分享給大家供大家參考。具體分析如下:

有一同事推薦了三思的迷宮算法,看了感覺還不錯,就轉成php

三思的迷宮算法是采用樹的深度遍歷原理,這樣生成的迷宮相當的細,而且死胡同數量相對較少!

任意兩點之間都存在唯一的一條通路。

至于A*尋路算法是最大眾化的一全自動尋路算法

廢話不多說,貼上帶代碼

迷宮生成類:

代碼如下:

class Maze{

// Maze Create

private $_w;

private $_h;

private $_grids;

private $_walkHistory;

private $_walkHistory2;

private $_targetSteps;

// Construct

public function Maze() {

$this->_w = 6;

$this->_h = 6;

$this->_grids = array();

}

// 設置迷宮大小

public function set($width = 6, $height = 6) {

if ( $width > 0 ) $this->_w = $width;

if ( $height > 0 ) $this->_h = $height;

return $this;

}

// 取到迷宮

public function get() {

return $this->_grids;

}

// 生成迷宮

public function create() {

$this->_init();

return $this->_walk(rand(0, count($this->_grids) -1 ));

}

// 獲取死胡同點

public function block($n = 0, $rand = false) {

$l = count($this->_grids);

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

$v = $this->_grids[$i];

if ( $v == 1 || $v == 2 || $v == 4 || $v == 8 ) {

$return[] = $i;

}

}

// 隨機取點

if ( $rand ) shuffle($return);

if ( $n == 0 ) return $return;

if ( $n == 1 ) {

return array_pop($return);

} else {

return array_slice($return, 0, $n);

}

}

/**

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

| 生成迷宮的系列函數

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

*/

private function _walk($startPos) {

$this->_walkHistory = array();

$this->_walkHistory2 = array();

$curPos = $startPos;

while ($this->_getNext0() != -1) {

$curPos = $this->_step($curPos);

if ( $curPos === false ) break;

}

return $this;

}

private function _getTargetSteps($curPos) {

$p = 0;

$a = array();

$p = $curPos - $this->_w;

if ($p > 0 && $this->_grids[$p] === 0 && ! $this->_isRepeating($p)) {

array_push($a, $p);

} else {

array_push($a, -1);

}

$p = $curPos + 1;

if ($p % $this->_w != 0 && $this->_grids[$p] === 0 && ! $this->_isRepeating($p)) {

array_push($a, $p);

} else {

array_push($a, -1);

}

$p = $curPos + $this->_w;

if ($p < count($this->_grids) && $this->_grids[$p] === 0 && ! $this->_isRepeating($p)) {

array_push($a, $p);

} else {

array_push($a, -1);

}

$p = $curPos - 1;

if (($curPos % $this->_w) != 0 && $this->_grids[$p] === 0 && ! $this->_isRepeating($p)) {

array_push($a, $p);

} else {

array_push($a, -1);

}

return $a;

}

private function _noStep() {

$l = count($this->_targetSteps);

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

if ($this->_targetSteps[$i] != -1) return false;

}

return true;

}

private function _step($curPos) {

$this->_targetSteps = $this->_getTargetSteps($curPos);

if ( $this->_noStep() ) {

if ( count($this->_walkHistory) > 0 ) {

$tmp = array_pop($this->_walkHistory);

} else {

return false;

}

array_push($this->_walkHistory2, $tmp);

return $this->_step($tmp);

}

$r = rand(0, 3);

while ( $this->_targetSteps[$r] == -1) {

$r = rand(0, 3);

}

$nextPos = $this->_targetSteps[$r];

$isCross = false;

if ( $this->_grids[$nextPos] != 0)

$isCross = true;

if ($r == 0) {

$this->_grids[$curPos] ^= 1;

$this->_grids[$nextPos] ^= 4;

} elseif ($r == 1) {

$this->_grids[$curPos] ^= 2;

$this->_grids[$nextPos] ^= 8;

} elseif ($r == 2) {

$this->_grids[$curPos] ^= 4;

$this->_grids[$nextPos] ^= 1;

} elseif ($r == 3) {

$this->_grids[$curPos] ^= 8;

$this->_grids[$nextPos] ^= 2;

}

array_push($this->_walkHistory, $curPos);

return $isCross ? false : $nextPos;

}

private function _isRepeating($p) {

$l = count($this->_walkHistory);

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

if ($this->_walkHistory[$i] == $p) return true;

}

$l = count($this->_walkHistory2);

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

if ($this->_walkHistory2[$i] == $p) return true;

}

return false;

}

private function _getNext0() {

$l = count($this->_grids);

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

if ( $this->_grids[$i] == 0) return $i;

}

return -1;

}

private function _init() {

$this->_grids = array();

for ($y = 0; $y < $this->_h; $y ++) {

for ($x = 0; $x < $this->_w; $x ++) {

array_push($this->_grids, 0);

}

}

return $this;

}

}

A*尋路算法

代碼如下:

class AStar{

// A-star

private $_open;

private $_closed;

private $_start;

private $_end;

private $_grids;

private $_w;

private $_h;

// Construct

public function AStar(){

$this->_w = null;

$this->_h = null;

$this->_grids = null;

}

public function set($width, $height, $grids) {

$this->_w = $width;

$this->_h = $height;

$this->_grids = $grids;

return $this;

}

// 迷宮中尋路

public function search($start = false, $end = false) {

return $this->_search($start, $end);

}

/**

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

| 自動尋路 - A-star 算法

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

*/

public function _search($start = false, $end = false) {

if ( $start !== false ) $this->_start = $start;

if ( $end !== false ) $this->_end = $end;

$_sh = $this->_getH($start);

$point['i'] = $start;

$point['f'] = $_sh;

$point['g'] = 0;

$point['h'] = $_sh;

$point['p'] = null;

$this->_open[] = $point;

$this->_closed[$start] = $point;

while ( 0 < count($this->_open) ) {

$minf = false;

foreach( $this->_open as $key => $maxNode ) {

if ( $minf === false || $minf > $maxNode['f'] ) {

$minIndex = $key;

}

}

$nowNode = $this->_open[$minIndex];

unset($this->_open[$minIndex]);

if ( $nowNode['i'] == $this->_end ) {

$tp = array();

while( $nowNode['p'] !== null ) {

array_unshift($tp, $nowNode['p']);

$nowNode = $this->_closed[$nowNode['p']];

}

array_push($tp, $this->_end);

break;

}

$this->_setPoint($nowNode['i']);

}

$this->_closed = array();

$this->_open = array();

return $tp;

}

private function _setPoint($me) {

$point = $this->_grids[$me];

// 所有可選方向入隊列

if ( $point & 1 ) {

$next = $me - $this->_w;

$this->_checkPoint($me, $next);

}

if ( $point & 2 ) {

$next = $me + 1;

$this->_checkPoint($me, $next);

}

if ( $point & 4 ) {

$next = $me + $this->_w;

$this->_checkPoint($me, $next);

}

if ( $point & 8 ) {

$next = $me - 1;

$this->_checkPoint($me, $next);

}

}

private function _checkPoint($pNode, $next) {

if ( $this->_closed[$next] ) {

$_g = $this->_closed[$pNode]['g'] + $this->_getG($next);

if ( $_g < $check['g'] ) {

$this->_closed[$next]['g'] = $_g;

$this->_closed[$next]['f'] = $this->_closed[$next]['g'] + $this->_closed[$next]['h'];

$this->_closed[$next]['p'] = $pNode;

}

} else {

$point['p'] = $pNode;

$point['h'] = $this->_getH($next);

$point['g'] = $this->_getG($next);

$point['f'] = $point['h'] + $point['g'];

$point['i'] = $next;

$this->_open[] = $point;

$this->_closed[$next] = $point;

}

}

private function _getG($point) {

return abs($this->_start - $point);

}

private function _getH($point) {

return abs($this->_end - $point);

}

}

完整實例代碼點擊此處本站下載。

有需要大家可以直接下demo,看看效果!

希望本文所述對大家的php程序設計有所幫助。

更多信息請查看IT技術專欄

更多信息請查看網絡編程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
黑丝一区二区| 亚洲精品国产精品国自产观看浪潮 | 欧美涩涩视频| 久久亚裔精品欧美| 亚洲最新色图| 亚洲人体1000| 亚洲网站在线观看| 亚洲精品黄网在线观看| 影音先锋亚洲电影| 在线播放中文字幕一区| 在线观看的日韩av| 亚洲国产精品成人综合| 亚洲精品久久| 一本色道久久加勒比精品| 日韩视频一区二区三区| 亚洲精品一区二区三区99| 99亚洲精品| 亚洲一区二区三区在线看| 亚洲伊人网站| 久久精品网址| 欧美电影免费观看高清完整版 | 米奇777超碰欧美日韩亚洲| 久久精品在线免费观看| 久久全国免费视频| 欧美激情四色 | 影音先锋中文字幕一区| 亚洲高清一区二| 日韩午夜电影av| 亚洲男人的天堂在线aⅴ视频| 亚洲女同在线| 久久久免费精品视频| 免费久久精品视频| 欧美精品日韩| 国产精品毛片大码女人| 国产午夜精品一区理论片飘花| 国产一区深夜福利| 91久久在线播放| 亚洲一区二区三区精品在线| 性欧美暴力猛交69hd| 欧美福利电影网| 欧美先锋影音| 国内揄拍国内精品久久| 亚洲精品国产拍免费91在线| 亚洲免费在线精品一区| 免费久久久一本精品久久区| 国产精品电影观看| 在线观看亚洲视频| 亚洲综合首页| 欧美激情一区二区| 国模私拍一区二区三区| 亚洲午夜精品17c| 免费观看久久久4p| 国产精品视频一区二区高潮| 亚洲黄色免费电影| 性色一区二区| 欧美日韩国产综合视频在线观看中文| 国产日韩欧美不卡| 一本色道久久综合精品竹菊| 久久资源在线| 国产亚洲美州欧州综合国| 久久亚洲私人国产精品va| 欧美日产在线观看| 国精品一区二区三区| 一区二区三区毛片| 欧美.www| 激情综合在线| 久久不射中文字幕| 国产精品一区二区女厕厕| 亚洲人成网站色ww在线| 久久久精品2019中文字幕神马| 欧美日韩综合视频网址| 亚洲高清久久久| 久久久久久亚洲精品中文字幕| 国产精品高潮呻吟视频| 亚洲裸体俱乐部裸体舞表演av| 久久三级福利| 国产真实乱偷精品视频免| 亚洲欧美日韩国产成人精品影院| 欧美激情亚洲激情| 亚洲精品乱码久久久久久黑人 | 欧美成年人视频网站| 国产欧美视频一区二区三区| 亚洲天天影视| 国产精品高潮呻吟视频| 亚洲线精品一区二区三区八戒| 欧美激情综合五月色丁香| 最新国产拍偷乱拍精品| 免费成人av在线| 91久久精品久久国产性色也91 | 亚洲激情国产| 麻豆国产精品一区二区三区| 一区二区自拍| 美日韩精品免费观看视频| 伊人影院久久| 嫩草成人www欧美| 亚洲欧洲一区二区三区久久| 欧美福利电影网| 亚洲精品一区二区在线| 欧美日韩国产精品一卡| 亚洲天堂网站在线观看视频| 国产精品a久久久久| 亚洲午夜免费福利视频| 国产精品一区毛片| 久久久久九九视频| 亚洲国产精品毛片| 欧美午夜精品理论片a级按摩| 亚洲一区二区三区免费视频| 国产欧美一区二区三区国产幕精品 | 国产欧美精品xxxx另类| 亚洲欧美国产另类| 国产一区二区高清| 欧美r片在线| 亚洲桃花岛网站| 国产亚洲欧洲| 欧美国产一区二区| 亚洲一区二区3| 狠狠色狠狠色综合日日五| 麻豆成人av| 亚洲一区二区三区在线看| 国产婷婷成人久久av免费高清| 麻豆精品精华液| 亚洲视屏在线播放| 黄色精品一区| 国产精品www网站| 久久这里只精品最新地址| 亚洲精品网址在线观看| 国产精品日韩欧美| 麻豆成人精品| 午夜精品久久久久久久久久久久久 | 国产综合第一页| 欧美精品久久久久久久| 香蕉成人久久| 亚洲精品综合精品自拍| 国产日韩欧美在线观看| 欧美美女视频| 性欧美暴力猛交另类hd| 亚洲人在线视频| 国产视频欧美视频| 欧美日韩一区二区免费在线观看 | 欧美激情一区二区三区高清视频| 亚洲自拍偷拍网址| 亚洲精品国产精品国产自| 国产日韩欧美二区| 欧美三级网址| 欧美激情影音先锋| 久久精品99国产精品| 亚洲无毛电影| 亚洲日本中文| 精品9999| 国产乱码精品一区二区三区忘忧草| 欧美.www| 另类图片国产| 久久久久久久久久久成人| 亚洲综合日韩在线| av成人免费在线观看| 91久久精品国产91久久| 极品尤物久久久av免费看| 国产日韩欧美在线一区| 国产精品国产三级国产普通话三级| 欧美激情1区2区| 欧美福利视频在线观看| 老司机午夜免费精品视频| 久久九九电影| 久久久999精品| 久久aⅴ乱码一区二区三区| 亚洲综合色在线| 亚洲一级一区| 国产精品99久久99久久久二8| 欧美日韩亚洲一区二区| 亚洲女同同性videoxma| 国产精品普通话对白| 欧美日本一区二区三区| 欧美日产国产成人免费图片| 一区视频在线看| 美女主播精品视频一二三四| 美女主播一区| 久久久999国产| 久久久国产成人精品| 欧美一级视频| 亚洲欧美日韩国产成人| 欧美视频成人| 一区二区视频欧美| 久久久久国产精品厨房| 性欧美xxxx大乳国产app| 午夜视频一区二区| 久久久久久夜精品精品免费| 午夜在线观看免费一区| 欧美成人国产va精品日本一级| 欧美午夜免费| 99视频精品在线| 免费观看一级特黄欧美大片| 欧美黑人多人双交| 欧美激情2020午夜免费观看| 激情综合色综合久久| 欧美va天堂在线| 久久精品国产亚洲精品| 亚洲精品国精品久久99热| 最新成人在线| 99re国产精品| 亚洲免费中文字幕|