import React, { useState, useEffect, useCallback, useContext } from 'react'; import { Link } from 'react-router-dom'; import { ArrowLeftIcon, CardsThreeIcon, ArrowUpIcon, ArrowDownIcon, ArrowsClockwiseIcon, TrophyIcon, ChartBarIcon, EyeIcon, TargetIcon, } from '@phosphor-icons/react'; import { motion, AnimatePresence } from 'framer-motion'; import Seo from '../../components/Seo'; import { ToastContext } from '../../context/ToastContext'; import BreadcrumbTitle from '../../components/BreadcrumbTitle'; import GenerativeArt from '../../components/GenerativeArt'; import { useAchievements } from '../../context/AchievementContext'; const suits = ['♠', '♥', '♦', '♣']; const ranks = [ '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', ]; const getDeck = () => { const deck = []; for (const suit of suits) { for (const rank of ranks) { deck.push({ suit, rank, value: ranks.indexOf(rank) + 2 }); } } return shuffleDeck(deck); }; const shuffleDeck = (deck) => { for (let i = deck.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [deck[i], deck[j]] = [deck[j], deck[i]]; } return deck; }; const CardGamePage = () => { const appName = 'Higher or Lower'; const { addToast } = useContext(ToastContext); const { unlockAchievement } = useAchievements(); const [deck, setDeck] = useState([]); const [currentCard, setCurrentCard] = useState(null); const [nextCard, setNextCard] = useState(null); const [score, setScore] = useState(0); const [gameOver, setGameOver] = useState(false); const [gameStarted, setGameStarted] = useState(false); const [isProcessing, setIsProcessing] = useState(false); const startGame = useCallback(() => { const newDeck = getDeck(); const firstCard = newDeck.pop(); setDeck(newDeck); setCurrentCard(firstCard); setNextCard(null); setScore(0); setGameOver(false); setGameStarted(true); addToast({ message: 'DECK_INITIALIZED: Sequence ready.', type: 'info' }); }, [addToast]); useEffect(() => { if (!gameStarted) { startGame(); } }, [gameStarted, startGame]); const handleGuess = async (guess) => { if (gameOver || !currentCard || isProcessing) return; setIsProcessing(true); const drawnNextCard = deck.pop(); setDeck([...deck]); setNextCard(drawnNextCard); // Short delay for visual tension await new Promise((resolve) => setTimeout(resolve, 600)); const isHigher = drawnNextCard.value > currentCard.value; const isLower = drawnNextCard.value < currentCard.value; const isSame = drawnNextCard.value === currentCard.value; let correct = false; if (guess === 'higher' && isHigher) correct = true; else if (guess === 'lower' && isLower) correct = true; else if (isSame) { addToast({ message: 'PROBABILITY_STALEMATE: Value parity detected.', type: 'warning', }); setCurrentCard(drawnNextCard); setNextCard(null); setIsProcessing(false); return; } if (correct) { setScore((s) => s + 1); setCurrentCard(drawnNextCard); setNextCard(null); addToast({ message: 'PREDICTION_VERIFIED', type: 'success' }); } else { setGameOver(true); if (score > 20) unlockAchievement('legendary_gambler'); if (score > 14) unlockAchievement('high_roller'); if (score > 7) unlockAchievement('card_shark'); addToast({ message: 'PREDICTION_FAILED: Sequence terminated.', type: 'error', }); } setIsProcessing(false); }; const renderCard = (card, isNext = false) => { if (!card) return (
Probability forecasting protocol. Predict the next{' '} numerical value {' '} within the shuffled sequence.
Final_Yield: {score}