亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 邏輯算法 > 正文

PHP樹生成迷宮及A-自動尋路算法

2020-03-22 19:22:29
字體:
來源:轉載
供稿:網友
  • PHP樹生成迷宮及A*自動尋路算法

    迷宮算法是采用樹的深度遍歷原理,這樣生成的迷宮相當的細,而且死胡同數量相對較少!
    任意兩點之間都存在唯一的一條通路。
    至于A*尋路算法是最大眾化的一全自動尋路算法
    完整代碼已上傳,http://download.csdn.net/detail/hello_katty/8885779 ,此處做些簡單解釋,還需要大家自己思考動手。廢話不多說,貼上帶代碼 迷宮生成類:
    /** 生成迷宮類 * @date 2015-07-10 * @edit http://www.lai18.com * @version 1 **/html' target='_blank'>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*尋路算法

    /** 尋路算法 * @date 2015-07-10 * @edit http://www.lai18.com * @version 1 **/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);    }}

    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    亚洲国产高清高潮精品美女| 欧美日本啪啪无遮挡网站| 日韩高清电影好看的电视剧电影| 久久免费在线观看| 日韩精品极品视频免费观看| 日韩av免费网站| 国产精品久久久久久久久久尿| 91最新在线免费观看| 亚洲精品国产精品久久清纯直播| 高清欧美性猛交xxxx黑人猛交| 欧美成人免费在线视频| 欧美极品少妇xxxxⅹ裸体艺术| 热久久视久久精品18亚洲精品| 欧美一级免费视频| 91久久国产综合久久91精品网站| 91爱爱小视频k| 精品久久久91| 精品久久久国产| 欧美大成色www永久网站婷| 亚洲肉体裸体xxxx137| 国产亚洲欧美aaaa| 欧美激情视频给我| 欧美极品少妇xxxxⅹ免费视频| 欧美在线免费视频| 91九色国产在线| 亚洲精品大尺度| 国产亚洲美女精品久久久| 97在线观看免费| 亚洲国产精品高清久久久| 综合国产在线观看| 久久视频在线免费观看| 欧美区在线播放| 日韩经典一区二区三区| 亚洲国产私拍精品国模在线观看| 亚洲剧情一区二区| 亚洲网在线观看| 91香蕉嫩草神马影院在线观看| 亚洲一区二区三区四区在线播放| 亚洲精品aⅴ中文字幕乱码| 成人免费观看a| 国产一区视频在线播放| 欧美成人激情视频| 操91在线视频| 久久99精品久久久久久青青91| 欧美精品videossex性护士| 精品偷拍一区二区三区在线看| 精品动漫一区二区三区| 97视频在线观看免费| 国产欧美精品一区二区| 亚洲午夜久久久影院| 国产精品久久久av久久久| 欧美视频专区一二在线观看| 日韩av电影手机在线| 亚洲天堂av图片| 日韩中文字幕在线视频| 亚洲男人天堂网| 亚洲一区二区久久久久久| 国产精品一久久香蕉国产线看观看| 日本一区二区在线免费播放| 久久久久久12| 久久91超碰青草是什么| 国产精品久久久av久久久| 欧美激情第1页| 亚洲视频777| 久久精品中文字幕电影| 亚洲成在人线av| 日韩精品中文字幕久久臀| 美女黄色丝袜一区| 亚洲社区在线观看| 狠狠躁夜夜躁人人躁婷婷91| 日韩美女av在线免费观看| 欧美大片网站在线观看| 欧美精品电影在线| 国产97人人超碰caoprom| 91精品久久久久久久久久久久久久| 91精品国产91久久| 亚洲小视频在线观看| 中文在线不卡视频| 日韩av中文在线| 91在线看www| 91豆花精品一区| 欧美激情一区二区三区在线视频观看| 插插插亚洲综合网| 日韩精品极品毛片系列视频| 国产精品高清免费在线观看| 欧美亚洲国产视频| 国产精品第2页| 日韩av电影在线播放| 日韩精品有码在线观看| 亚洲色图激情小说| 成人久久久久久| 久久久久久久久91| 亚洲美女www午夜| 中文字幕日韩欧美在线| 97超碰国产精品女人人人爽| 国产一区二区美女视频| 中文字幕亚洲综合久久筱田步美| 欧美在线视频观看免费网站| 姬川优奈aav一区二区| 成人免费视频网址| 久久99视频精品| 亚洲成av人乱码色午夜| 欧美福利在线观看| 欧美一二三视频| 2023亚洲男人天堂| 久久免费福利视频| 成人精品一区二区三区电影黑人| 欧美猛交ⅹxxx乱大交视频| 波霸ol色综合久久| 欧美精品九九久久| 欧美日韩国产成人在线观看| 色播久久人人爽人人爽人人片视av| 伊人久久久久久久久久| 国内免费精品永久在线视频| 国产精品成人品| 国产精品激情av在线播放| 2019亚洲日韩新视频| 日本精品va在线观看| 欧美主播福利视频| 欧美日韩成人在线观看| 国产suv精品一区二区| 亚洲一区二区三区视频播放| 91免费电影网站| 欧美影院成年免费版| 欧美性xxxx极品高清hd直播| 亚洲人免费视频| 91丝袜美腿美女视频网站| 欧美高清在线视频观看不卡| 欧美最顶级的aⅴ艳星| 欧美超级乱淫片喷水| 91免费精品视频| 日韩av在线网| 日本精品久久中文字幕佐佐木| 成人黄色激情网| 欧美—级a级欧美特级ar全黄| 欧美亚洲免费电影| 97热在线精品视频在线观看| 国产精品h在线观看| 国内精品视频一区| 亚洲香蕉成人av网站在线观看| 国产精品久久久一区| 日韩一区二区在线视频| 国产va免费精品高清在线观看| 色综合视频一区中文字幕| 在线精品视频视频中文字幕| 久久久久久久av| 国产精品丝袜久久久久久高清| 国产色综合天天综合网| 91高潮精品免费porn| 欧美精品第一页在线播放| 亚洲人成在线电影| 蜜月aⅴ免费一区二区三区| 日韩在线观看免费全集电视剧网站| 亚洲一区二区三区毛片| 日韩免费观看在线观看| 久久久久久国产精品| 久久久久久高潮国产精品视| 欧美成年人视频网站| 亚洲级视频在线观看免费1级| 69国产精品成人在线播放| 国产91精品久久久久久久| 欧美一级免费视频| 国产91精品久久久久| 日韩在线免费观看视频|