I am creating a lottery game and I am facing some problems. The player can choose 5 numbers and as soon as the player sends the 5 lottery numbers, the machine generates 5 random numbers. numbers 2, 3, 4, and 5 are the winning numbers. The problem is that when I select 5 numbers and there is the same number among the random generated numbers, there is no Match. The order does not matter, if there is a matching number, the player should win. Can you help what is missing? `
import { useEffect, useState } from "react";
import useLottoInfo from "./useLottoInfo";
import usePlayerInfo from "./usePlayerInfo";
const useGameLogic = () => {
const { playerName, playerBalance, setPlayerName, setPlayerBalance } =
usePlayerInfo();
const {
selectedNumbers,
lottoNumbers,
prize,
ticketList,
generatedNumbers,
hasResult,
setHasResult,
setSelectedNumbers,
setGeneratedNumbers,
setLottoNumbers,
setPrize,
setTicketList,
} = useLottoInfo();
const [numbersGenerated, setNumbersGenerated] = useState(false);
const [isGeneratingNumbers, setIsGeneratingNumbers] = useState(false);
useEffect(() => {
setLottoNumbers(generateRandomNumbers());
}, []);
const generateRandomNumbers = () => {
const numbers = [];
while (numbers.length < 5) {
const randomNum = Math.floor(Math.random() * 39) + 1;
if (!numbers.includes(randomNum)) {
numbers.push(randomNum);
}
}
return numbers;
};
const handleSelectNumber = (number) => {
if (selectedNumbers.length < 5 && !selectedNumbers.includes(number)) {
setSelectedNumbers([...selectedNumbers, number]);
}
};
const handleGenerateNumbers = () => {
if (isGeneratingNumbers || numbersGenerated) {
alert("You have already generated numbers for this ticket.");
return;
}
if (
playerBalance >= 500 &&
selectedNumbers.length === 5 &&
!hasResult &&
!numbersGenerated
) {
const matchingNumbers = selectedNumbers.filter((num) =>
lottoNumbers.some(
(lottoNum) =>
lottoNum === num &&
lottoNumbers.filter((n) => n === num).length === 1
)
);
let currentPrize = 0;
switch (matchingNumbers.length) {
case 1:
currentPrize = 200;
break;
case 2:
currentPrize = 400;
break;
case 3:
currentPrize = 600;
break;
case 4:
currentPrize = 1000;
break;
case 5:
currentPrize = 10000;
break;
default:
currentPrize = 0;
}
const newTicket = {
numbers: selectedNumbers,
matchingNumbers: matchingNumbers.length,
prize: currentPrize,
};
setTicketList([...ticketList, newTicket]);
setPlayerBalance(playerBalance + currentPrize - 500);
setGeneratedNumbers(generateRandomNumbers());
setHasResult(true);
setSelectedNumbers([]);
setIsGeneratingNumbers(true);
setNumbersGenerated(true);
} else {
alert("Please select exactly 5 numbers to generate your lottery ticket.");
}
};
const handleNewTicket = () => {
setNumbersGenerated(false);
setHasResult(false);
setIsGeneratingNumbers(false);
};
return {
playerName,
playerBalance,
selectedNumbers,
lottoNumbers,
prize,
ticketList,
generatedNumbers,
hasResult,
setHasResult,
setPlayerName,
setPlayerBalance,
setSelectedNumbers,
setGeneratedNumbers,
setLottoNumbers,
setPrize,
setTicketList,
handleSelectNumber,
handleGenerateNumbers,
handleNewTicket,
};
};
export default useGameLogic;