{"id":7968,"date":"2024-09-30T23:04:02","date_gmt":"2024-09-30T20:04:02","guid":{"rendered":"http:\/\/www.temrinler.com\/?p=7968"},"modified":"2025-12-05T10:51:25","modified_gmt":"2025-12-05T07:51:25","slug":"tas-alma-oyunu","status":"publish","type":"post","link":"https:\/\/www.temrinler.com\/?p=7968","title":{"rendered":"15 Ta\u015f Oyunu"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>15 Ta\u015f Oyunu (Nim)<\/title>\n    <!-- Tailwind CSS CDN -->\n    <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n    <style>\n        \/* Inter yaz\u0131 tipini ve yumu\u015fak bir arka plan\u0131 uygulama *\/\n        body {\n            font-family: 'Inter', sans-serif;\n        }\n        \/* Se\u00e7ilen ta\u015flara \u00f6zel animasyon ve g\u00f6r\u00fcn\u00fcm *\/\n        .stone.selected {\n            transform: scale(1.1);\n            background-color: #ef4444; \/* red-500 *\/\n            box-shadow: 0 0 15px #ef4444;\n        }\n        \/* Modal ve y\u00fcklenme stilleri *\/\n        .modal-content-area {\n             max-height: 70vh;\n             overflow-y: auto;\n        }\n    <\/style>\n<\/head>\n<body class=\"bg-gray-900 text-white min-h-screen flex items-center justify-center p-4 transition-all duration-300\">\n\n    <div class=\"game-container w-full max-w-2xl mx-auto bg-gray-800 rounded-2xl shadow-2xl p-6 md:p-10 relative overflow-hidden\">\n\n        <!-- Ba\u015flang\u0131\u00e7 Ekran\u0131 -->\n        <div id=\"start-screen\" class=\"space-y-6\">\n            <h1 class=\"text-4xl md:text-5xl font-bold text-center text-cyan-400\">15 Ta\u015f Oyunu<\/h1>\n            <div class=\"space-y-4\">\n                <div>\n                    <label for=\"player1\" class=\"block text-sm font-medium text-gray-300 mb-1\">1. Oyuncu Ad\u0131<\/label>\n                    <input type=\"text\" id=\"player1\" placeholder=\"Oyuncu 1\" class=\"w-full p-3 bg-gray-700 border border-gray-600 rounded-lg text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-cyan-500 focus:border-cyan-500\">\n                <\/div>\n                <div>\n                    <label for=\"player2\" class=\"block text-sm font-medium text-gray-300 mb-1\">2. Oyuncu Ad\u0131<\/label>\n                    <input type=\"text\" id=\"player2\" placeholder=\"Oyuncu 2\" class=\"w-full p-3 bg-gray-700 border border-gray-600 rounded-lg text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-cyan-500 focus:border-cyan-500\">\n                <\/div>\n                 <!-- Hata Mesaj\u0131 Alan\u0131 -->\n                <p id=\"start-warning\" class=\"text-red-400 text-sm h-5\"><\/p>\n                <button onclick=\"startGame()\" class=\"w-full bg-cyan-600 hover:bg-cyan-700 text-white font-bold py-3 px-6 rounded-lg text-lg transition duration-300 ease-in-out transform hover:scale-105 shadow-lg\">\n                    <span class=\"btn-text\">Oyunu Ba\u015flat<\/span>\n                <\/button>\n                <button onclick=\"explainGame(this)\" class=\"w-full bg-purple-600 hover:bg-purple-700 text-white font-bold py-3 px-6 rounded-lg text-lg transition duration-300 ease-in-out transform hover:scale-105 shadow-lg\">\n                    <span class=\"btn-text\">\u2728 Oyunu Anlat<\/span>\n                <\/button>\n            <\/div>\n        <\/div>\n\n        <!-- Oyun Ekran\u0131 -->\n        <div id=\"game-screen\" class=\"hidden space-y-6\">\n            <h2 class=\"text-2xl font-semibold text-center\">S\u0131radaki Oyuncu: \n                <span id=\"current-player\" class=\"font-bold text-cyan-400\"><\/span>\n            <\/h2>\n            \n            <!-- Ta\u015f Gruplar\u0131 -->\n            <div id=\"stone-groups\" class=\"flex flex-col items-center space-y-4 p-4 bg-gray-900\/50 rounded-lg\">\n                <div class=\"stone-group flex justify-center space-x-2\" data-group=\"1\">\n                    <div class=\"stone\"><\/div>\n                <\/div>\n                <div class=\"stone-group flex justify-center space-x-2\" data-group=\"2\">\n                    <div class=\"stone\"><\/div><div class=\"stone\"><\/div>\n                <\/div>\n                <div class=\"stone-group flex justify-center space-x-2\" data-group=\"3\">\n                    <div class=\"stone\"><\/div><div class=\"stone\"><\/div><div class=\"stone\"><\/div>\n                <\/div>\n                <div class=\"stone-group flex justify-center space-x-2\" data-group=\"4\">\n                    <div class=\"stone\"><\/div><div class=\"stone\"><\/div><div class=\"stone\"><\/div><div class=\"stone\"><\/div>\n                <\/div>\n                <div class=\"stone-group flex justify-center space-x-2\" data-group=\"5\">\n                    <div class=\"stone\"><\/div><div class=\"stone\"><\/div><div class=\"stone\"><\/div><div class=\"stone\"><\/div><div class=\"stone\"><\/div>\n                <\/div>\n            <\/div>\n            \n            <!-- Stilize Edilmi\u015f Ta\u015flar (CSS ile y\u00f6netilecek) -->\n            <style>\n                .stone {\n                    width: 40px;\n                    height: 40px;\n                    background-color: #3b82f6; \/* blue-500 *\/\n                    border-radius: 50%;\n                    display: inline-block;\n                    margin: 4px;\n                    cursor: pointer;\n                    transition: all 0.2s ease-in-out;\n                    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);\n                }\n                .stone:hover {\n                    transform: scale(1.1);\n                    background-color: #60a5fa; \/* blue-400 *\/\n                }\n            <\/style>\n\n            <!-- Uyar\u0131 Mesaj\u0131 -->\n            <p id=\"warning\" class=\"text-red-400 text-center h-5 text-sm\"><\/p>\n            \n            <button onclick=\"takeStones()\" class=\"w-full bg-red-600 hover:bg-red-700 text-white font-bold py-3 px-6 rounded-lg text-lg transition duration-300 ease-in-out transform hover:scale-105 shadow-lg\">\n                <span class=\"btn-text\">Ta\u015flar\u0131 Al<\/span>\n            <\/button>\n            <button onclick=\"getHint(this)\" class=\"w-full bg-teal-600 hover:bg-teal-700 text-white font-bold py-3 px-6 rounded-lg text-lg transition duration-300 ease-in-out transform hover:scale-105 shadow-lg\">\n                <span class=\"btn-text\">\u2728 Strateji \u0130pucu<\/span>\n            <\/button>\n        <\/div>\n\n        <!-- Biti\u015f Ekran\u0131 -->\n        <div id=\"end-screen\" class=\"hidden text-center space-y-8\">\n            <div class=\"winner-animation\">\n                <div class=\"text-6xl mb-4\">\ud83c\udf89<\/div>\n                <h1 class=\"winner text-4xl md:text-5xl font-bold text-green-400\">\n                    Kazanan: <span id=\"winner-name\"><\/span>\n                <\/h1>\n            <\/div>\n            <button onclick=\"resetGame()\" class=\"w-full max-w-xs mx-auto bg-cyan-600 hover:bg-cyan-700 text-white font-bold py-3 px-6 rounded-lg text-lg transition duration-300 ease-in-out transform hover:scale-105 shadow-lg\">\n                Yeni Oyun\n            <\/button>\n        <\/div>\n\n        <!-- Gemini Modal Penceresi -->\n        <div id=\"gemini-modal\" class=\"hidden fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center p-4 z-50 transition-opacity duration-300\">\n            <div class=\"bg-gray-800 rounded-2xl shadow-2xl p-6 md:p-8 w-full max-w-xl border border-gray-700\">\n                <div class=\"flex justify-between items-center mb-4\">\n                    <h3 id=\"modal-title\" class=\"text-2xl font-bold text-cyan-400\">Modal Ba\u015fl\u0131\u011f\u0131<\/h3>\n                    <button onclick=\"closeModal()\" class=\"text-gray-400 hover:text-white text-3xl\">&times;<\/button>\n                <\/div>\n                <div id=\"modal-content\" class=\"modal-content-area text-gray-300 whitespace-pre-wrap\">\n                    \u0130\u00e7erik buraya gelecek&#8230;\n                <\/div>\n                <button onclick=\"closeModal()\" class=\"mt-6 w-full bg-cyan-600 hover:bg-cyan-700 text-white font-bold py-2 px-4 rounded-lg transition duration-300\">\n                    Kapat\n                <\/button>\n            <\/div>\n        <\/div>\n\n    <\/div>\n\n    <script>\n        \/\/ Gemini API Anahtar\u0131 (Canvas ortam\u0131 taraf\u0131ndan sa\u011flan\u0131r)\n        const apiKey = \"\"; \/\/ Bu alan\u0131 bo\u015f b\u0131rak\u0131n, Canvas otomatik olarak dolduracakt\u0131r.\n\n        let players = [];\n        let currentPlayerIndex = 0;\n        let selectedStones = [];\n        let selectedGroup = null;\n\n        \/\/ Gerekli DOM elementlerini se\u00e7me\n        const startScreen = document.getElementById('start-screen');\n        const gameScreen = document.getElementById('game-screen');\n        const endScreen = document.getElementById('end-screen');\n        const player1Input = document.getElementById('player1');\n        const player2Input = document.getElementById('player2');\n        const startWarning = document.getElementById('start-warning');\n        const gameWarning = document.getElementById('warning');\n        const currentPlayerSpan = document.getElementById('current-player');\n        const winnerNameSpan = document.getElementById('winner-name');\n        \n        \/\/ Modal Elementleri\n        const geminiModal = document.getElementById('gemini-modal');\n        const modalTitle = document.getElementById('modal-title');\n        const modalContent = document.getElementById('modal-content');\n\n        function startGame() {\n            const player1 = player1Input.value.trim();\n            const player2 = player2Input.value.trim();\n            \n            \/\/ alert() yerine inline hata mesaj\u0131\n            if (!player1 || !player2) {\n                startWarning.textContent = 'L\u00fctfen iki oyuncunun da ad\u0131n\u0131 girin!';\n                return;\n            }\n\n            players = [player1, player2];\n            startWarning.textContent = ''; \/\/ Hata mesaj\u0131n\u0131 temizle\n            startScreen.classList.add('hidden');\n            gameScreen.classList.remove('hidden');\n            \n            updateCurrentPlayer();\n            setupStoneClickListeners();\n        }\n\n        function setupStoneClickListeners() {\n            const stones = document.querySelectorAll('.stone');\n            stones.forEach(stone => {\n                \/\/ Her oyunda t\u0131klama dinleyicilerini yeniden eklemek yerine\n                \/\/ 'data-listener' attribute'u ile kontrol edebiliriz\n                \/\/ veya resetGame'de klonlama yapabiliriz.\n                \/\/ \u015eimdilik basit tutal\u0131m:\n                stone.addEventListener('click', handleStoneClick);\n            });\n        }\n        \n        function handleStoneClick(event) {\n            const stone = event.target;\n            const group = stone.parentElement;\n            const groupNum = group.getAttribute('data-group');\n\n            if (selectedGroup && selectedGroup !== groupNum) {\n                gameWarning.textContent = 'Sadece bir gruptan ta\u015f alabilirsiniz!';\n                return;\n            }\n\n            gameWarning.textContent = '';\n            selectedGroup = groupNum;\n            \n            if (stone.classList.contains('selected')) {\n                stone.classList.remove('selected');\n                selectedStones = selectedStones.filter(s => s !== stone);\n                \/\/ E\u011fer son se\u00e7ili ta\u015f da kald\u0131r\u0131ld\u0131ysa, grubu s\u0131f\u0131rla\n                if (selectedStones.length === 0) {\n                    selectedGroup = null;\n                }\n            } else {\n                stone.classList.add('selected');\n                selectedStones.push(stone);\n            }\n        }\n\n        function takeStones() {\n            if (selectedStones.length === 0) {\n                gameWarning.textContent = 'L\u00fctfen en az bir ta\u015f se\u00e7in!';\n                return;\n            }\n\n            selectedStones.forEach(stone => stone.remove());\n            selectedStones = [];\n            selectedGroup = null;\n            gameWarning.textContent = ''; \/\/ Uyar\u0131y\u0131 temizle\n\n            \/\/ Kalan ta\u015f var m\u0131 kontrol et\n            if (document.querySelectorAll('.stone').length === 0) {\n                endGame();\n                return;\n            }\n\n            \/\/ S\u0131radaki oyuncuya ge\u00e7\n            currentPlayerIndex = (currentPlayerIndex + 1) % 2;\n            updateCurrentPlayer();\n        }\n\n        function updateCurrentPlayer() {\n            currentPlayerSpan.textContent = players[currentPlayerIndex];\n        }\n\n        function endGame() {\n            gameScreen.classList.add('hidden');\n            endScreen.classList.remove('hidden');\n            \/\/ Son ta\u015f\u0131 alan oyuncu de\u011fil, di\u011fer oyuncu kazan\u0131r\n            \/\/ (Orijinal Nim kural\u0131 genelde son ta\u015f\u0131 alan kaybeder \u015feklindedir,\n            \/\/ ancak kodunuzun mant\u0131\u011f\u0131 son ta\u015f\u0131 almay\u0131 biti\u015f say\u0131yor.\n            \/\/ Orijinal kodunuz (currentPlayerIndex + 1) % 2 idi, yani \n            \/\/ ta\u015f\u0131 al\u0131p s\u0131ray\u0131 devreden oyuncu de\u011fil, s\u0131ray\u0131 devralacak olan kazan\u0131yordu.\n            \/\/ Bu da son ta\u015f\u0131 alan\u0131n kaybetti\u011fi anlam\u0131na gelir. \n            \/\/ E\u011fer son ta\u015f\u0131 alan kazan\u0131rsa, kazanan 'players[currentPlayerIndex]' olmal\u0131.\n            \/\/ Kodunuzdaki mant\u0131\u011fa sad\u0131k kal\u0131yorum:\n            const winner = players[(currentPlayerIndex + 1) % 2];\n            winnerNameSpan.textContent = winner;\n        }\n\n        function resetGame() {\n            \/\/ Basit\u00e7e sayfay\u0131 yenilemek en temiz y\u00f6ntemdir\n            \/\/ ve oyunun t\u00fcm durumunu s\u0131f\u0131rlar.\n            location.reload();\n        }\n\n        \/\/ --- Gemini API Fonksiyonlar\u0131 ---\n\n        \/\/ Hata durumunda \u00fcssel geri \u00e7ekilme (exponential backoff) ile fetch i\u015flemini dener.\n        \/\/ @param {string} url - API endpoint URL'si.\n        \/\/ @param {object} options - Fetch ayarlar\u0131 (method, headers, body).\n        \/\/ @param {number} retries - Kalan deneme say\u0131s\u0131.\n        \/\/ @param {number} delay - Denemeler aras\u0131 bekleme s\u00fcresi (ms).\n        \/\/ @returns {Promise<object>} - API'den gelen JSON yan\u0131t\u0131.\n        async function fetchWithBackoff(url, options, retries = 5, delay = 1000) {\n            try {\n                const response = await fetch(url, options);\n                if (!response.ok) {\n                    \/\/ Tekrar denenebilir hatalar (\u00f6rn: 429, 503)\n                    if ((response.status === 429 || response.status === 503) && retries > 0) {\n                        \/\/ console.warn(`API Hatas\u0131 (${response.status}). ${delay}ms sonra tekrar denenecek...`);\n                        await new Promise(resolve => setTimeout(resolve, delay));\n                        return fetchWithBackoff(url, options, retries - 1, delay * 2);\n                    } else {\n                        throw new Error(`API Hatas\u0131: ${response.status} ${response.statusText}`);\n                    }\n                }\n                return await response.json();\n            } catch (error) {\n                if (retries > 0) {\n                    \/\/ A\u011f hatas\u0131 vb. durumlarda tekrar dene\n                    \/\/ console.warn(`Fetch Hatas\u0131: ${error.message}. ${delay}ms sonra tekrar denenecek...`);\n                    await new Promise(resolve => setTimeout(resolve, delay));\n                    return fetchWithBackoff(url, options, retries - 1, delay * 2);\n                } else {\n                    \/\/ console.error(\"API \u00e7a\u011fr\u0131s\u0131 birden fazla denemeden sonra ba\u015far\u0131s\u0131z oldu:\", error);\n                    throw error;\n                }\n            }\n        }\n\n        \/\/ Gemini API'ye bir istek g\u00f6nderir ve metin yan\u0131t\u0131n\u0131 al\u0131r.\n        \/\/ @param {string} userQuery - Kullan\u0131c\u0131n\u0131n API'ye g\u00f6nderdi\u011fi sorgu\/prompt.\n        \/\/ @param {string} systemPrompt - API'nin rol\u00fcn\u00fc ve davran\u0131\u015f\u0131n\u0131 belirleyen sistem talimat\u0131.\n        \/\/ @returns {Promise<string>} - API'den gelen metin yan\u0131t\u0131.\n        async function callGeminiAPI(userQuery, systemPrompt) {\n            const apiUrl = `https:\/\/generativelanguage.googleapis.com\/v1beta\/models\/gemini-2.5-flash-preview-09-2025:generateContent?key=${apiKey}`;\n            \n            const payload = {\n                contents: [{ parts: [{ text: userQuery }] }],\n                systemInstruction: {\n                    parts: [{ text: systemPrompt }]\n                },\n            };\n\n            try {\n                const result = await fetchWithBackoff(apiUrl, {\n                    method: 'POST',\n                    headers: { 'Content-Type': 'application\/json' },\n                    body: JSON.stringify(payload)\n                });\n\n                if (result.candidates && result.candidates[0].content && result.candidates[0].content.parts[0].text) {\n                    return result.candidates[0].content.parts[0].text;\n                } else {\n                    \/\/ console.error(\"API yan\u0131t\u0131nda beklenen i\u00e7erik bulunamad\u0131:\", result);\n                    return \"Modelden ge\u00e7erli bir yan\u0131t al\u0131namad\u0131. L\u00fctfen daha sonra tekrar deneyin.\";\n                }\n            } catch (error) {\n                \/\/ console.error('Gemini API \u00e7a\u011fr\u0131s\u0131 s\u0131ras\u0131nda hata olu\u015ftu:', error);\n                return \"API'ye ba\u011flan\u0131rken bir hata olu\u015ftu. L\u00fctfen internet ba\u011flant\u0131n\u0131z\u0131 kontrol edin ve tekrar deneyin.\";\n            }\n        }\n\n        \/\/ --- Modal Kontrol Fonksiyonlar\u0131 ---\n\n        \/\/ Modal pencereyi g\u00f6sterir.\n        \/\/ @param {string} title - Modal ba\u015fl\u0131\u011f\u0131.\n        \/\/ @param {string} content - Modal i\u00e7eri\u011fi (metin).\n        function showModal(title, content) {\n            modalTitle.textContent = title;\n            modalContent.textContent = content; \/\/ Metni do\u011frudan ekler\n            geminiModal.classList.remove('hidden');\n        }\n\n        \/\/ Modal pencereyi kapat\u0131r.\n        function closeModal() {\n            geminiModal.classList.add('hidden');\n        }\n\n        \/\/ --- D\u00fc\u011fme Y\u00fcklenme Durumu Fonksiyonlar\u0131 ---\n\n        \/\/ Bir d\u00fc\u011fmeyi y\u00fcklenme durumuna al\u0131r (devre d\u0131\u015f\u0131 b\u0131rak\u0131r, metni de\u011fi\u015ftirir).\n        \/\/ @param {HTMLElement} buttonElement - Hedef d\u00fc\u011fme.\n        function showLoading(buttonElement) {\n            buttonElement.disabled = true;\n            buttonElement.classList.add('opacity-70', 'cursor-not-allowed');\n            const textSpan = buttonElement.querySelector('.btn-text');\n            if (textSpan) {\n                textSpan.textContent = 'D\u00fc\u015f\u00fcn\u00fcyor...';\n            }\n        }\n\n        \/\/ Bir d\u00fc\u011fmeyi y\u00fcklenme durumundan \u00e7\u0131kar\u0131r.\n        \/\/ @param {HTMLElement} buttonElement - Hedef d\u00fc\u011fme.\n        \/\/ @param {string} originalText - D\u00fc\u011fmenin orijinal metni.\n        function hideLoading(buttonElement, originalText) {\n            buttonElement.disabled = false;\n            buttonElement.classList.remove('opacity-70', 'cursor-not-allowed');\n            const textSpan = buttonElement.querySelector('.btn-text');\n            if (textSpan) {\n                textSpan.textContent = originalText;\n            }\n        }\n\n        \/\/ --- Yeni Gemini \u00d6zellik Fonksiyonlar\u0131 ---\n\n        \/\/ \"Oyunu Anlat\" d\u00fc\u011fmesine t\u0131kland\u0131\u011f\u0131nda \u00e7al\u0131\u015f\u0131r.\n        \/\/ @param {HTMLElement} buttonElement - T\u0131klanan d\u00fc\u011fme.\n        async function explainGame(buttonElement) {\n            const originalText = buttonElement.querySelector('.btn-text').textContent;\n            showLoading(buttonElement);\n\n            const systemPrompt = \"Sen bir oyun uzman\u0131s\u0131n. Nim oyununu (1, 2, 3, 4, 5 ta\u015fl\u0131k gruplarla oynanan) yeni ba\u015flayan birine basit\u00e7e a\u00e7\u0131kla.\";\n            const userQuery = \"15 Ta\u015f (Nim) oyununun kurallar\u0131 nelerdir? Oyunun amac\u0131 nedir? Ayr\u0131ca, kazanmak i\u00e7in karma\u015f\u0131k matematik (Nim-sum gibi) kullanmadan basit bir stratejik ipucu ver. Cevab\u0131n k\u0131sa ve anla\u015f\u0131l\u0131r olsun.\";\n\n            const responseText = await callGeminiAPI(userQuery, systemPrompt);\n            \n            showModal(\"\u2728 Oyun Hakk\u0131nda\", responseText);\n            hideLoading(buttonElement, originalText);\n        }\n\n        \/\/ \"Strateji \u0130pucu\" d\u00fc\u011fmesine t\u0131kland\u0131\u011f\u0131nda \u00e7al\u0131\u015f\u0131r.\n        \/\/ @param {HTMLElement} buttonElement - T\u0131klanan d\u00fc\u011fme.\n        async function getHint(buttonElement) {\n            const originalText = buttonElement.querySelector('.btn-text').textContent;\n            showLoading(buttonElement);\n\n            const gameState = getCurrentGameState();\n            const currentPlayerName = players[currentPlayerIndex];\n\n            const systemPrompt = \"Sen bir Nim oyunu strateji uzman\u0131s\u0131n. Oyuncuya, mevcut duruma g\u00f6re bir sonraki hamlesi i\u00e7in ak\u0131ll\u0131ca bir ipucu vereceksin. Do\u011frudan '\u015fu kadar ta\u015f\u0131 \u015fu gruptan al' deme, bunun yerine '\u015fu gruplara odaklanmak ak\u0131ll\u0131ca olabilir' veya 'rakibine nas\u0131l bir durum b\u0131rakman gerekti\u011fini d\u00fc\u015f\u00fcn' gibi yol g\u00f6sterici bir tavsiye ver.\";\n            const userQuery = `\u015eu an s\u0131ra bende (Oyuncu: ${currentPlayerName}). Oyundaki gruplarda kalan ta\u015f say\u0131lar\u0131 \u015f\u00f6yle: [${gameState.join(', ')}]. Bana kazanmam i\u00e7in stratejik bir ipucu ver. Basit ve yol g\u00f6sterici olsun.`;\n            \n            const responseText = await callGeminiAPI(userQuery, systemPrompt);\n\n            showModal(\"\u2728 Strateji \u0130pucu\", responseText);\n            hideLoading(buttonElement, originalText);\n        }\n\n        \/\/ Oyundaki mevcut ta\u015f durumunu bir dizi olarak d\u00f6nd\u00fcr\u00fcr.\n        \/\/ @returns {number[]} - Her gruptaki ta\u015f say\u0131lar\u0131n\u0131 i\u00e7eren bir dizi.\n        function getCurrentGameState() {\n            const groups = document.querySelectorAll('#stone-groups .stone-group');\n            const state = [];\n            groups.forEach(group => {\n                const stoneCount = group.querySelectorAll('.stone').length;\n                if (stoneCount > 0) { \/\/ Sadece i\u00e7inde ta\u015f olan gruplar\u0131 dikkate al\n                    state.push(stoneCount);\n                }\n            });\n            return state;\n        }\n\n    <\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>15 Ta\u015f Oyunu (Nim) 15 Ta\u015f Oyunu 1. Oyuncu Ad\u0131 2. Oyuncu Ad\u0131 Oyunu Ba\u015flat \u2728 Oyunu Anlat S\u0131radaki Oyuncu: Ta\u015flar\u0131 Al \u2728 Strateji \u0130pucu \ud83c\udf89 Kazanan: Yeni Oyun Modal Ba\u015fl\u0131\u011f\u0131 &times; \u0130\u00e7erik buraya gelecek&#8230; Kapat<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/www.temrinler.com\/index.php?rest_route=\/wp\/v2\/posts\/7968"}],"collection":[{"href":"https:\/\/www.temrinler.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.temrinler.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.temrinler.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.temrinler.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7968"}],"version-history":[{"count":8,"href":"https:\/\/www.temrinler.com\/index.php?rest_route=\/wp\/v2\/posts\/7968\/revisions"}],"predecessor-version":[{"id":8256,"href":"https:\/\/www.temrinler.com\/index.php?rest_route=\/wp\/v2\/posts\/7968\/revisions\/8256"}],"wp:attachment":[{"href":"https:\/\/www.temrinler.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7968"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.temrinler.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7968"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.temrinler.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7968"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}