-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.js
133 lines (112 loc) · 4.02 KB
/
script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Function to load a random quote from the local quotes.json file
// Constants to access DOM elements
const quoteDisplayElement = document.getElementById("quoteDisplay");
const quoteInputElement = document.getElementById("quoteInput");
const timerElement = document.getElementById("timer");
let typingSpeed;
// Get the modal from W3 schools
var modal = document.getElementById("myModal");
var btn = document.getElementById("myBtn");
var span = document.getElementsByClassName("close")[0];
// When the user clicks on the button, open the modal
btn.onclick = function () {
modal.style.display = "block";
};
// When the user clicks on <span> (x), close the modal
span.onclick = function () {
modal.style.display = "none";
};
// When the user clicks anywhere outside of the modal, close it
window.onclick = function (event) {
if (event.target == modal) {
modal.style.display = "none";
}
};
// Event listener to handle typing input
quoteInputElement.addEventListener("input", () => {
const arrayQuote = quoteDisplayElement.querySelectorAll("span");
const arrayValue = quoteInputElement.value.split("");
let correct = true;
arrayQuote.forEach((characterSpan, index) => {
const character = arrayValue[index];
if (character == null) {
characterSpan.classList.remove("correct");
characterSpan.classList.remove("incorrect");
correct = false;
} else if (character === characterSpan.innerText) {
characterSpan.classList.add("correct");
characterSpan.classList.remove("incorrect");
} else {
characterSpan.classList.remove("correct");
characterSpan.classList.add("incorrect");
correct = false;
}
});
if (correct) {
typingSpeed = calculateTypingSpeed(startTime, new Date(), numberOfCharacters);
console.log("Typing Speed:", typingSpeed);
moveCarDivForward(typingSpeed);
renderNewQuote();
}
});
// Function to load a random quote from the local quotes.json file
async function getRandomQuote() {
try {
const response = await fetch('quotes.json'); // Correct path, assuming quotes.json is in the same folder
const quotes = await response.json();
// Pick a random quote from the array
const randomIndex = Math.floor(Math.random() * quotes.length);
return quotes[randomIndex].quote;
} catch (error) {
console.error('Error fetching the quote:', error);
return "Error loading quote.";
}
}
// Function to render a new quote on the screen
async function renderNewQuote() {
const quote = await getRandomQuote();
quoteDisplayElement.innerHTML = "";
quote.split("").forEach((character) => {
const characterSpan = document.createElement("span");
characterSpan.innerText = character;
quoteDisplayElement.appendChild(characterSpan);
});
quoteInputElement.value = null;
startTimer();
}
// Timer and game logic
let startTime;
let intervalId;
function startTimer() {
timerElement.innerText = 0;
startTime = new Date();
clearInterval(intervalId);
intervalId = setInterval(() => {
timerElement.innerText = getTimerTime();
moveCarDivForward(typingSpeed);
}, 1000); // No 'eval' here, directly using function
}
function getTimerTime() {
return Math.floor((new Date() - startTime) / 1000);
}
// Calculate typing speed
const numberOfCharacters = quoteInputElement.value.trim().split(/\s+/).length;
function calculateTypingSpeed(startTime, endTime, numberOfCharacters) {
const timeDiff = (endTime - startTime) / 60000;
const wordsPerMinute = numberOfCharacters / timeDiff;
return wordsPerMinute;
}
// Move the car div forward based on typing speed
function moveCarDivForward(typingSpeed) {
const pixelsPerWord = 1;
const distanceToAdd = pixelsPerWord * (typingSpeed * 10);
const carDiv = document.getElementById("carDiv");
const currentLeft = parseInt(carDiv.style.left) || 0;
const newLeft = currentLeft + distanceToAdd;
console.log("Moving Car:", newLeft, "pixels");
carDiv.style.left = newLeft + "px";
}
// window.onload to start the game after the page loads
window.onload = function () {
renderNewQuote();
};