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 (
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.
);
}
// 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 */}