实践:路径遍历(三) 迷宫探秘

本贴最后更新于 1422 天前,其中的信息可能已经时移俗易

迷宫程序 链接
迷宫生成:
image.png
解迷宫:
image.png

迷宫生成算法的可视化演示,使用 React 来实现。
迷宫的生成,涉及在图中找出生成树相关算法。
解迷宫,就是在生成的树上,进行深度遍历,寻找链接指定两个点的唯一可达路线。
以下为具体的部分关键实现代码。

import React, { Component } from 'react';
import './maze.css';
import Grid from './Grid';

class AppDemo extends Component {
    constructor(proprs) {
        super(proprs);
        var column = 20;//默认列数
        var row = 15;//默认行数
        var pixel = 35;//默认单位方格像素数
        var staticMatrix = this.initStaticMatrix(column, row);//静态二维数组,第一维度是位置编号,第二维度是当下位置的邻居编号
        var dynamicMatrix = this.initDynamicMatrix(column, row);//动态二维数组,第一维度是位置编号,第二维度是当下位置已连接的方向信息
        var elements = this.initElements(column, row);
        var arr = this.initArr(column, row);
        var start = Math.floor(Math.random() * column * row + 1);//随机初始位置
        this.state = {
            staticMatrix: staticMatrix,
            dynamicMatrix: dynamicMatrix,
            now: start,//当下位置*
            begin: start,//开始位置
            end: start,//最后一个位置
            column: column,//列数
            row: row,//行数
            timeID: 0,//定时器ID
            speed: 100,//速度(毫秒)
            speedtype: "中",//用于界面速度显示
            pixel: pixel,//方格像素数
            step: false,//是否参与过单步
            time: 0,//用时显示
            begintime: 0,//起始时间
            stoptime: 0,//完成时间
            reverse: [0, 3, 4, 1, 2], //用于快速反向
            elements: elements,//边界元素集合
            over: column * row,
            maxwidth: 900,//最大宽度像素数
            maxheight: 600,//最大高度像素数

            arr: arr,//路径元素编号信息
            historyPath: [],//路径栈
            findtime: 0,//用时显示
            findbegintime: 0,//起始时间
            findstoptime: 0,//完成时间
            findtimeID: 0,//定时器ID
            findover: false,//寻路完毕
            findStep: false,//是否参与过单步

            hide: false //是否隐藏界面中的标记
        }
    }

    /**
     * 每一步的处理算法,调用一次,迷宫界面就会向前走一步,方向是随机的
     */
    handle() {
        var elements = this.state.elements;
        var r = this.around(this.state.now, this.state.dynamicMatrix);//返回未涉足邻居编号集合
        if (r.length < 1) {//若未涉足邻居个数小于1(即从当下位置出发已经无路可走),则随机切换到边界集合中的其他位置
            if (this.state.over <= 1) {
                this.stop();
                //this.info("迷宫已经生成完毕。");
                return;
            }
            var randomNow = this.randomElement(elements);
            this.setState({
                time: (new Date().getTime() - this.state.begintime) / 1000,
                now: randomNow
            });
        } else {
            //方向随机1表示向上,2表示向右,3表示向下,4表示向左
            var direction = this.randomDirection(r);//随机取一个方向
            var next = this.state.staticMatrix[this.state.now][direction];//下一个位置编号
            if (this.around(next, this.state.dynamicMatrix).length >= 2) {//如果下一个位置的未涉足邻居个数大于等于2,则标记为边界。
                elements[next] = 1;
            }
            var dynamicMatrix = this.state.dynamicMatrix;//动态生成的“树”
            this.connect(this.state.now, direction, next, dynamicMatrix);//连接now和next
            this.setState({
                time: (new Date().getTime() - this.state.begintime) / 1000,
                now: next,
                elements: this.freshElements(elements, next, dynamicMatrix),
                dynamicMatrix: dynamicMatrix,
                over: this.state.over - 1
            });
        }
    }

    findPath() {
        if (this.state.findover === false && this.state.over <= 1) {

            var historyPath = this.state.historyPath;//历史路径
            var dynamicMatrix = this.state.dynamicMatrix;
            var arr = this.state.arr;//路径编号
            var staticMatrix = this.state.staticMatrix;
            if (historyPath.length === 0) {
                historyPath.push(dynamicMatrix[1].concat());
                //arr[historyPath[historyPath.length - 1][0]][] = 1;
            }
            var nowRow = historyPath[historyPath.length - 1][0];//获取当下的位置编号
            var b = false;
            for (var i = 1; i <= 4; i++) {
                var p = historyPath[historyPath.length - 1][i];
                if (p === 1) {
                    var next = staticMatrix[nowRow][i];
                    historyPath.push(dynamicMatrix[next].concat());
                    historyPath[historyPath.length - 1][this.state.reverse[i]] = 0;
                    arr[next][this.state.reverse[i]] = 1;
                    arr[nowRow][i] = 1;
                    this.setState({
                        findtime: (new Date().getTime() - this.state.findbegintime) / 1000,
                        historyPath: historyPath,
                        arr: arr
                    });
                    if (next === this.state.column * this.state.row) {
                        this.findStop();
                        this.setState({
                            findover: true
                        });
                        //this.info("迷宫路径已找到(暂时只支持从左上到右下)。");
                        return;
                    }
                    b = true;
                    break;
                }
            }
            if (!b) {//如果无路可走
                //判断当下路径(未退步之前)是否包含于历史记录。
                var nown = historyPath[historyPath.length - 1][0];
                var last = historyPath[historyPath.length - 2][0];
                arr[nown] = [nown,0,0,0,0];
                historyPath.pop();
                for (var j = 1; j <= 4; j++) {
                    var p2 = historyPath[historyPath.length - 1][j];
                    if (p2 === 1) {
                        arr[last][j] = 0;
                        historyPath[historyPath.length - 1][j] = 0;
                        this.setState({
                            findtime: (new Date().getTime() - this.state.findbegintime) / 1000,
                            historyPath: historyPath,
                            arr: arr
                        });
                        break;
                    }
                }
            }
        } else {
            this.findStop();
        }
    }

