- Błąd – linijka:
Kopiuj
currentRandomIndex = Math.floor(Math.random() * answers.length);
powinna wyglądać tak:
Kopiuj
currentRandomIndex = Math.floor(Math.random() * quizArr.length);
- Zapomniałem o jednej rzeczy w funkcji
getRandomQuestion
. Nie powinna ona zwracać "obiektu pytania" (bo nie ma to sensu dla jej obecnego przeznaczenia), tylko samo pytanie (ciąg znaków). Dlatego trzeba linjkę:
Kopiuj
return quizArr[currentRandomIndex];
zamienić na:
Kopiuj
return quizArr[currentRandomIndex].question;
- Literówka: instrukcję
showRandomQuestions();
zamień na showRandomQuestion();
- Widzisz teraz pytanie po uruchomieniu kodu. :) Zmienia się ono na inne i losowe po naciśnięciu przycisku "Wyślij".
Przejdźmy od razu do implementowania funkcji getRandomVariants
. Nie znalazłem kodu w tym wątku, który by odpowiadał dokładnie temu, co trzeba zrobić, więc od początku napiszemy:
- Funkcja powinna mieć jeden parametr – indeks "obiektu pytania".
- Losowanie odpowiedzi można zrobić na co najmniej dwa sposoby: 1) poprzez skopiowanie tablicy z odpowiedziami z obiektu pytania o podanym indeksie i w miarę losowania kolejnych odpowiedzi usuwanie z tej skopiowanej tablicy wylosowanych już odpowiedzi; 2) poprzez stworzenie pustej tablicy i w miarę losowania kolejnych odpowiedzi dodawanie ich do niej. Moim zdaniem lepiej wybrać wariant nr 2, bo jest mniej podatny na błędy (nie wiem, czy potrzebujesz uzasadnienie). Algorytm powinien przebiegać tak:
2.1. Tworzysz pustą tablicę answersIndices
.
2.2. Dla każdej odpowiedzi pytania o danym indeksie: (2.2.1.) losujesz indeks odpowiedzi dotąd, aż nie będzie on już obecny w tablicy answersIndices
; (2.2.2.) dodajesz ten indeks do tablicy answersIndices
.
- Funkcja powinna zwracać tablicę
answersIndices
.
Zamieszczę tu kod całej funkcji, bo zdaję sobie sprawę, że powyższy algorytm jest niezbyt czytelny. Jak czegoś nie rozumiesz, pytaj:
Kopiuj
function getRandomVariants(id) { // Punkt 1
const answersIndices = []; // Punkt 2.1
for (const a of quizArr[id].answers) { // Cała pętla for to punkt 2.2
let r = -1;
do {
r = Math.floor(Math.random() * quizArr[id].answers.length);
} while (answersIndices.includes(r)); // Cała pętla do-while to punkt 2.2.1
answersIndices.push(r); // Punkt 2.2.2
}
return answersIndices; // Punkt 3
}
Warto wspomnieć, że funkcja getRandomVariants
zwraca tablicę indeksów, a więc trochę nienajlepiej odpowiada to jej nazwie. Ja jestem zdania, że ważniejsza jest spójność kodu niż intuicyjność, więc na razie nie będziemy tego ruszać. Po skończeniu całości możemy się zastanowić nad zmianą nazw.