{"id":57228,"date":"2025-09-17T03:49:57","date_gmt":"2025-09-16T18:49:57","guid":{"rendered":"https:\/\/dark-brain.com\/?p=57228"},"modified":"2025-09-17T03:56:06","modified_gmt":"2025-09-16T18:56:06","slug":"%e3%83%90%e3%82%ab%e3%81%aa%e3%82%aa%e3%82%bb%e3%83%ad%e3%82%b2%e3%83%bc%e3%83%a0%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f","status":"publish","type":"post","link":"https:\/\/dark-brain.com\/?p=57228","title":{"rendered":"\u30d0\u30ab\u306a\u30aa\u30bb\u30ed\u30b2\u30fc\u30e0\u3092\u4f5c\u3063\u3066\u307f\u305f"},"content":{"rendered":"\n<p>BYD\u3068\u30c6\u30b9\u30e9\u3067\u76e4\u9762\u3092\u53d6\u308a\u5408\u3046\u30aa\u30bb\u30ed\u30b2\u30fc\u30e0\u3092AI\u3067\u4f5c\u3063\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>\u203b\u97f3\u91cf\u6ce8\u610f\u3067\u3059\u3002\u7aef\u672b\u306e\u97f3\u91cf\u3092\u4e0b\u3052\u3066\u3054\u5229\u7528\u304f\u3060\u3055\u3044<\/p>\n\n\n\n<p><\/p>\n\n\n\n<!-- Triple Game 4x4 Embeddable -->\n<div id=\"tg4x4\">\n  <div class=\"tg-wrap\">\n    <div class=\"tg-board\" id=\"tg-board\"><\/div>\n    <div class=\"tg-info\" id=\"tg-info\">\u767d\uff08\u3042\u306a\u305f\uff09\u306e\u756a\u3067\u3059<\/div>\n    <div class=\"tg-sub\" id=\"tg-sub\">\u7e26\u30fb\u6a2a\u30fb\u659c\u3081\u306b3\u3064\u4e26\u3079\u305f\u3089\u52dd\u3061\uff01\uff084&#215;4\uff09<\/div>\n    <div class=\"tg-panel\">\n      <button id=\"tg-reset\">\u30ea\u30bb\u30c3\u30c8<\/button>\n      <button id=\"tg-sound-toggle\" aria-pressed=\"false\">\ud83d\udd0a \u30b5\u30a6\u30f3\u30c9ON\/OFF<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<style>\n  \/* \u25bc \u3059\u3079\u3066 #tg4x4 \u914d\u4e0b\u306b\u9650\u5b9a\uff08\u30c6\u30fc\u30deCSS\u3068\u306e\u5e72\u6e09\u3092\u9632\u6b62\uff09 *\/\n  #tg4x4 { display:flex; justify-content:center; align-items:center; width:100%; }\n  #tg4x4 .tg-wrap { text-align:center; font-family: system-ui, -apple-system, Segoe UI, Roboto, \"Hiragino Kaku Gothic ProN\", Meiryo, sans-serif; }\n  #tg4x4 .tg-board { display:grid; grid-template-columns:repeat(4,minmax(64px,100px)); grid-auto-rows:minmax(64px,100px); gap:6px; margin:0 auto; }\n  #tg4x4 .tg-cell { width:100%; aspect-ratio:1\/1; background:#58a55c; display:flex; justify-content:center; align-items:center; cursor:pointer; border-radius:10px; box-shadow: inset 0 0 6px rgba(0,0,0,.25); }\n  #tg4x4 .tg-cell.disabled { cursor:not-allowed; opacity:.8; }\n  #tg4x4 .tg-disc img { width:70%; height:70%; object-fit:contain; filter: drop-shadow(0 1px 2px rgba(0,0,0,.4)); }\n  #tg4x4 .tg-info { margin-top:12px; font-weight:700; }\n  #tg4x4 .tg-sub { margin-top:4px; font-size:12px; color:#333; }\n  #tg4x4 .tg-panel { margin-top:10px; display:flex; gap:8px; justify-content:center; flex-wrap:wrap; }\n  #tg4x4 button { padding:8px 12px; border-radius:8px; border:none; box-shadow:0 2px 6px rgba(0,0,0,.2); cursor:pointer; }\n  \/* \u753b\u9762\u5e45\u306b\u5fdc\u3058\u3066\u30de\u30b9\u3092\u7e2e\u3081\u308b *\/\n  @media (max-width:480px) {\n    #tg4x4 .tg-board { grid-template-columns:repeat(4, 20vw); grid-auto-rows:20vw; gap:4px; }\n  }\n<\/style>\n\n<script>\n(function(){\n  \/\/ ===== \u30e1\u30c7\u30a3\u30a2\u30e9\u30a4\u30d6\u30e9\u30ea\u306b\u30a2\u30c3\u30d7\u3057\u305fURL\u3092\u8cbc\u308b\uff08\u4f8b\uff09=====\n  const ASSETS = {\n    white: 'https:\/\/dark-brain.com\/wp-content\/uploads\/2025\/09\/white.png',\n    black: 'https:\/\/dark-brain.com\/wp-content\/uploads\/2025\/09\/black.png',\n    bgm:   'https:\/\/dark-brain.com\/wp-content\/uploads\/2025\/09\/bgm.mp3',\n    sfxW:  'https:\/\/dark-brain.com\/wp-content\/uploads\/2025\/09\/white.mp3',\n    sfxB:  'https:\/\/dark-brain.com\/wp-content\/uploads\/2025\/09\/black.mp3',\n    win:   'https:\/\/dark-brain.com\/wp-content\/uploads\/2025\/09\/win.wav',\n    lose:  'https:\/\/dark-brain.com\/wp-content\/uploads\/2025\/09\/lose.wav'\n  };\n\n  \/\/ ===== \u57fa\u672c\u8a2d\u5b9a =====\n  const SIZE = 4;\n  const WIN  = 3;\n  const HUMAN = 'white'; \/\/ \u5148\u624b\uff1d\u3042\u306a\u305f\n  const AI    = 'black'; \/\/ \u5f8c\u624b\uff1dAI\n\n  const root = document.getElementById('tg4x4');\n  const boardEl = root.querySelector('#tg-board');\n  const infoEl  = root.querySelector('#tg-info');\n  const subEl   = root.querySelector('#tg-sub');\n  const resetBtn= root.querySelector('#tg-reset');\n  const toggleSoundBtn = root.querySelector('#tg-sound-toggle');\n\n  \/\/ \u30b5\u30a6\u30f3\u30c9\n  const bgm = new Audio(ASSETS.bgm); bgm.loop = true;\n  const sfxWhite = new Audio(ASSETS.sfxW);\n  const sfxBlack = new Audio(ASSETS.sfxB);\n  const sfxWin   = new Audio(ASSETS.win);\n  const sfxLose  = new Audio(ASSETS.lose);\n  let bgmStarted = false;\n  let muted = false;\n\n  function ensureBGM(){\n    if(!bgmStarted && !muted){\n      bgm.play().catch(()=>{});\n      bgmStarted = true;\n    }\n  }\n  function playSfx(a){\n    if(muted) return;\n    try { a.currentTime = 0; a.play(); } catch(e){}\n  }\n  toggleSoundBtn.addEventListener('click', ()=>{\n    muted = !muted;\n    toggleSoundBtn.setAttribute('aria-pressed', String(!muted));\n    toggleSoundBtn.textContent = muted ? '\ud83d\udd07 \u30b5\u30a6\u30f3\u30c9OFF' : '\ud83d\udd0a \u30b5\u30a6\u30f3\u30c9ON\/OFF';\n    if(muted) { try{ bgm.pause(); }catch(e){} } else { ensureBGM(); }\n  });\n\n  \/\/ \u72b6\u614b\n  let board, currentPlayer, gameOver, humanTurn;\n\n  function init(){\n    board = Array.from({length: SIZE}, () => Array(SIZE).fill(null));\n    currentPlayer = HUMAN;\n    humanTurn = true;\n    gameOver = false;\n    infoEl.textContent = '\u767d\uff08\u3042\u306a\u305f\uff09\u306e\u756a\u3067\u3059';\n    subEl.textContent  = `\u7e26\u30fb\u6a2a\u30fb\u659c\u3081\u306b${WIN}\u3064\u4e26\u3079\u305f\u3089\u52dd\u3061\uff01`;\n    render();\n  }\n\n  resetBtn.addEventListener('click', ()=>{\n    init();\n  });\n\n  function render(){\n    boardEl.innerHTML = '';\n    for(let r=0; r<SIZE; r++){\n      for(let c=0; c<SIZE; c++){\n        const cell = document.createElement('div');\n        cell.className = 'tg-cell' + (gameOver ? ' disabled' : '');\n        \/\/ \u77f3\n        if(board[r][c]){\n          const disc = document.createElement('div');\n          disc.className = 'tg-disc';\n          const img = document.createElement('img');\n          img.src = (board[r][c] === 'white') ? ASSETS.white : ASSETS.black;\n          img.alt = board[r][c];\n          disc.appendChild(img);\n          cell.appendChild(disc);\n        }\n        \/\/ \u30af\u30ea\u30c3\u30af\n        if(!gameOver){\n          cell.addEventListener('click', ()=>{\n            ensureBGM();\n            handleHuman(r,c);\n          });\n        }\n        boardEl.appendChild(cell);\n      }\n    }\n  }\n\n  function handleHuman(r,c){\n    if(gameOver || !humanTurn || board[r][c]) return;\n    place(r,c,HUMAN, true);\n    const w = winner();\n    if(endIf(w)) return;\n\n    \/\/ AI\n    humanTurn = false;\n    currentPlayer = AI;\n    infoEl.textContent = '\u9ed2\uff08AI\uff09\u306e\u756a\u3067\u3059';\n    setTimeout(aiMove, 180);\n  }\n\n  \/\/ \u8efd\u91cfAI\uff1a\u5373\u52dd\u3061\u2192\u30d6\u30ed\u30c3\u30af\u2192\u30d2\u30e5\u30fc\u30ea\u30b9\u30c6\u30a3\u30c3\u30af\n  function aiMove(){\n    if(gameOver) return;\n    let m = findImmediate(AI) || findImmediate(HUMAN) || heuristic(AI);\n    if(m){ const [r,c] = m; place(r,c,AI, true); }\n    const w = winner();\n    if(endIf(w)) return;\n    humanTurn = true;\n    currentPlayer = HUMAN;\n    infoEl.textContent = '\u767d\uff08\u3042\u306a\u305f\uff09\u306e\u756a\u3067\u3059';\n    render();\n  }\n\n  function place(r,c,player, sound){\n    board[r][c] = player;\n    if(sound){\n      if(player==='white') playSfx(sfxWhite); else playSfx(sfxBlack);\n    }\n    render();\n  }\n\n  function endIf(w){\n    if(w){\n      gameOver = true;\n      const humanWon = (w===HUMAN);\n      infoEl.textContent = humanWon ? '\u3042\u306a\u305f\uff08\u767d\uff09\u306e\u52dd\u3061\uff01' : 'AI\uff08\u9ed2\uff09\u306e\u52dd\u3061\uff01';\n      subEl.textContent = '\u30ea\u30bb\u30c3\u30c8\u3067\u518d\u958b\u3067\u304d\u307e\u3059';\n      playSfx(humanWon ? sfxWin : sfxLose);\n      render();\n      return true;\n    }\n    if(full()){\n      gameOver = true;\n      infoEl.textContent = '\u5f15\u304d\u5206\u3051\uff01';\n      subEl.textContent = '\u30ea\u30bb\u30c3\u30c8\u3067\u518d\u958b\u3067\u304d\u307e\u3059';\n      render();\n      return true;\n    }\n    return false;\n  }\n\n  function full(){\n    for(let r=0;r<SIZE;r++) for(let c=0;c<SIZE;c++) if(!board[r][c]) return false;\n    return true;\n  }\n\n  function winner(){\n    const dirs = [[0,1],[1,0],[1,1],[1,-1]];\n    for(let r=0;r<SIZE;r++){\n      for(let c=0;c<SIZE;c++){\n        const s = board[r][c]; if(!s) continue;\n        for(const [dr,dc] of dirs) if(line(r,c,dr,dc,s)) return s;\n      }\n    }\n    return null;\n  }\n  function line(r,c,dr,dc,color){\n    for(let k=1;k<WIN;k++){\n      const rr=r+dr*k, cc=c+dc*k;\n      if(rr<0||rr>=SIZE||cc<0||cc>=SIZE) return false;\n      if(board[rr][cc]!==color) return false;\n    }\n    return true;\n  }\n\n  function findImmediate(player){\n    for(let r=0;r<SIZE;r++){\n      for(let c=0;c<SIZE;c++){\n        if(board[r][c]) continue;\n        board[r][c] = player;\n        const ok = winner()===player;\n        board[r][c] = null;\n        if(ok) return [r,c];\n      }\n    }\n    return null;\n  }\n\n  function heuristic(player){\n    const opp = (player===AI)?HUMAN:AI;\n    const dirs = [[0,1],[1,0],[1,1],[1,-1]];\n    let best=-Infinity, moves=[];\n    for(let r=0;r<SIZE;r++){\n      for(let c=0;c<SIZE;c++){\n        if(board[r][c]) continue;\n        board[r][c]=player;\n        let sc = evalBoard(player, dirs) - 0.9*evalBoard(opp, dirs);\n        board[r][c]=null;\n        if(sc>best){ best=sc; moves=[[r,c]]; }\n        else if(Math.abs(sc-best)<1e-6){ moves.push([r,c]); }\n      }\n    }\n    if(!moves.length){\n      for(let r=0;r<SIZE;r++) for(let c=0;c<SIZE;c++) if(!board[r][c]) return [r,c];\n      return null;\n    }\n    return moves[Math.floor(Math.random()*moves.length)];\n  }\n\n  function evalBoard(player, dirs){\n    let score=0;\n    for(let r=0;r<SIZE;r++){\n      for(let c=0;c<SIZE;c++){\n        for(const [dr,dc] of dirs){\n          let ok=true, cnt=0, empty=0;\n          for(let k=0;k<WIN;k++){\n            const rr=r+dr*k, cc=c+dc*k;\n            if(rr<0||rr>=SIZE||cc<0||cc>=SIZE){ ok=false; break; }\n            const v=board[rr][cc];\n            if(v===player) cnt++; else if(v==null) empty++; else { ok=false; break; }\n          }\n          if(ok){\n            if(cnt===WIN) score+=1000;\n            else if(cnt===WIN-1 && empty===1) score+=25;\n            else if(cnt>=1) score+=5*cnt;\n            else if(empty===WIN) score+=1;\n          }\n        }\n      }\n    }\n    return score;\n  }\n\n  \/\/ \u521d\u671f\u5316\n  init();\n})();\n<\/script>\n\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>BYD\u3068\u30c6\u30b9\u30e9\u3067\u76e4\u9762\u3092\u53d6\u308a\u5408\u3046\u30aa\u30bb\u30ed\u30b2\u30fc [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":57232,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[5,10],"tags":[152],"class_list":["post-57228","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-5","category-10","tag-chatgpt"],"_links":{"self":[{"href":"https:\/\/dark-brain.com\/index.php?rest_route=\/wp\/v2\/posts\/57228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dark-brain.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dark-brain.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dark-brain.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dark-brain.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=57228"}],"version-history":[{"count":6,"href":"https:\/\/dark-brain.com\/index.php?rest_route=\/wp\/v2\/posts\/57228\/revisions"}],"predecessor-version":[{"id":57235,"href":"https:\/\/dark-brain.com\/index.php?rest_route=\/wp\/v2\/posts\/57228\/revisions\/57235"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dark-brain.com\/index.php?rest_route=\/wp\/v2\/media\/57232"}],"wp:attachment":[{"href":"https:\/\/dark-brain.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=57228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dark-brain.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=57228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dark-brain.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=57228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}