簡體   English   中英

從 JavaScript 中的循環更新 DOM

[英]Update DOM from loop in JavaScript

我正在通過 Q Learning 算法制作迷宮求解器。 我有一個隨機生成的寬度 X 高度迷宮。 迷宮的每個單元格都是一個 div。 我有不同類型單元格的 CSS 代碼。

.wall {
        background-color: red;
}
.currentPosition {
        background-color: yellow;
}

想簡單的告訴Q Learning給不知道的人,基本上我們的agent(或者鼠標,你叫什么)改變它的position非常快,直到解決迷宮。

在此處輸入圖像描述

我期待像上面的 gif 這樣的結果。 我將“currentPosition”添加到代理所在單元格的類列表中。

這是我的偽代碼:

trainAgent()

function trainAgent(){
    for(let i = 0; i < generation number(like 1000000); i++){
        while(until agent goes to the goal or walls){
            // Do some calculations
            // Update some numbers in q matrix
            // Change current position of agent and add 'currentPosition' class to the new div
        }
    }
}
function setCurrentPoint(row, column){
if(currentPoint.div)
currentPoint.div.classList.remove("currentPoint")
currentPoint.row = row
currentPoint.column = column
currentPoint.div = mapMatrix[row][column]
currentPoint.div.classList.add('currentPoint')
}

我的問題從這里開始。 直到循環完成瀏覽器凍結。 所以我看不到agent的即時position。 我嘗試添加setTimeout()但沒有任何改變。 如果我在 Java 中執行此項目,我會在單獨的線程中執行它們,但我不知道在 JavaScript 中可以做什么。

也許我不明白你的問題,但我是如何解釋它的,你實際上想看到每個過程的每一步? 因為那時您需要深入了解 Async/Await。 這是您可以在代碼庫中使用的示例。 在這里,我創建了一個簡單的 3x3 網格,並在循環時更改了背景顏色。

 async function runner() { const elements = document.getElementsByClassName("tableItem"); let color = "hotpink"; for (let j = 0; j < 300; j++) { for (let i = 0; i < 9; i++) { const element = elements[i]; window.requestAnimationFrame(() => { element.style.backgroundColor = color; } ); await sleep(); } color = getRandomColor(); } } async function sleep() { return new Promise((resolve) => setTimeout(resolve, 300)); } function getRandomColor() { var letters = '0123456789ABCDEF'; var color = '#'; for (var i = 0; i < 6; i++) { color += letters[Math.floor(Math.random() * 16)]; } return color; }
 .table { display: grid; grid-template-columns: repeat(3, 100px); grid-template-rows: repeat(3, 100px); gap: 10px; }.table div { background-color: red; }
 <,DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width. initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="./test.css"> <script src="./test.js"></script> </head> <body onload="runner()"> <div class="table"> <div class="tableItem"></div> <div class="tableItem"></div> <div class="tableItem"></div> <div class="tableItem"></div> <div class="tableItem"></div> <div class="tableItem"></div> <div class="tableItem"></div> <div class="tableItem"></div> <div class="tableItem"></div> </div> </body> </html>

sleep function 只是為了模擬計算和顯示更改后的步驟。 如果沒有 Async/Await,您將看到一個白頁,並且在一切都完成后,您會看到最后一種顏色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM