import React, { useState } from 'react'; import { Shield, CheckCircle, XCircle, ArrowRight, Play, RotateCcw, Award, Target, MoreVertical, Check } from 'lucide-react'; const INITIAL_QUESTIONS = [ { id: 1, text: "Zůstali tu jen (Vašek) rodiče.", options: ["Vaškovi", "Vaškovy"], correct: 0, explanation: "1. pád, množné číslo, rod mužský životný (ti rodiče). Zde se píše VŽDY měkké I." }, { id: 2, text: "Na stole ležely (bratr) sešity.", options: ["bratrovi", "bratrovy"], correct: 1, explanation: "1. pád, množné číslo, ale rod mužský NEŽIVOTNÝ (ty sešity). Proto tvrdé Y." }, { id: 3, text: "(Klára) bratři vůbec nepřišli.", options: ["Klářiny", "Klářini"], correct: 1, explanation: "1. pád, množné číslo, rod mužský životný (ti bratři). Měkké I." }, { id: 4, text: "Přinesla jsem knihu z (táta) knihovny.", options: ["tátovi", "tátovy"], correct: 1, explanation: "2. pád, rod ženský (z koho/čeho? z tátovy knihovny). Tvrdé Y." }, { id: 5, text: "Řídil se (šéf) příkazy.", options: ["šéfovými", "šéfovími"], correct: 0, explanation: "7. pád množného čísla (kým/čím se řídil?). V tomto pádě je vždy koncovka -ými." }, { id: 6, text: "Koupil oves pro (strýček) koně.", options: ["strýčkovi", "strýčkovy"], correct: 1, explanation: "4. pád (koupil pro koho/co?). I když jsou koně životní, ptáme se 'vidím koho, co'. Měkké I je pouze v 1. pádě! Zde je tvrdé Y." }, { id: 7, text: "Bojím se (soused) psů.", options: ["sousedových", "sousedovích"], correct: 0, explanation: "2. pád množného čísla (bez koho/čeho?). Koncovka je -ých." }, { id: 8, text: "Znáš (Karel) sestru?", options: ["Karlovu", "Karlovou"], correct: 0, explanation: "4. pád rodu ženského (vidím koho/co?). Skloňujeme jako 'matčinu' (Karlovu)." }, { id: 9, text: "Viděl jsem všechny (prezident) projevy.", options: ["prezidentovy", "prezidentovi"], correct: 0, explanation: "4. pád, množné číslo, rod mužský neživotný (ty projevy). Tvrdé Y." }, { id: 10, text: "To jsou (Honza) nejlepší nápady.", options: ["Honzovi", "Honzovy"], correct: 1, explanation: "1. pád, rod mužský neživotný (ty nápady). Tvrdé Y." }, { id: 11, text: "Navštívili jsme (babička) sousedy.", options: ["babiččini", "babiččiny"], correct: 1, explanation: "POZOR chyták! 4. pád (koho, co jsme navštívili?). Měkké I je jen v prvním pádě. Správně je tvrdé Y." }, { id: 12, text: "(Petr) kamarádi na nás už čekali.", options: ["Petrovi", "Petrovy"], correct: 0, explanation: "1. pád, rod mužský životný (ti kamarádi). Měkké I." }, { id: 13, text: "Půjčil jsem si (Pavel) boty.", options: ["Pavlovi", "Pavlovy"], correct: 1, explanation: "4. pád (koho, co jsem si půjčil?). Rod ženský (ty boty). Tvrdé Y." }, { id: 14, text: "(Učitel) otázky byly velmi těžké.", options: ["Učitelovy", "Učitelovi"], correct: 0, explanation: "1. pád, rod ženský (ty otázky). Tvrdé Y." }, { id: 15, text: "Hráli jsme si se (soused) psy.", options: ["sousedovími", "sousedovými"], correct: 1, explanation: "7. pád množného čísla (s kým, čím?). Koncovka je vždy -ými." }, { id: 16, text: "To jsou (doktor) chirurgické nástroje.", options: ["doktorovi", "doktorovy"], correct: 1, explanation: "1. pád, rod mužský neživotný (ty nástroje). Tvrdé Y." }, { id: 17, text: "Běž se zeptat (Jana) bratra.", options: ["Janiného", "Janina"], correct: 1, explanation: "2. pád (bez koho, čeho?). Skloňujeme jako 'matčina bratra'." }, { id: 18, text: "Dnes odpoledne přijedou (strýc) synové.", options: ["strýcovi", "strýcovy"], correct: 0, explanation: "1. pád, rod mužský životný (ti synové). Měkké I." }, { id: 19, text: "(Alena) vlasy byly krásně upravené.", options: ["Aleniny", "Alenini"], correct: 0, explanation: "1. pád, rod mužský neživotný (ty vlasy). Tvrdé Y." }, { id: 20, text: "Tyto (spisovatel) knihy mě vůbec nebaví.", options: ["spisovatelovi", "spisovatelovy"], correct: 1, explanation: "1. pád, rod ženský (ty knihy). Tvrdé Y." }, { id: 21, text: "Dívám se na (Kamil) nové obrazy.", options: ["Kamilovy", "Kamilovi"], correct: 0, explanation: "4. pád, rod mužský neživotný (vidím ty obrazy). Tvrdé Y." }, { id: 22, text: "Marně hledám (Hana) klíče.", options: ["Haniny", "Hanini"], correct: 0, explanation: "4. pád, rod mužský neživotný (ty klíče). Tvrdé Y." }, { id: 23, text: "Pozvali jsme (Lukáš) rodiče na večeři.", options: ["Lukášovy", "Lukášovi"], correct: 0, explanation: "CHYTÁK! 4. pád (vidím koho, co? rodiče). Měkké I se píše pouze v prvním pádě. Zde je tvrdé Y." }, { id: 24, text: "Kde jsou (Martin) lovečtí psi?", options: ["Martinovy", "Martinovi"], correct: 1, explanation: "1. pád, rod mužský životný (ti psi). Měkké I." }, { id: 25, text: "(Zdeněk) nápady se mi vždy líbí.", options: ["Zdeňkovy", "Zdeňkovi"], correct: 0, explanation: "1. pád, rod mužský neživotný (ty nápady). Tvrdé Y." }, { id: 26, text: "Na zahradě štěkali (Zuzana) psi.", options: ["Zuzaniny", "Zuzanini"], correct: 1, explanation: "1. pád, rod mužský životný (ti psi). Měkké I." }, { id: 27, text: "Četl jsem všechny (Karel Čapek) knihy.", options: ["Čapkovy", "Čapkovi"], correct: 0, explanation: "4. pád, rod ženský (ty knihy). Tvrdé Y." }, { id: 28, text: "Pozdravuj (Eliška) starší bratry.", options: ["Eliščini", "Eliščiny"], correct: 1, explanation: "CHYTÁK! 4. pád (koho, co mám pozdravovat?). I když jsou to bratři, není to 1. pád, takže píšeme tvrdé Y." }, { id: 29, text: "(Veronika) kamarádky nakonec nepřišly.", options: ["Veroničiny", "Veroničini"], correct: 0, explanation: "1. pád, rod ženský (ty kamarádky). Tvrdé Y." }, { id: 30, text: "Šli jsme tam za (Tomáš) kamarády.", options: ["Tomášovími", "Tomášovými"], correct: 1, explanation: "7. pád (s kým, čím?). Koncovka -ými." }, { id: 31, text: "Slyšel jsem na chodbě (Karel) kroky.", options: ["Karlovy", "Karlovi"], correct: 0, explanation: "4. pád, rod mužský neživotný (ty kroky). Tvrdé Y." }, { id: 32, text: "Kde jsou schované (dědeček) brýle?", options: ["dědečkovi", "dědečkovy"], correct: 1, explanation: "1. pád, rod ženský (ty brýle). Tvrdé Y." }, { id: 33, text: "Včera jsme v kině potkali (Lenka) sestry.", options: ["Lenčiny", "Lenčini"], correct: 0, explanation: "4. pád, rod ženský (ty sestry). Tvrdé Y." }, { id: 34, text: "(Zahradník) ovocné stromy krásně kvetou.", options: ["Zahradníkovy", "Zahradníkovi"], correct: 0, explanation: "1. pád, rod mužský neživotný (ty stromy). Tvrdé Y." }, { id: 35, text: "(Kuchař) recepty byly moc složité.", options: ["Kuchařovi", "Kuchařovy"], correct: 1, explanation: "1. pád, rod mužský neživotný (ty recepty). Tvrdé Y." }, { id: 36, text: "Šli tam i (Mirek) bývalí spolužáci.", options: ["Mirkovi", "Mirkovy"], correct: 0, explanation: "1. pád, rod mužský životný (ti spolužáci). Měkké I." }, { id: 37, text: "Dlouze jsem mluvil s (David) rodiči.", options: ["Davidovými", "Davidovími"], correct: 0, explanation: "7. pád (s kým, čím?). Koncovka -ými." }, { id: 38, text: "Rozzlobeně odmítl (ředitel) návrhy.", options: ["ředitelovi", "ředitelovy"], correct: 1, explanation: "4. pád, rod mužský neživotný (odmítl koho, co?). Tvrdé Y." }, { id: 39, text: "Už jsi viděl (Eva) výsledky?", options: ["Eviny", "Evini"], correct: 0, explanation: "4. pád, rod mužský neživotný (ty výsledky). Tvrdé Y." }, { id: 40, text: "Kde leží ty (předseda) důležité zprávy?", options: ["předsedovy", "předsedovi"], correct: 0, explanation: "1. pád, rod ženský (ty zprávy). Tvrdé Y." }, { id: 41, text: "Rychle otevři (Vojta) dopisy.", options: ["Vojtovi", "Vojtovy"], correct: 1, explanation: "4. pád, rod mužský neživotný (ty dopisy). Tvrdé Y." }, { id: 42, text: "Procházeli jsme se mezi (soused) domy.", options: ["sousedovými", "sousedovími"], correct: 0, explanation: "7. pád množného čísla. Koncovka -ými." }, { id: 43, text: "Znáš už (Lucie) názory na tuto věc?", options: ["Luciiny", "Luciini"], correct: 0, explanation: "4. pád, rod mužský neživotný (ty názory). Tvrdé Y." }, { id: 44, text: "(Dělník) těžké stroje se porouchaly.", options: ["Dělníkovi", "Dělníkovy"], correct: 1, explanation: "1. pád, rod mužský neživotný (ty stroje). Tvrdé Y." }, { id: 45, text: "Zaujaly mě (herečka) fantastické výkony.", options: ["hereččiny", "hereččini"], correct: 0, explanation: "1. pád, rod mužský neživotný (ty výkony). Tvrdé Y." }, { id: 46, text: "Odjeli pryč s (přítel) auty.", options: ["přítelovími", "přítelovými"], correct: 1, explanation: "7. pád množného čísla. Koncovka -ými." }, { id: 47, text: "To na fotce byli (Klára) učitelé ze střední.", options: ["Klářiny", "Klářini"], correct: 1, explanation: "1. pád, rod mužský životný (ti učitelé). Měkké I." }, { id: 48, text: "Nutně potřebuji (lékař) dobré rady.", options: ["lékařovy", "lékařovi"], correct: 0, explanation: "4. pád, rod ženský (ty rady). Tvrdé Y." }, { id: 49, text: "V rádiu hráli (zpěvák) staré písně.", options: ["zpěvákovi", "zpěvákovy"], correct: 1, explanation: "4. pád, rod ženský (ty písně). Tvrdé Y." }, { id: 50, text: "Kde jsou schované (František) peníze?", options: ["Františkovi", "Františkovy"], correct: 1, explanation: "1. pád, rod ženský (ty peníze). Tvrdé Y." } ]; const SHIELD_REQ = 5; const MAX_SHIELDS = 4; export default function App() { const [gameState, setGameState] = useState('start'); // start, playing, finished const [queue, setQueue] = useState([]); const [currentQuestion, setCurrentQuestion] = useState(null); // Herní statistiky const [shields, setShields] = useState(0); const [streak, setStreak] = useState(0); const [score, setScore] = useState({ correct: 0, mistakes: 0 }); // Stav aktuálního tahu const [selectedOption, setSelectedOption] = useState(null); const [isAnswerChecked, setIsAnswerChecked] = useState(false); // Cheat menu stavy a režimy const [isMenuOpen, setIsMenuOpen] = useState(false); const [isCheatMenuExpanded, setIsCheatMenuExpanded] = useState(false); const [isTomsModeOn, setIsTomsModeOn] = useState(false); const [isVercasModeOn, setIsVercasModeOn] = useState(false); const [isTatkasModeOn, setIsTatkasModeOn] = useState(false); // Inicializace hry const startGame = () => { const shuffled = [...INITIAL_QUESTIONS].sort(() => Math.random() - 0.5); setQueue(shuffled); setCurrentQuestion(shuffled[0]); setGameState('playing'); setShields(0); setStreak(0); setScore({ correct: 0, mistakes: 0 }); setIsMenuOpen(false); setIsCheatMenuExpanded(false); resetTurn(); }; const resetTurn = () => { setSelectedOption(null); setIsAnswerChecked(false); }; const handleOptionClick = (index) => { if (isAnswerChecked) return; setSelectedOption(index); }; const toggleMenu = () => { if (isMenuOpen) { setIsMenuOpen(false); setIsCheatMenuExpanded(false); } else { setIsMenuOpen(true); } }; const toggleTomsMode = () => { setIsTomsModeOn(!isTomsModeOn); if (!isTomsModeOn) { setIsVercasModeOn(false); setIsTatkasModeOn(false); } }; const toggleVercasMode = () => { setIsVercasModeOn(!isVercasModeOn); if (!isVercasModeOn) { setIsTomsModeOn(false); setIsTatkasModeOn(false); } }; const toggleTatkasMode = () => { setIsTatkasModeOn(!isTatkasModeOn); if (!isTatkasModeOn) { setIsTomsModeOn(false); setIsVercasModeOn(false); } }; const handleWinCheat = () => { setShields(4); setScore({ correct: 20, mistakes: 0 }); setGameState('finished'); setIsMenuOpen(false); setIsCheatMenuExpanded(false); }; const handleCorrectAnswerCheat = () => { if (!isAnswerChecked && currentQuestion) { checkAnswer(currentQuestion.correct); } setIsMenuOpen(false); setIsCheatMenuExpanded(false); }; const checkAnswer = (autoSubmitOption = null) => { const optionToEvaluate = typeof autoSubmitOption === 'number' ? autoSubmitOption : selectedOption; if (optionToEvaluate === null || !currentQuestion) return; if (typeof autoSubmitOption === 'number') { setSelectedOption(autoSubmitOption); } setIsAnswerChecked(true); // Vyhodnocení odpovědi (včetně hacků) let isCorrect = optionToEvaluate === currentQuestion.correct; if (isTomsModeOn || isTatkasModeOn) { isCorrect = true; } else if (isVercasModeOn) { isCorrect = false; } if (isCorrect) { setScore(s => ({ ...s, correct: s.correct + 1 })); const newStreak = streak + 1; if (newStreak === SHIELD_REQ) { setShields(s => s + 1); setStreak(0); // Reset série pro sbírání dalšího štítu } else { setStreak(newStreak); } } else { setScore(s => ({ ...s, mistakes: s.mistakes + 1 })); setStreak(0); // Vrácení špatně zodpovězené otázky na konec fronty setQueue(prev => [...prev, currentQuestion]); } }; const nextQuestion = () => { if (shields >= MAX_SHIELDS) { setGameState('finished'); return; } let nextQueue = queue.slice(1); if (nextQueue.length === 0) { nextQueue = [...INITIAL_QUESTIONS].sort(() => Math.random() - 0.5); } setQueue(nextQueue); setCurrentQuestion(nextQueue[0]); resetTurn(); }; if (gameState === 'start') { return (

Hardcore Test Přídavná Jména

🛡️ Za každých 5 správných odpovědí v řadě získáte štít.

❌ Pokud uděláte chybu, ztratíte aktuální sérii a otázka se vám později vrátí.

🏆 Cílem hry je nasbírat 4 štíty.

); } if (gameState === 'finished') { return (
{shields}

Vítězství!

Dokázali jste nasbírat všechny 4 štíty. Pravopis přídavných jmen přivlastňovacích máte v malíčku.

Správně
{score.correct}
Chyby
{score.mistakes}
); } // PLAYING STATE // Vypočtení finální správnosti pro aktuální tah (s ohledem na režimy) let isEvaluatedCorrect = false; if (isAnswerChecked && currentQuestion) { if (isTomsModeOn || isTatkasModeOn) { isEvaluatedCorrect = true; } else if (isVercasModeOn) { isEvaluatedCorrect = false; } else { isEvaluatedCorrect = selectedOption === currentQuestion.correct; } } const questionTextParts = (currentQuestion?.text || "").split(/\((.*?)\)/); return (
{/* Hlavní panel / HUD */}
{shields} / {MAX_SHIELDS}
Série do štítu
{[1, 2, 3, 4, 5].map(i => (
= i ? 'bg-green-500 shadow-sm' : 'bg-slate-200'}`} /> ))}
{/* Tajné cheatovací menu */}
{isMenuOpen && (
{!isCheatMenuExpanded ? (
) : (
)}
)}
{/* Hlavní obsah */}
{/* Karta s otázkou */}

{questionTextParts.map((part, i) => i % 2 !== 0 ? ({part}) : part )}

{/* Možnosti */}
{currentQuestion?.options.map((opt, idx) => { let buttonStyle = "bg-slate-50 border-slate-200 hover:bg-blue-50 hover:border-blue-300 text-slate-700"; let showCheck = false; let showCross = false; if (isAnswerChecked) { if (isTomsModeOn || isTatkasModeOn) { // Všechno kliknuté je správně if (idx === selectedOption) { buttonStyle = "bg-green-100 border-green-500 text-green-800 z-10 ring-1 ring-green-500"; showCheck = true; } else { buttonStyle = "bg-slate-50 border-slate-200 text-slate-400 opacity-50"; } } else if (isVercasModeOn) { // Všechno kliknuté je špatně, ani se neukazuje to správné if (idx === selectedOption) { buttonStyle = "bg-red-50 border-red-300 text-red-700 opacity-70"; showCross = true; } else { buttonStyle = "bg-slate-50 border-slate-200 text-slate-400 opacity-50"; } } else { // Normální režim if (idx === currentQuestion.correct) { buttonStyle = "bg-green-100 border-green-500 text-green-800 z-10 ring-1 ring-green-500"; showCheck = true; } else if (idx === selectedOption) { buttonStyle = "bg-red-50 border-red-300 text-red-700 opacity-70"; showCross = true; } else { buttonStyle = "bg-slate-50 border-slate-200 text-slate-400 opacity-50"; } } } else if (selectedOption === idx) { buttonStyle = "bg-blue-100 border-blue-500 text-blue-800 ring-1 ring-blue-500"; } return ( ); })}
{/* Akční tlačítka a zpětná vazba */}
{!isAnswerChecked ? ( ) : (
{isEvaluatedCorrect ?
:
}

{isEvaluatedCorrect ? 'Správně!' : 'Ajaj, chybička... ztrácíš sérii.'}

{/* Vysvětlení se ukáže pouze, pokud není zapnutý žádný ze speciálních módů */} {(!isTomsModeOn && !isVercasModeOn && !isTatkasModeOn) && (

{currentQuestion?.explanation}

)}
)}
); }