Fix stats and layout, implement automatic pausing/starting
This commit is contained in:
parent
d0c5959836
commit
5d85095ac1
@ -1,5 +1,4 @@
|
|||||||
function myFunction(elmnt) {
|
function myFunction(elmnt) {
|
||||||
console.log(elmnt.style.backgroundColor);
|
|
||||||
if (elmnt.style.backgroundColor == "white") {
|
if (elmnt.style.backgroundColor == "white") {
|
||||||
elmnt.style.backgroundColor = "hsl(120, 100%, 75%)";
|
elmnt.style.backgroundColor = "hsl(120, 100%, 75%)";
|
||||||
} else {
|
} else {
|
||||||
@ -60,7 +59,6 @@ function contains_digits(rows) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
function generate_rows_check() {
|
function generate_rows_check() {
|
||||||
console.log(rows);
|
|
||||||
var rows = new Array(generate_row(), generate_row(), generate_row());
|
var rows = new Array(generate_row(), generate_row(), generate_row());
|
||||||
while (!contains_digits(rows)) {
|
while (!contains_digits(rows)) {
|
||||||
var rows = new Array(generate_row(), generate_row(), generate_row());
|
var rows = new Array(generate_row(), generate_row(), generate_row());
|
||||||
|
@ -47,17 +47,18 @@
|
|||||||
<div id="numbers-container">
|
<div id="numbers-container">
|
||||||
<fieldset class="input-container">
|
<fieldset class="input-container">
|
||||||
<legend>Numbers</legend>
|
<legend>Numbers</legend>
|
||||||
<input class="number-input" type="number" min="1" max="90">
|
<input class="number-input" type="number" min="1" max="90" autocomplete="off">
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="results">
|
<div id="results">
|
||||||
<button id="pause">Pause</button>
|
<button id="pause">Start</button>
|
||||||
 
|
 
|
||||||
<b>
|
<b>
|
||||||
<span id="attempts">0</span> boards tried  
|
<span id="attempts">0</span> boards tried  
|
||||||
(<span id="speed">0.00</span>/sec)
|
(<span id="speed">0.00</span>/sec)
|
||||||
</b>
|
</b>
|
||||||
|
<div id="result-list"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
53
main.js
53
main.js
@ -1,14 +1,18 @@
|
|||||||
let paused = false;
|
let paused = false;
|
||||||
|
let autoStart = true;
|
||||||
let workers = [];
|
let workers = [];
|
||||||
let totalTime = 0;
|
let totalTime = 0;
|
||||||
|
let startedAt;
|
||||||
let totalAttempts = 0;
|
let totalAttempts = 0;
|
||||||
let names = [];
|
let names = [];
|
||||||
|
|
||||||
fetch("names.json").then(res => res.json()).then(json => names = json);
|
fetch("names.json").then(res => res.json()).then(json => names = json);
|
||||||
|
|
||||||
function showStats() {
|
function showStats() {
|
||||||
|
const time = totalTime + (Date.now() - startedAt);
|
||||||
|
|
||||||
document.getElementById("attempts").innerText = totalAttempts;
|
document.getElementById("attempts").innerText = totalAttempts;
|
||||||
document.getElementById("speed").innerText = (totalAttempts / totalTime).toFixed(2); // TODO fix totalTime
|
document.getElementById("speed").innerText = (totalAttempts / time).toFixed(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function log(text, workerId) {
|
function log(text, workerId) {
|
||||||
@ -36,7 +40,17 @@ function resetWorkers() {
|
|||||||
function runWorkers() {
|
function runWorkers() {
|
||||||
const numbers = [].map.call(document.getElementsByClassName("number-input"), input => input.valueAsNumber)
|
const numbers = [].map.call(document.getElementsByClassName("number-input"), input => input.valueAsNumber)
|
||||||
.filter(value => !isNaN(value));
|
.filter(value => !isNaN(value));
|
||||||
const winType = document.querySelector("input[name=win-type]:checked").value;
|
|
||||||
|
if (numbers.length < 4) return;
|
||||||
|
|
||||||
|
if (paused && !autoStart) return;
|
||||||
|
setPaused(false);
|
||||||
|
|
||||||
|
startedAt = Date.now();
|
||||||
|
|
||||||
|
const selectedWinType = document.querySelector("input[name=win-type]:checked");
|
||||||
|
const winType = selectedWinType.value;
|
||||||
|
const winTypeLabel = selectedWinType.parentElement.innerText.trim();
|
||||||
|
|
||||||
resetWorkers();
|
resetWorkers();
|
||||||
|
|
||||||
@ -63,7 +77,6 @@ function runWorkers() {
|
|||||||
if (!paused) worker.postMessage({ type: "run" });
|
if (!paused) worker.postMessage({ type: "run" });
|
||||||
break;
|
break;
|
||||||
case "stats":
|
case "stats":
|
||||||
totalTime += message.data.time;
|
|
||||||
totalAttempts += message.data.attempts;
|
totalAttempts += message.data.attempts;
|
||||||
|
|
||||||
showStats();
|
showStats();
|
||||||
@ -71,6 +84,16 @@ function runWorkers() {
|
|||||||
case "log":
|
case "log":
|
||||||
log(message.data.text, message.data.id);
|
log(message.data.text, message.data.id);
|
||||||
break;
|
break;
|
||||||
|
case "winner":
|
||||||
|
document.getElementById("result-list").innerHTML +=
|
||||||
|
`<div>
|
||||||
|
<span class="winner">Winner:</span> <b>${message.data.name}</b>
|
||||||
|
<br>
|
||||||
|
<small>(${winTypeLabel} — ${numbers.join(", ")})</small>
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
setPaused(true);
|
||||||
|
autoStart = true;
|
||||||
case "terminate":
|
case "terminate":
|
||||||
worker.terminate();
|
worker.terminate();
|
||||||
workers.splice(workers.indexOf(worker), 1);
|
workers.splice(workers.indexOf(worker), 1);
|
||||||
@ -83,6 +106,21 @@ function runWorkers() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setPaused(value) {
|
||||||
|
paused = value;
|
||||||
|
|
||||||
|
for (const worker of workers) {
|
||||||
|
worker.postMessage({ type: paused ? "stop" : "run" });
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById("pause").innerText = paused ? "Start" : "Pause";
|
||||||
|
|
||||||
|
if (paused)
|
||||||
|
totalTime += (Date.now() - startedAt);
|
||||||
|
|
||||||
|
startedAt = Date.now();
|
||||||
|
}
|
||||||
|
|
||||||
document.getElementById("numbers-container").addEventListener("keydown", event => {
|
document.getElementById("numbers-container").addEventListener("keydown", event => {
|
||||||
// Add new input field on enter
|
// Add new input field on enter
|
||||||
if (event.key === "Enter") {
|
if (event.key === "Enter") {
|
||||||
@ -136,13 +174,8 @@ document.getElementById("numbers-container").addEventListener("keydown", event =
|
|||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById("pause").addEventListener("click", event => {
|
document.getElementById("pause").addEventListener("click", event => {
|
||||||
paused = !paused;
|
setPaused(!paused);
|
||||||
|
autoStart = false;
|
||||||
for (const worker of workers) {
|
|
||||||
worker.postMessage({ type: paused ? "stop" : "run" });
|
|
||||||
}
|
|
||||||
|
|
||||||
event.target.innerText = paused ? "Start" : "Pause";
|
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById("workers").value = navigator.hardwareConcurrency ?? 1;
|
document.getElementById("workers").value = navigator.hardwareConcurrency ?? 1;
|
||||||
|
@ -43,6 +43,15 @@ main {
|
|||||||
width: 400px;
|
width: 400px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#result-list div {
|
||||||
|
margin-top: 1rem;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#result-list .winner {
|
||||||
|
color: #2E7D32;
|
||||||
|
}
|
||||||
|
|
||||||
#log {
|
#log {
|
||||||
height: 200px;
|
height: 200px;
|
||||||
width: 400px;
|
width: 400px;
|
||||||
|
@ -64,7 +64,6 @@ function guess() {
|
|||||||
const wonRows = getRowsWon(board, numbers);
|
const wonRows = getRowsWon(board, numbers);
|
||||||
|
|
||||||
if (hasWon(wonRows, winType)) {
|
if (hasWon(wonRows, winType)) {
|
||||||
console.log(board, board.filter(row => hasWonRow(row, numbers)), numbers);
|
|
||||||
self.postMessage({ type: "winner", name });
|
self.postMessage({ type: "winner", name });
|
||||||
self.postMessage({ type: "log", text: `Found winner: ${name}`, id: workerId });
|
self.postMessage({ type: "log", text: `Found winner: ${name}`, id: workerId });
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user