    /**
     * 启动解迷宫程序
     */
    findStart() {
        if (this.state.over <= 1) {//若迷宫已经生成完毕,才可以解迷宫
            var findtimeID = this.state.findtimeID;
            if (findtimeID === 0) {//若 当下定时器不为0,则启动新定时器(防止重复启动多个定时器)
                findtimeID = setInterval(
                    () => this.findPath(),
                    this.state.speed
                );
                this.setState({
                    findbegintime: new Date().getTime() - this.state.findtime * 1000,
                    findtimeID: findtimeID,
                    now: 0
                });
            }
            
        }else{
            this.info("需要先生成迷宫,才能解迷宫的!笨蛋");
        }

    }
    findStop() {
        var findtimeID = this.state.findtimeID;
        if (findtimeID !== 0) {
            clearInterval(findtimeID);
            this.setState({
                findtimeID: 0
            });
        }
        
    }
    findStep() {
        this.findStop();
        this.findPath();
        this.setState({
            findStep: true
        });
    }
    hide(){
        this.setState({
            hide: !this.state.hide
        });
    }
    render() {
        return (
            <div className="maze">
                <div className="aaa">
                    <Grid
                        pixel={this.state.pixel}
                        width={this.state.column}
                        height={this.state.row}
                        dynamicMatrix={this.state.dynamicMatrix}
                        now={this.state.now}
                        elements={this.state.elements}
                        begin={this.state.begin}
                        end={this.state.end}
                        arr={this.state.arr}
                        hide={this.state.hide}
                    />
                </div>
                <div className="bbb">
                    <div className="control navbar navbar-default">
                        <span className="title">生成迷宫:(用时{this.state.step ? "单步参与后不再计时" : (this.state.time + "s")}</span><br />
                        <span >&nbsp;&nbsp;&nbsp;</span>
                        <button type="button" className="btn btn-primary navbar-btn" onClick={() => this.start()}>开始</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button type="button" className="btn btn-primary navbar-btn" onClick={() => this.stop()}>暂停</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button type="button" className="btn btn-primary navbar-btn" onClick={() => this.start()}>继续</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button type="button" className="btn btn-primary navbar-btn" onClick={() => this.step()}>单步</button><span >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
                    </div>
                    <div className="control navbar navbar-default">
                        <span className="title">解迷宫:(用时{this.state.findStep ? "单步参与后不再计时" : (this.state.findtime + "s")}<span >&nbsp;&nbsp;&nbsp;</span>{this.state.findover?("找到,路径长度为:"+this.state.historyPath.length)+"":"迷宫入口为左上角,出口为右下角。"}</span><br />
                        <span >&nbsp;&nbsp;&nbsp;</span>
                        <button type="button" className="btn btn-primary navbar-btn" onClick={() => this.findStart()}>开始</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button type="button" className="btn btn-primary navbar-btn" onClick={() => this.findStop()}>暂停</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button type="button" className="btn btn-primary navbar-btn" onClick={() => this.findStart()}>继续</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button type="button" className="btn btn-primary navbar-btn" onClick={() => this.findStep()}>单步</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button type="button" className="btn btn-primary navbar-btn" onClick={() => this.resetFind()}>清除</button>
                    </div>
                    <div className="control  navbar navbar-default">
                        <span className="title">速度{this.state.speedtype}</span><br />
                        <span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" type="button" onClick={() => this.speed(1000)}>极慢</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" type="button" onClick={() => this.speed(500)}></button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" type="button" onClick={() => this.speed(100)}></button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" type="button" onClick={() => this.speed(50)}></button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" type="button" onClick={() => this.speed(10)}>���</button>
                    </div>
                    <div className="control  navbar navbar-default">
                        <span className="title">列数{this.state.column}</span><br />
                        <span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" style={{ width: "80px" }} type="button" onClick={() => this.addwidth(1)}>+1</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" style={{ width: "80px" }} type="button" onClick={() => this.addwidth(-1)}>-1</button>
                        <span >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" style={{ width: "80px" }} type="button" onClick={() => this.addwidth(5)}>+5</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" style={{ width: "80px" }} type="button" onClick={() => this.addwidth(-5)}>-5</button><br />
                    </div>
                    <div className="control  navbar navbar-default">
                        <span className="title">行数{this.state.row}</span><br />
                        <span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" style={{ width: "80px" }} type="button" onClick={() => this.addheight(1)}>+1</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" style={{ width: "80px" }} type="button" onClick={() => this.addheight(-1)}>-1</button>
                        <span >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" style={{ width: "80px" }} type="button" onClick={() => this.addheight(5)}>+5</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" style={{ width: "80px" }} type="button" onClick={() => this.addheight(-5)}>-5</button><br />
                    </div>
                    <div className="control  navbar navbar-default">
                        <span className="title">大小{this.state.column * this.state.pixel}px&nbsp;:&nbsp;{this.state.row * this.state.pixel}px</span><br />
                        <span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" style={{ width: "80px" }} type="button" onClick={() => this.big(1)}>放大+1</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" style={{ width: "80px" }} type="button" onClick={() => this.big(-1)}>缩小-1</button>
                        <span >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" style={{ width: "80px" }} type="button" onClick={() => this.big(5)}>放大+5</button><span >&nbsp;&nbsp;&nbsp;</span>
                        <button className="btn btn-primary navbar-btn" style={{ width: "80px" }} type="button" onClick={() => this.big(-5)}>缩小-5</button><br />
                    </div>
                    <div className="control navbar navbar-default">
                        <span className="title">其他</span><br />
                        <span >&nbsp;&nbsp;&nbsp;</span>
                        <button type="button" className="btn btn-primary navbar-btn" onClick={() => this.hide()}>{this.state.hide?"显示标记":"隐藏标记"}</button><span >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
                        <button type="button" className="btn btn-primary navbar-btn" onClick={() => this.resetAll()}>全部重置</button>
                    </div>
                </div>

            </div >

        )
    }

    /**
     * 连接now和next两个位置
     * @param {*} now 
     * @param {*} direction 
     * @param {*} next 
     * @param {*} dynamicMatrix 
     */
    connect(now, direction, next, dynamicMatrix) {
        dynamicMatrix[now][direction] = 1;//连接下一个位置
        dynamicMatrix[next][this.state.reverse[direction]] = 1;//连接下一个位置
    }
    /**
     * 从边界集合中随机选择一个返回
     * @param {} elements 
     */
    randomElement(elements) {
        var u = this.state.column * this.state.row
        var n = Math.floor(Math.random() * u);
        var i = 0;
        while (elements[n] !== 1) {
            i++;
            n++;
            if (n > u) {
                n = 1;
            }
            if (i > u) {
                n = 0;
                break;
            }
        }
        return n;
    }
    /**
     * 初始化StaticMatrix
     * @param {*} width 
     * @param {*} height 
     */
    initStaticMatrix(width, height) {
        var matrix = [[0, 1, 2, 3, 4]];
        for (var numb = 1; numb <= width * height; numb++) {
            var up = numb > width ? numb - width : 0;
            var right = (numb % width) !== 0 ? numb + 1 : 0;
            var down = numb <= width * (height - 1) ? numb + width : 0;
            var left = ((numb - 1) % width) !== 0 ? numb - 1 : 0;
            var arr = [numb];
            arr.push(up);
            arr.push(right);
            arr.push(down);
            arr.push(left);
            matrix.push(arr);
        }
        return matrix;
    }
    /**
     * 初始化DynamicMatrix
     * @param {*} width 
     * @param {*} height 
     */
    initDynamicMatrix(width, height) {
        var dynamicMatrix = [[0, 1, 2, 3, 4]];
        for (var numb = 1; numb <= width * height; numb++) {
            var up = 0;
            var right = 0;
            var down = 0;
            var left = 0;
            var arr = [numb];
            arr.push(up);
            arr.push(right);
            arr.push(down);
            arr.push(left);
            dynamicMatrix.push(arr);
        }
        return dynamicMatrix;
    }
    initArr(width, height) {
        var dynamicMatrix = [[0, 1, 2, 3, 4]];
        for (var numb = 1; numb <= width * height; numb++) {
            var up = 0;
            var right = 0;
            var down = 0;
            var left = 0;
            var arr = [numb];
            arr.push(up);
            arr.push(right);
            arr.push(down);
            arr.push(left);
            dynamicMatrix.push(arr);
        }
        return dynamicMatrix;
    }
    /**
     * 初始化Elements边界集合
     * @param {*} column 
     * @param {*} row 
     */
    initElements(column, row) {
        var arr = new Array(column * row + 1);
        for (var i = 0; i < arr.length; i++) {
            arr[i] = 0;
        }
        return arr;
    }
    /**
     * 返回未涉足邻居编号集合
     * 参数new,是当下位置的编号
     */
    around(now, dynamicMatrix) {
        var r = [];
        for (var j = 1; j <= 4; j++) {//每个位置周边共四个“邻居”
            var runod = this.state.staticMatrix[now][j];//其中一个邻居
            //判断“邻居”是否已经被涉足,若没有,则将此邻居方向编号加入将要返回的集合中
            if (runod !== 0 && (dynamicMatrix[runod][1] === 0
                && dynamicMatrix[runod][2] === 0
                && dynamicMatrix[runod][3] === 0
                && dynamicMatrix[runod][4] === 0)) {
                r.push(j);
            }
        }
        return r;//返回未涉足邻居方向编号集合
    }
    /**
     * 从邻居中随机选出一个作为下一个位置
     * @param {*} r 
     */
    randomDirection(r) {
        if (r.length === 1) {
            return r[r.length - 1];
        }
        return r[Math.floor(Math.random() * r.length)];
    }

    /**
     * 刷新边界集合,(每前进一步,整个盘面唯有一个位置有所改变,所以只扫面更新此位置四周即可)
     * @param {*} elements 
     * @param {*} next 
     * @param {*} dynamicMatrix 
     */
    freshElements(elements, next, dynamicMatrix) {
        for (var n = 1; n <= 4; n++) {
            var runod = this.state.staticMatrix[next][n];//其中一个邻居
            //判断“邻居”是否已经被涉足,若没有,则将此邻居编号加入将要返回的集合中
            if (elements[runod] !== 0 && this.around(runod, dynamicMatrix).length === 0) {//如果elements[n]周围没有未涉足区域,则从边缘集合中去掉
                elements[runod] = 0;
            }
        }
        return elements;
    }
    /**
     * 添加列数,n为添加的列数
     * @param {*} n 
     */
    addwidth(n) {
        this.stop();
        var column = this.state.column;
        column = column + n;
        if (column > 0 && column * this.state.pixel <= this.state.maxwidth) {
            var staticMatrix = this.initStaticMatrix(column, this.state.row);
            var dynamicMatrix = this.initDynamicMatrix(column, this.state.row);
            var elements = this.initElements(column, this.state.row);
            var arr = this.initArr(column, this.state.row);
            var start = Math.floor(Math.random() * column * this.state.row + 1);
            this.setState({
                staticMatrix: staticMatrix,
                dynamicMatrix: dynamicMatrix,
                begin: start,
                now: start,
                column: column,
                time: 0,
                elements: elements,
                over: column * this.state.row,

                arr: arr,
                historyPath: [],
                findtime: 0,
                findover: false
            });
        } else {
            var maxColumn = Math.floor(this.state.maxwidth / this.state.pixel);
            var staticMatrix1 = this.initStaticMatrix(maxColumn, this.state.row);
            var dynamicMatrix1 = this.initDynamicMatrix(maxColumn, this.state.row);
            var elements1 = this.initElements(maxColumn, this.state.row);
            var arr1 = this.initArr(maxColumn, this.state.row);
            var newstart = Math.floor(Math.random() * maxColumn * this.state.row + 1);
            this.setState({
                staticMatrix: staticMatrix1,
                dynamicMatrix: dynamicMatrix1,
                begin: newstart,
                now: newstart,
                column: maxColumn,
                time: 0,
                elements: elements1,
                over: maxColumn * this.state.row,
                arr: arr1,
                historyPath: [],
                findtime: 0,
                findover: false
            });
        }
    }
    /**
     * 添加行数,n为添加的行数
     * @param {*} n 
     */
    addheight(n) {
        this.stop();
        var row = this.state.row;
        row = row + n;
        if (row > 0 && row * this.state.pixel <= this.state.maxheight) {
            var staticMatrix = this.initStaticMatrix(this.state.column, row);
            var dynamicMatrix = this.initDynamicMatrix(this.state.column, row);
            var elements = this.initElements(this.state.column, row);
            var arr = this.initArr(this.state.column, row);
            var start = Math.floor(Math.random() * this.state.column * row + 1);
            this.setState({
                staticMatrix: staticMatrix,
                dynamicMatrix: dynamicMatrix,
                begin: start,
                now: start,
                row: row,
                time: 0,
                elements: elements,
                over: this.state.column * row,
                arr: arr,
                historyPath: [],
                findtime: 0,
                findover: false
            });
        } else {
            var maxRow = Math.floor(this.state.maxheight / this.state.pixel);
            var staticMatrix1 = this.initStaticMatrix(this.state.column, maxRow);
            var dynamicMatrix1 = this.initDynamicMatrix(this.state.column, maxRow);
            var elements1 = this.initElements(this.state.column, maxRow);
            var arr1 = this.initArr(this.state.column, maxRow);
            var newstart = Math.floor(Math.random() * this.state.column * maxRow + 1);
            this.setState({
                staticMatrix: staticMatrix1,
                dynamicMatrix: dynamicMatrix1,
                begin: newstart,
                now: newstart,
                time: 0,
                row: maxRow,
                elements: elements1,
                over: this.state.column * maxRow,
                arr: arr1,
                historyPath: [],
                findtime: 0,
                findover: false
            });
        }
    }
    /**
     * 缩放界面大小,n为每个单位方格改变的像素数
     * @param {*} n 
     */
    big(n) {
        var pixel = this.state.pixel;
        pixel = pixel + n;
        if (pixel >= 5 && ((pixel * this.state.column <= this.state.maxwidth) && (pixel * this.state.row <= this.state.maxheight))) {
            this.setState({
                pixel: pixel
            });
            return;
        } 
        if(pixel < 5 ){
            this.info("已经最小,再小你就看不见了,你以为你是显微镜呀!");
            this.setState({
                pixel: 5
            });
        }else {
            this.info("不能再大了,笨蛋");
            this.setState({
                pixel: Math.floor((pixel * this.state.column / this.state.maxwidth > pixel * this.state.row / this.state.maxheight) ? (this.state.maxwidth / this.state.column) : (this.state.maxheight / this.state.row))
            });
        }
    }
    /**
     * 重置应用,使其除行列和大小外,其他因素设置成初始状态
     */
    resetAll() {
        this.stop();
        var staticMatrix = this.initStaticMatrix(this.state.column, this.state.row);
        var dynamicMatrix = this.initDynamicMatrix(this.state.column, this.state.row);
        var elements = this.initElements(this.state.column, this.state.row);
        var arr = this.initArr(this.state.column, this.state.row);
        var start = Math.floor(Math.random() * this.state.column * this.state.row + 1);
        this.setState({
            staticMatrix: staticMatrix,
            dynamicMatrix: dynamicMatrix,
            begin: start,
            now: start,
            time: 0,
            elements: elements,
            over: this.state.column * this.state.row,
            arr: arr,//路径元素编号信息
            historyPath: [],//路径栈
            findtime: 0,//用时显示
            findbegintime: 0,//起始时间
            findstoptime: 0,//完成时间
            findtimeID: 0,//定时器ID
            findover: false,//寻路完毕
            findStep: false,//是否参与过单步
            hide: false //是否隐藏界面中的标记
        });
    }
    /**
     * 重置应用,使其除行列和大小外,其他因素设置成初始状态
     */
    resetFind() {
        this.findStop();
        var arr = this.initArr(this.state.column, this.state.row);
        this.setState({
            arr: arr,//路径元素编号信息
            historyPath: [],//路径栈
            findtime: 0,//用时显示
            findbegintime: 0,//起始时间
            findstoptime: 0,//完成时间
            findtimeID: 0,//定时器ID
            findover: false,//寻路完毕
            findStep: false,//是否参与过单步
            hide: false //是否隐藏界面中的标记
        });
    }

    /**
     * 单步
     */
    step() {
        this.stop();
        this.handle();
        this.setState({
            step: true
        });
    }
    /**
     * 开始
     */
    start() {
        var timeID = this.state.timeID;
        if (timeID === 0) {
            timeID = setInterval(
                () => this.handle(),
                this.state.speed
            );
            this.setState({
                begintime: new Date().getTime() - this.state.time * 1000,
                timeID: timeID
            });
        }
        
    }
    /**
     * 暂停
     */
    stop() {
        var timeID = this.state.timeID;
        if (timeID !== 0) {
            clearInterval(timeID);
            this.setState({
                timeID: 0
            });
        }
        
    }
    /**
     * 改变速度,n为新的时间间隔,单位ms,每隔n ms时间,定时器调用一次相关方法
     * @param {*} n 
     */
    speed(n) {
        var timeID = this.state.timeID;
        if (timeID !== 0) {
            clearInterval(timeID);
            timeID = 0;
            timeID = setInterval(
                () => this.handle(),
                n
            );
        }
        var findtimeID = this.state.findtimeID;
        if (findtimeID !== 0) {
            clearInterval(findtimeID);
            findtimeID = 0;
            findtimeID = setInterval(
                () => this.findPath(),
                n
            );
        }
        var speedtype = "";
        if (n === 10) {
            speedtype = "极快";
        }
        if (n === 50) {
            speedtype = "快";
        }
        if (n === 100) {
            speedtype = "中";
        }
        if (n === 500) {
            speedtype = "慢";
        }
        if (n === 1000) {
            speedtype = "极慢";
        }
        this.setState({
            timeID: timeID,
            findtimeID: findtimeID,
            speed: n,
            speedtype: speedtype
        });
    }

    info(info){
        alert(info);
    }
}

export default AppDemo;

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    5 引用 • 15 回帖 • 224 关注
  • Sillot

    Sillot (汐洛)孵化自思源笔记,致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点
    Github 地址:https://github.com/Hi-Windom/Sillot

    14 引用 • 4 回帖 • 26 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 692 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 17 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 169 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 452 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    7 引用 • 26 回帖 • 3 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 242 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 251 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    284 引用 • 4481 回帖 • 656 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 398 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 553 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖 • 1 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖 • 2 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 15 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    21 引用 • 58 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    103 引用 • 294 回帖 • 3 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    139 引用 • 441 回帖 • 1 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 4 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    180 引用 • 447 回帖 • 2 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 745 关注
  • 安装

    你若安好,便是晴天。

    128 引用 • 1184 回帖 • 1 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    25 引用 • 215 回帖 • 163 关注