canvas随机生成一个迷宫并自动寻找出口算法效果代码

代码语言:html

所属分类:其他

代码描述:canvas随机生成一个迷宫并自动寻找出口算法效果代码

代码标签: canvas 迷宫 破解

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en">

<head>

    <meta charset="UTF-8">





    <style>
        form {
          padding: 20px;
        }
        
        label {
          padding: 5px;
        }
    </style>

</head>

<body>
    <form name="mazedetails" action="javascript:letsGo()">

        <label for="width">Width:</label> <input type="number" name="width" id="width" value="40" size="5" min="2" max="40">

        <label for="height">Height:</label> <input type="number" name="height" id="height" value="24" size="5" min="2" max="40">

        <label for="boxsize">Box Size:</label> <input type="number" name="boxsize" id="boxsize" value="15" size="5" min="6" max="50">

        <input type="submit" value="Generate a new maze">

        <button type="button" onclick="javascript:solveAnimation()">Solve Animation</button>
    </form>

    <canvas id="mymaze" width="650" height="650"></canvas>


    <script>
        let maze, interval;
        
        class Square {
          constructor() {
            this.south = true;
            this.east = true;
            this.accessible = false;
            this.color = "white";
          }
          openSouth() {
            this.south = false;
          }
          openEast() {
            this.east = false;
          }
          markAccessible() {
            this.accessible = true;
          }
          setColor(color) {
            this.color = color;
          }}
        
        
        class Maze {
          constructor(height, width, pixels) {
            this.height = height;
            this.width = width;
            this.pixels = pixels;
            this.starth = -1;
            this.endh = -1;
            this.squares = new Array(height);
            for (let h = 0; h < height; h++) {
              this.squares[h] = new Array(width);
              for (let w = 0; w < width; w++) {
                this.squares[h][w] = new Square();
              }
            }
          }
          getRandomInt(min, max) {
            return Math.floor(Math.random() * (max - min) + min);
          }
          resetAccessibility() {
            for (let h = 1; h < this.height; h++) {
              for (let w = 1; w < this.width; w++) {
                this.squares[h][w].accessible = false;
                this.squares[h][w].setColor("white");
              }
            }
          }
          build() {
            for (let w = 0; w < this.width; w++) {
              this.squares[0][w].south = true;
              this.squares[0][w].east = false;
              this.squares[0][w].acessible = true;
            }
        
            for (let h = 0; h < this.height; h++) {
              this.squares[h][0].south = false;
              this.squares[h][0].east = true;
              this.squares[h][0].accessible = true;
            }
        
            this.squares[0][0].east = false;
        
            let start_w = this.getRandomInt(1, this.width);
            let start_h = this.getRandomInt(1, this.height);
        
            this.pipeline = [[start_h, start_w, -100, -100]];
            this.breakWall();
        
            this.starth = this.getRandomInt(1, this.height);
            this.endh = this.getRandomInt(1, this.height);
        
            this.squares[this.starth][0].east = false;
            this.squares[this.endh][this.width - 1].east = false;
          }
          addRoom(start_h, start_w, parent_h, parent_w) {
            if (
            start_h >= 1 &&
            start_h < this.height &&
            start_w >= 1 &&
            start_w < this.width &&
            !this.squares[start_h][start_w].accessible)
            {
              this.pipeline.push([start_h, start_w, parent_h, parent_w]);
            }
          }
          breakWall() {
            while (this.pipeline.length > 0) {
              let [start_h, start_w, parent_h, parent_w] = this.pipeline.pop();
        
              if (this.squares[start_h][start_w].accessible) {
                continue;
              }
        
              this.squares[start_h][start_w].markAccessible();
              if (start_h - 1 == parent_h) {
                this.squares[parent_h][parent_w].openSouth();
              }
              if (start_h + 1 == parent_h) {
                this.squares[start_h][start_w].openSouth();
              }
              if (start_w - 1 == parent_w) {
                this.squares[parent_h][parent_w].openEast();
              }
              if (start_w + 1 == parent_w) {
                this.squares[start_h][start_w].openEast();
              }
        
              let nextRooms = [
              [start_h + 1, start_w],
              [start_h - 1, start_w],
              [start_h, start_w + 1],
              [start_h, start_w - 1]];
        
              let swaps = nextRooms.length;
              while (swaps > 0) {
                let i = Math.floor(Math.random() * swaps);
                swaps--;
                [nextRooms[swaps], nextRooms[i]] = [nextRooms[i], nextRooms[swaps]];
              }
        
              for (let pair of nextRooms) {
                let [a, b] = pair;
                this.addRoom(a, b, start_h, start_w);
              }
            }
          }}
        
        
        class CanvasView {
          constructor(canvasID) {
            this.canvas = document.getElementById(canvasID);
            this.context = this.canvas.........完整代码请登录后点击上方下载按钮下载查看

网友评论0