js随机绘制迷宫及离开迷宫路线最优解代码

代码语言:html

所属分类:其他

代码描述:js随机绘制迷宫及离开迷宫路线最优解代码

代码标签: js 随机 绘制 迷宫 离开 迷宫 路线 最优解 代码

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

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

<head>
  <meta charset="UTF-8">
  

  
  
  
<style>
html {
  background-color: #eee;
  font-family: sans-serif;
}
h1 {
  text-align: center;
}
canvas {
  border: 1px solid #000;
  display: block;
  margin: 0 auto;
  background: #f0f0f0;
}
#controls {
  text-align: center;
  margin-top: 20px;
}
</style>

  
</head>

<body translate="no">
  <h1>Random Maze</h1>
<canvas id="mazeCanvas" width="600" height="600"></canvas>
<div id="controls">
  <input type="checkbox" id="showSolution" />
  <label for="showSolution">Show Solution</label>
</div>
  
      <script  >
const canvas = document.getElementById("mazeCanvas");
const ctx = canvas.getContext("2d");

const cols = 25;
const rows = 25;
const cellSize = canvas.width / cols;

let grid = [];
let stack = [];
let solutionPath = [];

class Cell {
  constructor(i, j) {
    this.i = i;
    this.j = j;
    this.walls = [true, true, true, true]; // top, right, bottom, left
    this.visited = false;
  }

  draw() {
    const x = this.i * cellSize;
    const y = this.j * cellSize;

    ctx.strokeStyle = "#000";
    ctx.lineWidth = 2;

    if (this.walls[0]) {
      ctx.beginPath();
      ctx.moveTo(x, y);
      ctx.lineTo(x + cellSize, y);
      ctx.stroke();
    }
    if (this.walls[1]) {
      ctx.beginPath();
      ctx.moveTo(x + cellSize, y);
      ctx.lineTo(x + cellSize, y + cellSize);
      ctx.stroke();
    }
    if (this.walls[2]) {
      ctx.beginPath();
      ctx.moveTo(x + cellSize, y + cellSize);
      ctx.lineTo(x, y + cellSize);
      ctx.stroke();
    }
    if (this.walls[3]) {
      ctx.beginPath();
      ctx.moveTo(x, y + cellSize);
      ctx.lineTo(x, y);
      ctx.stroke();
    }

    if (this.visited) {
      ctx.fillStyle = "#fff";
      ctx.fillRect(x, y, cellSize, cellSize);
    }
  }

  highlight(color) {
    const x = this.i * cellSize;
    const y = this.j * cellSize;
    ctx.fillStyle = color;
    ctx.fillRect(x, y, cellSize, cellSize);
  }

  checkNeighbors() {
    let neighbors = [];

    const top = grid[index(this.i, this.j - 1)];
    const right = grid[index(this.i + 1, this.j)];
    const bottom = grid[index(this.i, this.j + 1)];
    const left = grid[index(this.i - 1, this.j)];

    if (top && !top.visited) {
      neighbors.push(top);
    }
    if (right && !right.visited) {
      neighbors.push(right);
    }
    if (bottom && !bottom.visited) {
      neighbors.push(bottom);
    }
    if (left && !left.visited) {
      neighbors.push(left);
    }

    if (neighbors.length > 0) {
      const r = Math.floor(Math.random() * neighbors.length);
      return neighbors[r];
    } else {
      return undefined;
    }
  }}


function index(i, j) {
  if (i < 0 || j < 0 || i >= cols || j >= rows) {
    return -1;
  }
  return i + j * cols;
}

function setup() {
  for (let j = .........完整代码请登录后点击上方下载按钮下载查看

网友评论0