{"id":484,"date":"2026-01-28T16:05:58","date_gmt":"2026-01-28T15:05:58","guid":{"rendered":"https:\/\/boarscale.com\/?page_id=484"},"modified":"2026-03-08T08:12:14","modified_gmt":"2026-03-08T07:12:14","slug":"lab","status":"publish","type":"page","link":"https:\/\/boarscale.com\/index.php\/lab\/","title":{"rendered":"LAB"},"content":{"rendered":"\n<!-- CONTENEUR LAB -->\n<div style=\"\n    max-width: 90%;\n    width: 700px;\n    min-width: 250px;\n    margin: 3rem auto;\n    padding: 0 1rem;\n    box-sizing: border-box;\n\">\n    <div id=\"lab-quote-container\" style=\"\n        height: 140px;                    \/* hauteur fixe du bloc *\/\n        display: flex;\n        align-items: center;              \/* centrage vertical *\/\n        justify-content: center;          \/* centrage horizontal *\/\n        text-align: center;\n        box-sizing: border-box;\n    \">\n        <div id=\"lab-quote\" style=\"\n            font-style: italic;\n            font-size: clamp(0.9em, 2vw, 1.4em); \/* texte responsive *\/\n            line-height: 1.4em;\n            opacity: 0;\n            transition: opacity 1s, transform 1s;\n            word-break: break-word;          \/* casse les mots si trop longs *\/\n        \"><\/div>\n    <\/div>\n<\/div>\n\n<script>\nconst labQuotes = [\n  { text: \"There is no such thing as a failed experiment, only experiments with unexpected outcomes.\", author: \"R. Buckminster Fuller\", translation: \"Il n\u2019existe pas d\u2019exp\u00e9rience rat\u00e9e, seulement des exp\u00e9riences aux r\u00e9sultats inattendus.\" },\n  { text: \"I am discontented with what I know.\", author: \"H. P. Lovecraft\", translation: \"Je suis m\u00e9content de ce que je sais.\" },\n  { text: \"Experiment, experiment, experiment.\", author: \"Jack Dickerson\", translation: \"Exp\u00e9rimente, exp\u00e9rimente, exp\u00e9rimente.\" },\n  { text: \"All life is an experiment.\", author: \"Ralph Waldo Emerson\", translation: \"Toute vie est une exp\u00e9rience.\" },\n  { text: \"I love fools\u2019 experiments.\", author: \"Charles Darwin\", translation: \"J\u2019aime les exp\u00e9riences stupides.\" },\n  { text: \"Every great inspiration is but an experiment.\", author: \"Charles Ives\", translation: \"Toute grande inspiration n\u2019est qu\u2019une exp\u00e9rience.\" },\n  { text: \"Try things against your grain to find out what your grain really is.\", author: \"Irwin Greenberg\", translation: \"Essaie des choses contraires \u00e0 ton inclination pour d\u00e9couvrir ta vraie nature.\" },\n  { text: \"The best films come about through experimentation.\", author: \"Nick Park\", translation: \"Les meilleurs films naissent de l\u2019exp\u00e9rimentation.\" },\n  { text: \"No amount of experimentation can ever prove me right; a single experiment can prove me wrong.\", author: \"Albert Einstein\", translation: \"Aucun nombre d\u2019exp\u00e9riences ne peut jamais me prouver que j\u2019ai raison ; une seule exp\u00e9rience peut me prouver que j\u2019ai tort.\" },\n  { text: \"Negative results are just as valuable as positive ones.\", author: \"Thomas Edison\", translation: \"Les r\u00e9sultats n\u00e9gatifs ont autant de valeur que les positifs.\" },\n\n  { text: \"If it doesn\u2019t agree with experiment, it\u2019s wrong.\", author: \"Richard Feynman\", translation: \"Si cela n\u2019est pas confirm\u00e9 par l\u2019exp\u00e9rience, c\u2019est faux.\" },\n  { text: \"The first step toward knowledge is the discovery of something we do not understand.\", author: \"Unknown\", translation: \"Le premier pas vers la connaissance est la d\u00e9couverte de quelque chose que nous ne comprenons pas.\" },\n  { text: \"Logic will get you from A to B. Imagination will take you everywhere.\", author: \"Albert Einstein\", translation: \"La logique vous m\u00e8nera de A \u00e0 B. L\u2019imagination vous m\u00e8nera partout.\" },\n  { text: \"You can observe a lot just by watching.\", author: \"Yogi Berra\", translation: \"On peut beaucoup observer simplement en regardant.\" },\n  { text: \"I have not failed. I\u2019ve just found 10,000 ways that won\u2019t work.\", author: \"Thomas Edison\", translation: \"Je n\u2019ai pas \u00e9chou\u00e9. J\u2019ai simplement trouv\u00e9 10\u202f000 fa\u00e7ons qui ne fonctionnent pas.\" },\n  { text: \"A ship in harbor is safe, but that is not what ships are built for.\", author: \"John A. Shedd\", translation: \"Un navire au port est en s\u00e9curit\u00e9, mais ce n\u2019est pas pour cela qu\u2019on construit des navires.\" },\n  { text: \"The only way to discover the limits of the possible is to go beyond them into the impossible.\", author: \"Arthur C. Clarke\", translation: \"La seule fa\u00e7on de d\u00e9couvrir les limites du possible est d\u2019aller au\u2011del\u00e0 vers l\u2019impossible.\" },\n  { text: \"The universe is under no obligation to make sense to you.\", author: \"Neil deGrasse Tyson\", translation: \"L\u2019univers n\u2019est pas oblig\u00e9 d\u2019avoir du sens pour vous.\" },\n  { text: \"If you don\u2019t try, you\u2019ll never know.\", author: \"Anime proverb\", translation: \"Si tu n\u2019essaies pas, tu ne sauras jamais.\" },\n  { text: \"Experimentation is failure turned upward.\", author: \"Cultural axiom\", translation: \"L\u2019exp\u00e9rimentation est un \u00e9chec tourn\u00e9 vers le haut.\" },\n\n  { text: \"In order to be irreplaceable one must always be different.\", author: \"Coco Chanel\", translation: \"Pour \u00eatre irrempla\u00e7able, il faut \u00eatre toujours diff\u00e9rent.\" },\n  { text: \"Creativity is intelligence having fun.\", author: \"Albert Einstein\", translation: \"La cr\u00e9ativit\u00e9 est l\u2019intelligence qui s\u2019amuse.\" },\n  { text: \"The world is indeed comic, but the joke is on mankind.\", author: \"H.P. Lovecraft\", translation: \"Le monde est en effet comique, mais la plaisanterie est sur l\u2019humanit\u00e9.\" },\n  { text: \"Adventure is out there.\", author: \"Up\", translation: \"L\u2019aventure est l\u00e0\u2011dehors.\" },\n  { text: \"The greatest teacher, failure is.\", author: \"Yoda\", translation: \"L\u2019\u00e9chec est le plus grand ma\u00eetre.\" },\n  { text: \"We\u2019re explorers, not settlers.\", author: \"Sci\u2011fi ethos\", translation: \"Nous sommes des explorateurs, pas des colons.\" },\n  { text: \"To infinity and beyond!\", author: \"Buzz Lightyear\", translation: \"Vers l\u2019infini et au\u2011del\u00e0 !\" },\n  { text: \"You mustn\u2019t be afraid to dream a little bigger, darling.\", author: \"Inception\", translation: \"Il ne faut pas avoir peur de r\u00eaver un peu plus grand, ch\u00e9ri.\" },\n  { text: \"The universe is full of magical things patiently waiting for our wits to grow sharper.\", author: \"Eden Phillpotts\", translation: \"L\u2019univers est rempli de choses magiques attendant patiemment que notre esprit devienne plus vif.\" },\n  { text: \"That\u2019s one small step for man, one giant leap for mankind.\", author: \"Neil Armstrong\", translation: \"C\u2019est un petit pas pour l\u2019homme, un bond de g\u00e9ant pour l\u2019humanit\u00e9.\" },\n\n  { text: \"I never teach my pupils; I only attempt to provide the conditions in which they can learn.\", author: \"Albert Einstein\", translation: \"Je n\u2019enseigne jamais \u00e0 mes \u00e9l\u00e8ves ; j\u2019essaie seulement de fournir les conditions dans lesquelles ils peuvent apprendre.\" },\n  { text: \"Somewhere, something incredible is waiting to be known.\", author: \"Carl Sagan\", translation: \"Quelque part, quelque chose d\u2019incroyable attend d\u2019\u00eatre connu.\" },\n  { text: \"The most merciful thing in the world\u2026 is the inability of the human mind to correlate all its contents.\", author: \"H. P. Lovecraft\", translation: \"La chose la plus mis\u00e9ricordieuse au monde\u2026 est l\u2019incapacit\u00e9 de l\u2019esprit humain \u00e0 corr\u00e9ler tous ses contenus.\" },\n  { text: \"It is not the strongest of the species that survive, nor the most intelligent, but the one most responsive to change.\", author: \"Charles Darwin\", translation: \"Ce n\u2019est pas l\u2019esp\u00e8ce la plus forte qui survit, ni la plus intelligente, mais celle qui s\u2019adapte le mieux au changement.\" },\n  { text: \"You cannot discover new oceans unless you have the courage to lose sight of the shore.\", author: \"Andr\u00e9 Gide\", translation: \"On ne d\u00e9couvre pas de nouveaux oc\u00e9ans sans le courage de perdre de vue le rivage.\" },\n  { text: \"I have no special talent. I am only passionately curious.\", author: \"Albert Einstein\", translation: \"Je n\u2019ai aucun talent particulier. Je suis seulement passionn\u00e9ment curieux.\" },\n  { text: \"A fool sees not the same tree that a wise man sees.\", author: \"William Blake\", translation: \"Un imb\u00e9cile ne voit pas le m\u00eame arbre qu\u2019un sage.\" },\n  { text: \"Not failure, but low aim, is crime.\", author: \"James Russell Lowell\", translation: \"Ce n\u2019est pas l\u2019\u00e9chec, mais le faible objectif qui est un crime.\" },\n  { text: \"All men by nature desire knowledge.\", author: \"Aristotle\", translation: \"Tous les hommes d\u00e9sirent naturellement la connaissance.\" },\n  { text: \"I have learned more from my experiments than from my successes.\", author: \"Thomas Edison\", translation: \"J\u2019ai appris plus de mes exp\u00e9riences que de mes succ\u00e8s.\" },\n\n  { text: \"To invent, you need a good imagination and a pile of junk.\", author: \"Thomas Edison\", translation: \"Pour inventer, il faut une bonne imagination et un tas de bric-\u00e0-brac.\" },\n  { text: \"All great discoveries are made by mistake.\", author: \"Unknown\", translation: \"Toutes les grandes d\u00e9couvertes sont faites par erreur.\" },\n  { text: \"Without experimentation, nothing new can be discovered.\", author: \"Unknown\", translation: \"Sans exp\u00e9rimentation, rien de nouveau ne peut \u00eatre d\u00e9couvert.\" },\n  { text: \"Every act of creation is first an act of destruction.\", author: \"Pablo Picasso\", translation: \"Chaque acte de cr\u00e9ation est d\u2019abord un acte de destruction.\" },\n  { text: \"I am constantly experimenting.\", author: \"Salvador Dali\", translation: \"Je suis constamment en train d\u2019exp\u00e9rimenter.\" },\n  { text: \"I\u2019m going to try everything until I know what works.\", author: \"Monkey D. Luffy, One Piece\", translation: \"Je vais tout essayer jusqu\u2019\u00e0 savoir ce qui fonctionne.\" },\n  { text: \"If you don\u2019t take risks, you can\u2019t create anything new.\", author: \"Shinji Ikari, Neon Genesis Evangelion\", translation: \"Si tu ne prends pas de risques, tu ne peux rien cr\u00e9er de nouveau.\" },\n  { text: \"Oh, hello, sir. You caught me in the middle of an experiment.\", author: \"The Nutty Professor\", translation: \"Oh, bonjour, vous me surprenez en plein milieu d\u2019une exp\u00e9rience.\" },\n  { text: \"This planet is a game preserve. And we're the game.\", author: \"Predators\", translation: \"Cette plan\u00e8te est une r\u00e9serve de chasse. Et nous sommes le gibier.\" },\n\n  { text: \"All work and no play makes Jack a dull boy.\", author: \"The Shining\", translation: \"Rien que du travail et aucun loisir rendent Jack idiot.\" },\n  { text: \"I am Groot.\", author: \"Groot, Guardians of the Galaxy\", translation: \"Je suis Groot.\" },\n  { text: \"Why so serious?\", author: \"The Joker\", translation: \"Pourquoi si s\u00e9rieux ?\" },\n  { text: \"The cake is a lie.\", author: \"Portal\", translation: \"Le g\u00e2teau est un mensonge.\" },\n  { text: \"It\u2019s dangerous to go alone! Take this.\", author: \"The Legend of Zelda\", translation: \"C\u2019est dangereux d\u2019y aller seul ! Prends \u00e7a.\" },\n  { text: \"Do you want to build a snowman?\", author: \"Frozen\", translation: \"Veux\u2011tu construire un bonhomme de neige ?\" },\n  { text: \"All your experiments are belong to us.\", author: \"Parody\", translation: \"Toutes vos exp\u00e9riences nous appartiennent.\" },\n  { text: \"Resistance is futile.\", author: \"Star Trek\", translation: \"La r\u00e9sistance est futile.\" },\n  { text: \"Live long and prosper.\", author: \"Spock\", translation: \"Longue vie et prosp\u00e9rit\u00e9.\" },\n  { text: \"I find your lack of faith disturbing.\", author: \"Darth Vader\", translation: \"Je trouve votre manque de foi perturbant.\" },\n  { text: \"Not all those who wander are lost.\", author: \"J.R.R. Tolkien\", translation: \"Tous ceux qui errent ne sont pas perdus.\" },\n  { text: \"Do or do not. There is no try.\", author: \"Yoda\", translation: \"Fais-le ou ne le fais pas. Il n\u2019y a pas d\u2019essai.\" },\n  { text: \"Reality is wrong. Dreams are for real.\", author: \"Tupac Shakur\", translation: \"La r\u00e9alit\u00e9 est fausse. Les r\u00eaves sont r\u00e9els.\" },\n  { text: \"What we do in life echoes in eternity.\", author: \"Gladiator\", translation: \"Ce que nous faisons dans la vie r\u00e9sonne dans l\u2019\u00e9ternit\u00e9.\" },\n  { text: \"I\u2019m going to make him an offer he can\u2019t refuse.\", author: \"The Godfather\", translation: \"Je vais lui faire une offre qu\u2019il ne pourra pas refuser.\" },\n  { text: \"There\u2019s no place like home.\", author: \"The Wizard of Oz\", translation: \"Il n\u2019y a pas d\u2019endroit comme chez soi.\" }\n];\n\n\/\/ ======= Fonction pour afficher la citation =======\nfunction showRandomQuote(quotesArray, divId) {\n    const quoteDiv = document.getElementById(divId);\n    quoteDiv.style.opacity = 0; \/\/ fade out\n\n    setTimeout(() => {\n        const randomQuote = quotesArray[Math.floor(Math.random() * quotesArray.length)];\n\n        \/\/ l\u00e9ger d\u00e9calage al\u00e9atoire pour effet Boarscale\n        const offsetX = (Math.random() - 0.5) * 6; \n        const offsetY = (Math.random() - 0.5) * 6; \n        quoteDiv.style.transform = `translate(${offsetX}px, ${offsetY}px)`;\n\n        quoteDiv.innerHTML = `\"${randomQuote.text}\"<br><strong>\u2014 ${randomQuote.author}<\/strong>`;\n        quoteDiv.style.opacity = 1; \/\/ fade in\n    }, 500);\n}\n\n\/\/ ======= Initialisation =======\nshowRandomQuote(labQuotes, \"lab-quote\");\n\n\/\/ Changement toutes les 7 secondes\nsetInterval(() => showRandomQuote(labQuotes, \"lab-quote\"), 7000);\n<\/script>\n\n\n\n<div style=\"height:41px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><em>Recherches, essais, d\u00e9tours<\/em><\/h3>\n\n\n\n<p>Le Lab est un espace d\u2019exploration.<br>Il regroupe des travaux qui ne r\u00e9pondent pas \u00e0 une commande pr\u00e9cise, mais nourrissent la r\u00e9flexion : musique, images, textes, IA, exp\u00e9rimentations.<\/p>\n\n\n\n<p><em>Tout n\u2019y est pas fini.<br>Tout n\u2019y est pas utile.<\/em><\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-bbx-bento-box\" style=\"--bbx-box-grid-template-columns:repeat(3, 1fr);--bbx-box-grid-template-rows:repeat(3, 1fr);--bbx-box-grid-gap:1rem\">\n<div class=\"wp-block-bbx-bento-card hover-undefined\" style=\"--bbx-card-rotation-degree:5deg;--bbx-card-scale-factor:1.05;--bbx-card-tilt-degree:5deg;--bbx-card-glow-intensity:15px;--bbx-card-hover-shadow-color:rgb(0, 0, 0);--bbx-card-hover-glow-color-primary:rgb(255, 0, 255);--bbx-card-hover-glow-color-secondary:rgb(0, 255, 255);--bbx-card-grid-row:span 1;--bbx-card-grid-column:span 1;--bbx-card-shadow-offset-x:0px;--bbx-card-shadow-offset-y:0px;--bbx-card-shadow-blur:0px;--bbx-card-shadow-spread:0px\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/boarscale.com\/index.php\/brain-hack\/\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"927\" src=\"https:\/\/boarscale.com\/wp-content\/uploads\/2026\/03\/Brain-hack-logo-1024x927.png\" alt=\"\" class=\"wp-image-634\" srcset=\"https:\/\/boarscale.com\/wp-content\/uploads\/2026\/03\/Brain-hack-logo-1024x927.png 1024w, https:\/\/boarscale.com\/wp-content\/uploads\/2026\/03\/Brain-hack-logo-300x272.png 300w, https:\/\/boarscale.com\/wp-content\/uploads\/2026\/03\/Brain-hack-logo-768x695.png 768w, https:\/\/boarscale.com\/wp-content\/uploads\/2026\/03\/Brain-hack-logo-1536x1390.png 1536w, https:\/\/boarscale.com\/wp-content\/uploads\/2026\/03\/Brain-hack-logo-2048x1854.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/boarscale.com\/index.php\/evil-cookie\/\">Evil Cookie<\/a><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div id=\"morpion-container\">\n    <div class=\"morpion-header\">\n        <div class=\"m-status\" id=\"m-status\">\u00c0 TOI DE JOUER !<\/div>\n        <div class=\"m-score\">\n            <span style=\"color:#00e5ff\">TOI: <b id=\"score-p\">0<\/b><\/span>\n            <span style=\"color:#ff3333; margin-left:15px\">CPU: <b id=\"score-c\">0<\/b><\/span>\n        <\/div>\n    <\/div>\n\n    <div class=\"morpion-board\" id=\"morpion-board\">\n        <\/div>\n\n    <button id=\"m-restart-btn\">REJOUER<\/button>\n<\/div>\n\n<style>\n    #morpion-container {\n        font-family: 'Verdana', sans-serif;\n        max-width: 320px;\n        margin: 20px auto;\n        text-align: center;\n        background: #222;\n        padding: 20px;\n        border-radius: 15px;\n        box-shadow: 0 10px 30px rgba(0,0,0,0.5);\n    }\n\n    .morpion-header {\n        margin-bottom: 20px;\n        color: white;\n    }\n\n    .m-status {\n        font-weight: bold;\n        margin-bottom: 10px;\n        font-size: 14px;\n        text-transform: uppercase;\n        letter-spacing: 1px;\n    }\n\n    .morpion-board {\n        display: grid;\n        grid-template-columns: repeat(3, 1fr);\n        gap: 10px;\n        margin-bottom: 20px;\n    }\n\n    .m-cell {\n        background-color: #333;\n        aspect-ratio: 1 \/ 1; \/* Carr\u00e9 parfait *\/\n        border-radius: 8px;\n        cursor: pointer;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 40px;\n        font-weight: 900;\n        transition: all 0.2s;\n        box-shadow: inset 0 0 10px rgba(0,0,0,0.5);\n    }\n\n    .m-cell:hover { background-color: #444; }\n\n    \/* Couleurs des pions *\/\n    .m-cell.x { color: #00e5ff; text-shadow: 0 0 15px #00e5ff; }\n    .m-cell.o { color: #ff3333; text-shadow: 0 0 15px #ff3333; }\n    \n    \/* Case gagnante *\/\n    .m-cell.winner { background-color: #fff !important; color: #000 !important; text-shadow: none; }\n\n    #m-restart-btn {\n        background: #00e5ff;\n        color: #000;\n        border: none;\n        padding: 10px 25px;\n        border-radius: 50px;\n        font-weight: bold;\n        cursor: pointer;\n        text-transform: uppercase;\n        display: none; \/* Cach\u00e9 au d\u00e9but *\/\n    }\n    #m-restart-btn:hover { transform: scale(1.05); box-shadow: 0 0 15px #00e5ff; }\n\n<\/style>\n\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n    \/\/ Configuration\n    const boardEl = document.getElementById('morpion-board');\n    const statusEl = document.getElementById('m-status');\n    const restartBtn = document.getElementById('m-restart-btn');\n    const scorePEl = document.getElementById('score-p');\n    const scoreCEl = document.getElementById('score-c');\n    \n    let boardState = Array(9).fill(null);\n    let gameActive = true;\n    let scores = { player: 0, cpu: 0 };\n    \n    \/\/ Cr\u00e9ation de la grille (G\u00e9n\u00e9ration dynamique pour \u00e9viter les bugs HTML)\n    function initGrid() {\n        boardEl.innerHTML = '';\n        boardState.forEach((_, i) => {\n            const cell = document.createElement('div');\n            cell.classList.add('m-cell');\n            cell.dataset.index = i;\n            cell.addEventListener('click', onCellClick);\n            boardEl.appendChild(cell);\n        });\n    }\n\n    function onCellClick(e) {\n        const index = e.target.dataset.index;\n        \n        \/\/ Si case prise ou jeu fini, on arr\u00eate\n        if (boardState[index] || !gameActive) return;\n\n        \/\/ 1. Tour Joueur\n        playMove(index, 'x');\n\n        if (checkWin('x')) {\n            endGame('VICTOIRE !', 'player');\n            return;\n        }\n        if (checkDraw()) {\n            endGame('MATCH NUL', 'draw');\n            return;\n        }\n\n        \/\/ 2. Tour CPU (Petit d\u00e9lai pour le r\u00e9alisme)\n        gameActive = false; \/\/ Bloque les clics\n        statusEl.innerText = \"CPU R\u00c9FL\u00c9CHIT...\";\n        \n        setTimeout(() => {\n            if(gameActive === false && !checkWin('x')) { \/\/ Double v\u00e9rif\n                cpuTurn();\n            }\n        }, 600);\n    }\n\n    function playMove(index, player) {\n        boardState[index] = player;\n        const cell = boardEl.children[index];\n        cell.classList.add(player);\n        cell.innerText = player.toUpperCase();\n    }\n\n    function cpuTurn() {\n        \/\/ Logique simple : Bloquer ou Random\n        let bestMove = findBestMove();\n        playMove(bestMove, 'o');\n        \n        if (checkWin('o')) {\n            endGame('PERDU...', 'cpu');\n        } else if (checkDraw()) {\n            endGame('MATCH NUL', 'draw');\n        } else {\n            gameActive = true;\n            statusEl.innerText = \"\u00c0 TOI DE JOUER !\";\n        }\n    }\n\n    function findBestMove() {\n        const lines = [\n            [0,1,2],[3,4,5],[6,7,8],\n            [0,3,6],[1,4,7],[2,5,8],\n            [0,4,8],[2,4,6]\n        ];\n\n        \/\/ 1. Essayer de gagner ou bloquer\n        \/\/ On cherche s'il y a une ligne avec 2 symboles identiques et 1 vide\n        for(let symbol of ['o', 'x']) {\n            for(let line of lines) {\n                const [a,b,c] = line;\n                const vals = [boardState[a], boardState[b], boardState[c]];\n                if(vals.filter(v => v === symbol).length === 2 && vals.includes(null)) {\n                    return line[vals.indexOf(null)];\n                }\n            }\n        }\n\n        \/\/ 2. Sinon, prendre le centre si libre\n        if(boardState[4] === null) return 4;\n\n        \/\/ 3. Sinon, random parmi les vides\n        const emptyIndices = boardState.map((v, i) => v === null ? i : null).filter(v => v !== null);\n        return emptyIndices[Math.floor(Math.random() * emptyIndices.length)];\n    }\n\n    function checkWin(player) {\n        const lines = [\n            [0,1,2],[3,4,5],[6,7,8], \/\/ Horizontales\n            [0,3,6],[1,4,7],[2,5,8], \/\/ Verticales\n            [0,4,8],[2,4,6]          \/\/ Diagonales\n        ];\n\n        for(let line of lines) {\n            const [a, b, c] = line;\n            if(boardState[a] === player && boardState[b] === player && boardState[c] === player) {\n                \/\/ Highlight\n                boardEl.children[a].classList.add('winner');\n                boardEl.children[b].classList.add('winner');\n                boardEl.children[c].classList.add('winner');\n                return true;\n            }\n        }\n        return false;\n    }\n\n    function checkDraw() {\n        return !boardState.includes(null);\n    }\n\n    function endGame(msg, type) {\n        gameActive = false; \/\/ Jeu fini, clics bloqu\u00e9s\n        statusEl.innerText = msg;\n        restartBtn.style.display = 'inline-block';\n        \n        if(type === 'player') {\n            scores.player++;\n            scorePEl.innerText = scores.player;\n        } else if(type === 'cpu') {\n            scores.cpu++;\n            scoreCEl.innerText = scores.cpu;\n        }\n    }\n\n    \/\/ Bouton Rejouer\n    restartBtn.addEventListener('click', () => {\n        boardState.fill(null);\n        gameActive = true;\n        statusEl.innerText = \"\u00c0 TOI DE JOUER !\";\n        restartBtn.style.display = 'none';\n        initGrid();\n    });\n\n    \/\/ Lancement initial\n    initGrid();\n});\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Recherches, essais, d\u00e9tours Le Lab est un espace d\u2019exploration.Il regroupe des travaux qui ne r\u00e9pondent pas \u00e0 une commande pr\u00e9cise, mais nourrissent la r\u00e9flexion : musique, images, textes, IA, exp\u00e9rimentations. Tout n\u2019y est pas fini.Tout n\u2019y est pas utile. \u00c0 TOI DE JOUER ! TOI: 0 CPU: 0 REJOUER<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-484","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/boarscale.com\/index.php\/wp-json\/wp\/v2\/pages\/484","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/boarscale.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/boarscale.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/boarscale.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/boarscale.com\/index.php\/wp-json\/wp\/v2\/comments?post=484"}],"version-history":[{"count":24,"href":"https:\/\/boarscale.com\/index.php\/wp-json\/wp\/v2\/pages\/484\/revisions"}],"predecessor-version":[{"id":642,"href":"https:\/\/boarscale.com\/index.php\/wp-json\/wp\/v2\/pages\/484\/revisions\/642"}],"wp:attachment":[{"href":"https:\/\/boarscale.com\/index.php\/wp-json\/wp\/v2\/media?parent=484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}