const SUITS = '♠♥♦♣'; const NAMES = [ '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', ]; // Arbeitsschritt 1: Prüfung auf Name und Kartenfarbe const toName = (card) => { // Bei '10' sind die ersten 2 Zeichen der Name, sonst das erste Zeichen return card.startsWith('10') ? '10' : card[0]; }; const toSuit = (card) => card[card.length - 1]; // Arbeitsschritt 2: Validierung const isValidCard = (card) => { const name = toName(card); const suit = toSuit(card); return NAMES.includes(name) && SUITS.includes(suit); }; const isValidHand = (hand) => { return Array.isArray(hand) && hand.length === 5 && hand.every(isValidCard); }; // Arbeitsschritt 3: Sortierung const sortHand = (hand) => { const compareCards = (cardA, cardB) => { const nameIndexA = NAMES.indexOf(toName(cardA)); const nameIndexB = NAMES.indexOf(toName(cardB)); const suitIndexA = SUITS.indexOf(toSuit(cardA)); const suitIndexB = SUITS.indexOf(toSuit(cardB)); // Kartenposition = Gewichtungsfaktor × Position des Namens + Position der Kartenfarbe const positionA = SUITS.length * nameIndexA + suitIndexA; const positionB = SUITS.length * nameIndexB + suitIndexB; return positionA - positionB; }; return [...hand].sort(compareCards); }; // Arbeitsschritt 4: Kategorisierung const isFlush = (hand) => { if (!isValidHand(hand)) return false; const suits = hand.map(toSuit); return suits.every((suit) => suit === suits[0]); }; const isStraight = (hand) => { if (!isValidHand(hand)) return false; const sortedHand = sortHand(hand); const names = sortedHand.map(toName); const namesString = names.join(','); const allNamesString = NAMES.join(','); return allNamesString.includes(namesString); }; const isStraightFlush = (hand) => { return isStraight(hand) && isFlush(hand); }; const isRoyalFlush = (hand) => { if (!isStraightFlush(hand)) return false; const sortedHand = sortHand(hand); const names = sortedHand.map(toName); // Royal Flush muss mit 10 beginnen und mit A enden return names[0] === '10' && names[4] === 'A'; };