0

Five random numbers(from numbers array) will be shown one by one and we need to recall last four number by clicking the number. The answers are push to answer array after clicking. Now i need to compare answers array and number array to calculate the score. My problem is in scoring logic which is not working as expected. When the first guess(or any guess) is correct, then all the remaining guess are also counted as correct even its not.

link: https://codesandbox.io/s/pensive-pascal-rh6e13?file=/src/App.js

Below is the score calculation logic

useEffect(() => {
    if (answers.length) {
      if (numbers[4].num === answers[3]) {
        console.log(
          "match is--------------------------------1",
          numbers[4].num,
          answers[3]
        );
        setScore(score=> score + 1);
      } else if (numbers[3].num === answers[2]) {
        console.log(
          "match is--------------------------------2",
          numbers[3].num,
          answers[2]
        );
        setScore(score=> score + 1);
      } else if (numbers[2].num === answers[1]) {
        console.log(
          "match is--------------------------------3",
          numbers[2].num,
          answers[1]
        );
        setScore(score=> score + 1);
      } else if (numbers[1].num === answers[0]) {
        console.log(
          "match is--------------------------------4",
          numbers[1].num,
          answers[0]
        );
        setScore(score=> score + 1);
      } else {
        console.log("no match---------------------");
      }
    }
  }, [answers, numbers]);

3 Answers 3

1

You might want to simplify your calculation logic with a loop like that:

useEffect(() => {
    console.log("Checking result", answers, numbers);
    if (answers.length < numbers.length - 1) {
        return;
    }
    let i = 0;
    while (i < numbers.length - 1) {
        if (numbers[i + 1].num === answers[i]) {
            console.log("match is--------------------------------1");
            setScore((score) => score + 1);
        }
        i++;
    }
}, [answers, numbers]);

Here you have a fork of your demo with the changes I describe below:

https://codesandbox.io/s/elegant-sara-zftstd?file=/src/App.js

Sign up to request clarification or add additional context in comments.

Comments

1

You can calculate score doing sth like this:

const myScore = useMemo(() => {
    let points = 0;
    const numbersToCompare = numbers.filter((_, index) => index > 0);
    for (let i in numbersToCompare) {
      if (numbersToCompare[i].num === answers[i]) {
        points = points + 1;
      }
    }
    return points;
  }, [answers, numbers]);

Comments

1

The comparison of two arrays can be stored in a result array using Array.map , subsequently you can use Array.reduce to calculate a score.

Something like

const arr = [...Array(5)]
  .map( _ => Math.floor(Math.random() * 10) + 1 );
const fakeAnswer = [...Array(5)]
  .map( _ => Math.floor(Math.random() * 10) + 1 );
const results = arr.map((v, i) => v === fakeAnswer[i]);
const score = results.reduce( (acc, val) => acc + +val, 0);
console.log(`random values [${arr}]`);
console.log(`fakeAnswer: [${fakeAnswer}]\nresults: [${
  results}]\nscore: ${score}`);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.