{"id":2715,"date":"2026-04-28T21:50:22","date_gmt":"2026-04-28T21:50:22","guid":{"rendered":"https:\/\/www.nmp.unirc.it\/?page_id=2715"},"modified":"2026-04-28T21:50:23","modified_gmt":"2026-04-28T21:50:23","slug":"tris","status":"publish","type":"page","link":"https:\/\/www.nmp.unirc.it\/?page_id=2715","title":{"rendered":"TRIS"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"it\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <title>Tris NMP 2026<\/title>\n\n  <style>\n    * {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n    }\n\n    body {\n      min-height: 100vh;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-family: Arial, sans-serif;\n      background: #f4f4f4;\n      color: #222;\n      padding: 20px;\n    }\n\n    .game-wrapper {\n      width: 100%;\n      max-width: 440px;\n      text-align: center;\n      background: white;\n      border: 3px solid #222;\n      border-radius: 18px;\n      padding: 22px;\n      box-shadow: 0 8px 22px rgba(0, 0, 0, 0.12);\n    }\n\n    h1 {\n      font-size: 28px;\n      margin-bottom: 8px;\n    }\n\n    .subtitle {\n      margin-bottom: 18px;\n      color: #555;\n      font-size: 14px;\n    }\n\n    .scoreboard {\n      display: grid;\n      grid-template-columns: repeat(3, 1fr);\n      gap: 8px;\n      margin-bottom: 18px;\n    }\n\n    .score-box {\n      border: 2px solid #ddd;\n      border-radius: 12px;\n      padding: 10px 6px;\n      font-weight: bold;\n      background: #fafafa;\n    }\n\n    .score-box span {\n      display: block;\n      margin-top: 4px;\n      font-size: 20px;\n      color: #2f78b7;\n    }\n\n    #status {\n      min-height: 28px;\n      margin-bottom: 16px;\n      font-weight: bold;\n      font-size: 18px;\n      color: #173b6c;\n    }\n\n    .board {\n      display: grid;\n      grid-template-columns: repeat(3, 1fr);\n      gap: 10px;\n      margin-bottom: 18px;\n    }\n\n    .cell {\n      aspect-ratio: 1 \/ 1;\n      border: 3px solid #222;\n      border-radius: 16px;\n      background: linear-gradient(135deg, #ffffff, #e9f5ff);\n      font-size: clamp(34px, 12vw, 58px);\n      font-weight: 900;\n      cursor: pointer;\n      transition: transform 0.12s ease, background 0.12s ease;\n      color: #222;\n    }\n\n    .cell:hover {\n      transform: translateY(-2px);\n      background: #eaf4ff;\n    }\n\n    .cell:disabled {\n      cursor: not-allowed;\n      transform: none;\n    }\n\n    .cell.player {\n      color: #222;\n    }\n\n    .cell.computer {\n      color: #2f78b7;\n      font-size: clamp(22px, 8vw, 34px);\n      line-height: 1;\n    }\n\n    .cell.win {\n      background: #dff5e5;\n      border-color: #238636;\n    }\n\n    .actions {\n      display: flex;\n      gap: 10px;\n      justify-content: center;\n      flex-wrap: wrap;\n    }\n\n    button.action-btn {\n      border: none;\n      border-radius: 999px;\n      padding: 11px 18px;\n      font-weight: bold;\n      cursor: pointer;\n      background: #2f78b7;\n      color: white;\n      font-size: 15px;\n    }\n\n    button.action-btn.secondary {\n      background: #222;\n    }\n\n    .hint {\n      margin-top: 14px;\n      color: #666;\n      font-size: 13px;\n    }\n  <\/style>\n<\/head>\n\n<body>\n  <div class=\"game-wrapper\">\n    <h1>Tris NMP 2026<\/h1>\n    <p class=\"subtitle\">Tu giochi con X, NMP gioca con il badge.<\/p>\n\n    <div class=\"scoreboard\">\n      <div class=\"score-box\">Tu<span id=\"playerScore\">0<\/span><\/div>\n      <div class=\"score-box\">Pareggi<span id=\"drawScore\">0<\/span><\/div>\n      <div class=\"score-box\">NMP<span id=\"computerScore\">0<\/span><\/div>\n    <\/div>\n\n    <div id=\"status\">Tocca una casella per iniziare<\/div>\n\n    <div class=\"board\" id=\"board\">\n      <button class=\"cell\" data-index=\"0\"><\/button>\n      <button class=\"cell\" data-index=\"1\"><\/button>\n      <button class=\"cell\" data-index=\"2\"><\/button>\n      <button class=\"cell\" data-index=\"3\"><\/button>\n      <button class=\"cell\" data-index=\"4\"><\/button>\n      <button class=\"cell\" data-index=\"5\"><\/button>\n      <button class=\"cell\" data-index=\"6\"><\/button>\n      <button class=\"cell\" data-index=\"7\"><\/button>\n      <button class=\"cell\" data-index=\"8\"><\/button>\n    <\/div>\n\n    <div class=\"actions\">\n      <button class=\"action-btn\" id=\"newRoundBtn\">Nuova partita<\/button>\n      <button class=\"action-btn secondary\" id=\"resetScoreBtn\">Azzera punteggio<\/button>\n    <\/div>\n\n    <p class=\"hint\">Obiettivo: fai tris in riga, colonna o diagonale.<\/p>\n  <\/div>\n\n  <script>\n    const cells = document.querySelectorAll(\".cell\");\n    const statusEl = document.getElementById(\"status\");\n    const newRoundBtn = document.getElementById(\"newRoundBtn\");\n    const resetScoreBtn = document.getElementById(\"resetScoreBtn\");\n\n    const playerScoreEl = document.getElementById(\"playerScore\");\n    const drawScoreEl = document.getElementById(\"drawScore\");\n    const computerScoreEl = document.getElementById(\"computerScore\");\n\n    const PLAYER = \"X\";\n    const COMPUTER = \"NMP\";\n\n    const winCombos = [\n      [0, 1, 2],\n      [3, 4, 5],\n      [6, 7, 8],\n      [0, 3, 6],\n      [1, 4, 7],\n      [2, 5, 8],\n      [0, 4, 8],\n      [2, 4, 6]\n    ];\n\n    let board = Array(9).fill(\"\");\n    let gameOver = false;\n    let playerScore = 0;\n    let drawScore = 0;\n    let computerScore = 0;\n\n    function renderBoard() {\n      cells.forEach((cell, index) => {\n        cell.textContent = board[index];\n        cell.className = \"cell\";\n\n        if (board[index] === PLAYER) {\n          cell.classList.add(\"player\");\n        }\n\n        if (board[index] === COMPUTER) {\n          cell.classList.add(\"computer\");\n        }\n\n        cell.disabled = board[index] !== \"\" || gameOver;\n      });\n    }\n\n    function updateScore() {\n      playerScoreEl.textContent = playerScore;\n      drawScoreEl.textContent = drawScore;\n      computerScoreEl.textContent = computerScore;\n    }\n\n    function getWinner(currentBoard) {\n      for (const combo of winCombos) {\n        const [a, b, c] = combo;\n\n        if (\n          currentBoard[a] &&\n          currentBoard[a] === currentBoard[b] &&\n          currentBoard[a] === currentBoard[c]\n        ) {\n          return {\n            winner: currentBoard[a],\n            combo: combo\n          };\n        }\n      }\n\n      if (!currentBoard.includes(\"\")) {\n        return {\n          winner: \"draw\",\n          combo: []\n        };\n      }\n\n      return null;\n    }\n\n    function highlightWin(combo) {\n      combo.forEach(index => {\n        cells[index].classList.add(\"win\");\n      });\n    }\n\n    function endRound(result) {\n      gameOver = true;\n\n      if (result.winner === PLAYER) {\n        playerScore++;\n        statusEl.textContent = \"Hai vinto! \ud83c\udf89\";\n        highlightWin(result.combo);\n      } else if (result.winner === COMPUTER) {\n        computerScore++;\n        statusEl.textContent = \"NMP ha fatto tris!\";\n        highlightWin(result.combo);\n      } else {\n        drawScore++;\n        statusEl.textContent = \"Pareggio!\";\n      }\n\n      updateScore();\n      renderBoard();\n      if (result.combo.length) highlightWin(result.combo);\n    }\n\n    function findBestMove() {\n      const emptyCells = board\n        .map((value, index) => value === \"\" ? index : null)\n        .filter(index => index !== null);\n\n      \/\/ 1. Se NMP pu\u00f2 vincere, vince\n      for (const index of emptyCells) {\n        const testBoard = [...board];\n        testBoard[index] = COMPUTER;\n        const result = getWinner(testBoard);\n        if (result && result.winner === COMPUTER) return index;\n      }\n\n      \/\/ 2. Se il giocatore pu\u00f2 vincere, NMP blocca\n      for (const index of emptyCells) {\n        const testBoard = [...board];\n        testBoard[index] = PLAYER;\n        const result = getWinner(testBoard);\n        if (result && result.winner === PLAYER) return index;\n      }\n\n      \/\/ 3. Centro se libero\n      if (board[4] === \"\") return 4;\n\n      \/\/ 4. Angoli\n      const corners = [0, 2, 6, 8].filter(index => board[index] === \"\");\n      if (corners.length > 0) {\n        return corners[Math.floor(Math.random() * corners.length)];\n      }\n\n      \/\/ 5. Qualsiasi casella libera\n      return emptyCells[Math.floor(Math.random() * emptyCells.length)];\n    }\n\n    function computerMove() {\n      if (gameOver) return;\n\n      const move = findBestMove();\n      if (move === undefined) return;\n\n      board[move] = COMPUTER;\n      renderBoard();\n\n      const result = getWinner(board);\n      if (result) {\n        endRound(result);\n      } else {\n        statusEl.textContent = \"Tocca a te\";\n      }\n    }\n\n    function playerMove(index) {\n      if (gameOver || board[index] !== \"\") return;\n\n      board[index] = PLAYER;\n      renderBoard();\n\n      const result = getWinner(board);\n      if (result) {\n        endRound(result);\n        return;\n      }\n\n      statusEl.textContent = \"NMP sta pensando...\";\n      setTimeout(computerMove, 350);\n    }\n\n    function newRound() {\n      board = Array(9).fill(\"\");\n      gameOver = false;\n      statusEl.textContent = \"Tocca a te\";\n      renderBoard();\n    }\n\n    function resetScore() {\n      playerScore = 0;\n      drawScore = 0;\n      computerScore = 0;\n      updateScore();\n      newRound();\n    }\n\n    cells.forEach(cell => {\n      cell.addEventListener(\"click\", () => {\n        const index = Number(cell.dataset.index);\n        playerMove(index);\n      });\n    });\n\n    newRoundBtn.addEventListener(\"click\", newRound);\n    resetScoreBtn.addEventListener(\"click\", resetScore);\n\n    renderBoard();\n    updateScore();\n  <\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Tris NMP 2026 Tris NMP 2026 Tu giochi con X, NMP gioca con il badge. Tu0 Pareggi0 NMP0 Tocca una casella per iniziare Nuova partita Azzera punteggio Obiettivo: fai tris in riga, colonna o diagonale.<\/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-2715","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TRIS - NMP2026<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.nmp.unirc.it\/?page_id=2715\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TRIS - NMP2026\" \/>\n<meta property=\"og:description\" content=\"Tris NMP 2026 Tris NMP 2026 Tu giochi con X, NMP gioca con il badge. Tu0 Pareggi0 NMP0 Tocca una casella per iniziare Nuova partita Azzera punteggio Obiettivo: fai tris in riga, colonna o diagonale.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.nmp.unirc.it\/?page_id=2715\" \/>\n<meta property=\"og:site_name\" content=\"NMP2026\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-28T21:50:23+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.nmp.unirc.it\\\/?page_id=2715\",\"url\":\"https:\\\/\\\/www.nmp.unirc.it\\\/?page_id=2715\",\"name\":\"TRIS - NMP2026\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.nmp.unirc.it\\\/#website\"},\"datePublished\":\"2026-04-28T21:50:22+00:00\",\"dateModified\":\"2026-04-28T21:50:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.nmp.unirc.it\\\/?page_id=2715#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.nmp.unirc.it\\\/?page_id=2715\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.nmp.unirc.it\\\/?page_id=2715#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.nmp.unirc.it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TRIS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.nmp.unirc.it\\\/#website\",\"url\":\"https:\\\/\\\/www.nmp.unirc.it\\\/\",\"name\":\"NMP2026\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.nmp.unirc.it\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.nmp.unirc.it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.nmp.unirc.it\\\/#organization\",\"name\":\"NMP2026\",\"url\":\"https:\\\/\\\/www.nmp.unirc.it\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.nmp.unirc.it\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.nmp.unirc.it\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/cropped-cropped-Immagine1-removebg-preview.png\",\"contentUrl\":\"https:\\\/\\\/www.nmp.unirc.it\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/cropped-cropped-Immagine1-removebg-preview.png\",\"width\":570,\"height\":438,\"caption\":\"NMP2026\"},\"image\":{\"@id\":\"https:\\\/\\\/www.nmp.unirc.it\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"TRIS - NMP2026","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.nmp.unirc.it\/?page_id=2715","og_locale":"en_US","og_type":"article","og_title":"TRIS - NMP2026","og_description":"Tris NMP 2026 Tris NMP 2026 Tu giochi con X, NMP gioca con il badge. Tu0 Pareggi0 NMP0 Tocca una casella per iniziare Nuova partita Azzera punteggio Obiettivo: fai tris in riga, colonna o diagonale.","og_url":"https:\/\/www.nmp.unirc.it\/?page_id=2715","og_site_name":"NMP2026","article_modified_time":"2026-04-28T21:50:23+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.nmp.unirc.it\/?page_id=2715","url":"https:\/\/www.nmp.unirc.it\/?page_id=2715","name":"TRIS - NMP2026","isPartOf":{"@id":"https:\/\/www.nmp.unirc.it\/#website"},"datePublished":"2026-04-28T21:50:22+00:00","dateModified":"2026-04-28T21:50:23+00:00","breadcrumb":{"@id":"https:\/\/www.nmp.unirc.it\/?page_id=2715#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.nmp.unirc.it\/?page_id=2715"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.nmp.unirc.it\/?page_id=2715#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.nmp.unirc.it\/"},{"@type":"ListItem","position":2,"name":"TRIS"}]},{"@type":"WebSite","@id":"https:\/\/www.nmp.unirc.it\/#website","url":"https:\/\/www.nmp.unirc.it\/","name":"NMP2026","description":"","publisher":{"@id":"https:\/\/www.nmp.unirc.it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.nmp.unirc.it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.nmp.unirc.it\/#organization","name":"NMP2026","url":"https:\/\/www.nmp.unirc.it\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.nmp.unirc.it\/#\/schema\/logo\/image\/","url":"https:\/\/www.nmp.unirc.it\/wp-content\/uploads\/2023\/10\/cropped-cropped-Immagine1-removebg-preview.png","contentUrl":"https:\/\/www.nmp.unirc.it\/wp-content\/uploads\/2023\/10\/cropped-cropped-Immagine1-removebg-preview.png","width":570,"height":438,"caption":"NMP2026"},"image":{"@id":"https:\/\/www.nmp.unirc.it\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.nmp.unirc.it\/index.php?rest_route=\/wp\/v2\/pages\/2715","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nmp.unirc.it\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.nmp.unirc.it\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.nmp.unirc.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nmp.unirc.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2715"}],"version-history":[{"count":1,"href":"https:\/\/www.nmp.unirc.it\/index.php?rest_route=\/wp\/v2\/pages\/2715\/revisions"}],"predecessor-version":[{"id":2716,"href":"https:\/\/www.nmp.unirc.it\/index.php?rest_route=\/wp\/v2\/pages\/2715\/revisions\/2716"}],"wp:attachment":[{"href":"https:\/\/www.nmp.unirc.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2715"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}