{"id":962,"date":"2024-08-19T15:02:29","date_gmt":"2024-08-19T06:02:29","guid":{"rendered":"https:\/\/route-zero.com\/recruit\/route\/962\/"},"modified":"2025-02-27T10:46:27","modified_gmt":"2025-02-27T01:46:27","slug":"962","status":"publish","type":"route","link":"https:\/\/route-zero.com\/recruit\/route\/962\/","title":{"rendered":"\u30b2\u30fc\u30e0\u3092\u4f5c\u308a\u306a\u304c\u3089\u5b66\u3076\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u52d5\u304d\u3068\u30ed\u30b8\u30c3\u30af"},"content":{"rendered":"<div>\n<p>\u3053\u3093\u306b\u3061\u306f\uff01<br \/>\u672c\u8a18\u4e8b\u3067\u306f\u3001HTML5\u306e &lt;canvas&gt; \u8981\u7d20\u3068JavaScript\u3092\u4f7f\u7528\u3057\u3066\u3001\u30b7\u30f3\u30d7\u30eb\u306a\u30aa\u30bb\u30ed\u30b2\u30fc\u30e0\u3092\u4f5c\u6210\u3059\u308b\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<br \/>\u30b2\u30fc\u30e0\u306e\u9032\u884c\u3084\u30ed\u30b8\u30c3\u30af\u306e\u51e6\u7406\u3092\u5b66\u3073\u306a\u304c\u3089\u3001\u5b9f\u969b\u306b\u52d5\u304f\u30aa\u30bb\u30ed\u30b2\u30fc\u30e0\u3092\u4f5c\u6210\u3059\u308b\u904e\u7a0b\u3092\u8ffd\u3063\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<p><\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/route-zero.com\/recruit\/wp-content\/uploads\/2025\/02\/962_1.png\" alt=\"\u30aa\u30bb\u30ed\u30b2\u30fc\u30e0\u306e\u30a4\u30e1\u30fc\u30b8\" width=\"620\" height=\"414\" loading=\"lazy\"><\/figure>\n<p>\u5168\u4f53\u306e\u30b3\u30fc\u30c9\u306f\u3053\u3061\u3089\uff01<\/p>\n<pre><code>&lt;!DOCTYPE html&gt;\r\n    &lt;html lang=&quot;ja&quot;&gt;\r\n      &lt;head&gt;\r\n        &lt;meta charset=&quot;UTF-8&quot; \/&gt;\r\n        &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; \/&gt;\r\n        &lt;title&gt;\u30aa\u30bb\u30ed\u30b2\u30fc\u30e0&lt;\/title&gt;\r\n        &lt;style&gt;\r\n          body {\r\n            display: flex;\r\n            justify-content: center;\r\n            align-items: center;\r\n            height: 100vh;\r\n            background-color: #2c3e50;\r\n            margin: 0;\r\n          }\r\n          #game-container {\r\n            text-align: center;\r\n          }\r\n          canvas {\r\n            background-color: green;\r\n            display: block;\r\n            margin: 0 auto;\r\n          }\r\n          #controls {\r\n            margin-top: 10px;\r\n          }\r\n          button {\r\n            padding: 10px 20px;\r\n            font-size: 16px;\r\n            border: none;\r\n            background-color: #3498db;\r\n            color: #fff;\r\n            cursor: pointer;\r\n            border-radius: 5px;\r\n          }\r\n          button:hover {\r\n            background-color: #2980b9;\r\n          }\r\n        &lt;\/style&gt;\r\n      &lt;\/head&gt;\r\n      &lt;body&gt;\r\n        &lt;div id=&quot;game-container&quot;&gt;\r\n          &lt;canvas id=&quot;js-canvas&quot;&gt;&lt;\/canvas&gt;\r\n          &lt;div id=&quot;js-result&quot;&gt;&lt;\/div&gt;\r\n          &lt;div id=&quot;controls&quot;&gt;\r\n            &lt;button id=&quot;reset-button&quot;&gt;Reset Game&lt;\/button&gt;\r\n          &lt;\/div&gt;\r\n        &lt;\/div&gt;\r\n    \r\n        &lt;script&gt;\r\n          \/\/ \u30ad\u30e3\u30f3\u30d0\u30b9\uff08\u30b2\u30fc\u30e0\u76e4\uff09\u306e\u8981\u7d20\u3092\u53d6\u5f97\u3057\u3001\u63cf\u753b\u306e\u305f\u3081\u306e\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u3092\u53d6\u5f97\r\n          const canvas = document.getElementById(&quot;js-canvas&quot;);\r\n          const ctx = canvas.getContext(&quot;2d&quot;);\r\n    \r\n          \/\/ \u7d50\u679c\u8868\u793a\u7528\u306e\u8981\u7d20\u3092\u53d6\u5f97\r\n          const result = document.getElementById(&quot;js-result&quot;);\r\n    \r\n          \/\/ \u30ad\u30e3\u30f3\u30d0\u30b9\u306e\u5e45\u3092\u8a2d\u5b9a\uff08\u6700\u5927480px\u3001\u30a6\u30a3\u30f3\u30c9\u30a6\u306e\u5e45\u306b\u5fdc\u3058\u3066\u8abf\u6574\uff09\r\n          canvas.width = Math.min(480, window.innerWidth - 20);\r\n          canvas.height = canvas.width;\r\n    \r\n          \/\/ \u30b2\u30fc\u30e0\u30dc\u30fc\u30c9\u306e\u30b0\u30ea\u30c3\u30c9\u30b5\u30a4\u30ba\uff088\u00d78\uff09\r\n          const GRID_SIZE = 8;\r\n    \r\n          \/\/ 1\u30de\u30b9\u306e\u5927\u304d\u3055\u3092\u8a08\u7b97\r\n          const CELL_SIZE = canvas.width \/ GRID_SIZE;\r\n    \r\n          \/\/ \u30b2\u30fc\u30e0\u306e\u72b6\u614b\u3092\u7ba1\u7406\u3059\u308b\u5909\u6570\r\n          let board = []; \/\/ 8\u00d78\u306e\u30b2\u30fc\u30e0\u30dc\u30fc\u30c9\uff082\u6b21\u5143\u914d\u5217\uff09\r\n          let currentPlayer = &quot;black&quot;; \/\/ \u73fe\u5728\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\uff08\u9ed2 or \u767d\uff09\r\n          let gameState = &quot;playing&quot;; \/\/ \u30b2\u30fc\u30e0\u306e\u72b6\u614b\uff08&quot;playing&quot;\uff1a\u9032\u884c\u4e2d\u3001&quot;gameover&quot;\uff1a\u7d42\u4e86\uff09\r\n    \r\n          \/\/ \u30b2\u30fc\u30e0\u3092\u521d\u671f\u5316\u3059\u308b\u95a2\u6570\r\n          function initGame() {\r\n            \/\/ 8\u00d78\u306e\u30dc\u30fc\u30c9\u3092\u4f5c\u6210\u3057\u3001\u3059\u3079\u3066\u306e\u30de\u30b9\u3092null\uff08\u7a7a\uff09\u3067\u57cb\u3081\u308b\r\n            board = Array.from({ length: GRID_SIZE }, () =&gt; Array(GRID_SIZE).fill(null));\r\n    \r\n            \/\/ \u521d\u671f\u914d\u7f6e\uff08\u30aa\u30bb\u30ed\u306e\u6a19\u6e96\u7684\u306a\u958b\u59cb\u4f4d\u7f6e\uff09\r\n            board[3][3] = board[4][4] = &quot;white&quot;;\r\n            board[3][4] = board[4][3] = &quot;black&quot;;\r\n    \r\n            \/\/ \u9ed2\u304b\u3089\u30b9\u30bf\u30fc\u30c8\r\n            currentPlayer = &quot;black&quot;;\r\n            gameState = &quot;playing&quot;;\r\n    \r\n            \/\/ \u30dc\u30fc\u30c9\u3092\u63cf\u753b\r\n            drawBoard();\r\n          }\r\n    \r\n          \/\/ \u30b2\u30fc\u30e0\u30dc\u30fc\u30c9\u3092\u63cf\u753b\u3059\u308b\u95a2\u6570\r\n          function drawBoard() {\r\n            \/\/ \u80cc\u666f\u3092\u7dd1\u8272\u306b\u8a2d\u5b9a\r\n            ctx.fillStyle = &quot;green&quot;;\r\n            ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n    \r\n            \/\/ \u30b0\u30ea\u30c3\u30c9\uff08\u7dda\uff09\u3092\u63cf\u753b\r\n            for (let i = 1; i &lt; GRID_SIZE; i++) {\r\n              ctx.beginPath();\r\n              ctx.moveTo(i * CELL_SIZE, 0);\r\n              ctx.lineTo(i * CELL_SIZE, canvas.height);\r\n              ctx.stroke();\r\n    \r\n              ctx.beginPath();\r\n              ctx.moveTo(0, i * CELL_SIZE);\r\n              ctx.lineTo(canvas.width, i * CELL_SIZE);\r\n              ctx.stroke();\r\n            }\r\n    \r\n            \/\/ \u5404\u30de\u30b9\u306b\u77f3\u3092\u63cf\u753b\r\n            for (let i = 0; i &lt; GRID_SIZE; i++) {\r\n              for (let j = 0; j &lt; GRID_SIZE; j++) {\r\n                if (board[i][j]) {\r\n                  ctx.fillStyle = board[i][j]; \/\/ \u77f3\u306e\u8272\u3092\u8a2d\u5b9a\uff08\u9ed2 or \u767d\uff09\r\n                  ctx.beginPath();\r\n                  ctx.arc(j * CELL_SIZE + CELL_SIZE \/ 2, i * CELL_SIZE + CELL_SIZE \/ 2, CELL_SIZE \/ 2 - 2, 0, Math.PI * 2);\r\n                  ctx.fill();\r\n                }\r\n              }\r\n            }\r\n    \r\n            \/\/ \u30b2\u30fc\u30e0\u304c\u7d42\u4e86\u3057\u305f\u5834\u5408\u3001\u7d50\u679c\u3092\u8868\u793a\r\n            if (gameState === &quot;gameover&quot;) {\r\n              ctx.fillStyle = &quot;rgba(0, 0, 0, 0.5)&quot;; \/\/ \u534a\u900f\u660e\u306e\u80cc\u666f\r\n              ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n              ctx.fillStyle = &quot;white&quot;;\r\n              ctx.font = &quot;30px Arial&quot;;\r\n              ctx.fillText(`Game Over! ${getWinner()} wins!`, canvas.width \/ 2 - 100, canvas.height \/ 2);\r\n            }\r\n          }\r\n    \r\n          \/\/ \u77f3\u3092\u7f6e\u304f\u51e6\u7406\r\n          function placeStone(row, col) {\r\n            \/\/ \u3059\u3067\u306b\u77f3\u304c\u7f6e\u304b\u308c\u3066\u3044\u308b or \u30b2\u30fc\u30e0\u7d42\u4e86\u6642\u306f\u4f55\u3082\u3057\u306a\u3044\r\n            if (board[row][col] || gameState === &quot;gameover&quot;) return;\r\n    \r\n            \/\/ \u3072\u3063\u304f\u308a\u8fd4\u305b\u308b\u77f3\u304c\u3042\u308b\u304b\u30c1\u30a7\u30c3\u30af\r\n            const flippedStones = getFlippedStones(row, col, currentPlayer);\r\n            if (!flippedStones.length) return;\r\n    \r\n            \/\/ \u77f3\u3092\u7f6e\u304f\r\n            board[row][col] = currentPlayer;\r\n    \r\n            \/\/ \u3072\u3063\u304f\u308a\u8fd4\u3059\r\n            flippedStones.forEach(([r, c]) =&gt; (board[r][c] = currentPlayer));\r\n    \r\n            \/\/ \u30d7\u30ec\u30a4\u30e4\u30fc\u4ea4\u4ee3\r\n            currentPlayer = currentPlayer === &quot;black&quot; ? &quot;white&quot; : &quot;black&quot;;\r\n    \r\n            \/\/ \u3069\u3061\u3089\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u3082\u6709\u52b9\u306a\u624b\u304c\u306a\u3044\u5834\u5408\u3001\u30b2\u30fc\u30e0\u7d42\u4e86\r\n            if (!hasValidMove()) {\r\n              currentPlayer = currentPlayer === &quot;black&quot; ? &quot;white&quot; : &quot;black&quot;;\r\n              if (!hasValidMove()) gameState = &quot;gameover&quot;;\r\n            }\r\n    \r\n            \/\/ \u66f4\u65b0\u5f8c\u306e\u30dc\u30fc\u30c9\u3092\u63cf\u753b\r\n            drawBoard();\r\n          }\r\n    \r\n          \/\/ \u3072\u3063\u304f\u308a\u8fd4\u305b\u308b\u77f3\u3092\u63a2\u3059\u51e6\u7406\r\n          function getFlippedStones(row, col, player) {\r\n            const opponent = player === &quot;black&quot; ? &quot;white&quot; : &quot;black&quot;;\r\n    \r\n            \/\/ 8\u65b9\u5411\u306e\u5ea7\u6a19\u5909\u5316\uff08\u4e0a\u3001\u4e0b\u3001\u5de6\u3001\u53f3\u3001\u659c\u30814\u65b9\u5411\uff09\r\n            const directions = [\r\n              [-1, -1],\r\n              [-1, 0],\r\n              [-1, 1],\r\n              [0, -1],\r\n              [0, 1],\r\n              [1, -1],\r\n              [1, 0],\r\n              [1, 1],\r\n            ];\r\n    \r\n            let flippedStones = [];\r\n    \r\n            for (const [dx, dy] of directions) {\r\n              let x = row + dx;\r\n              let y = col + dy;\r\n              let tempFlipped = [];\r\n    \r\n              while (x &gt;= 0 && x &lt; GRID_SIZE && y &gt;= 0 && y &lt; GRID_SIZE && board[x][y] === opponent) {\r\n                tempFlipped.push([x, y]);\r\n                x += dx;\r\n                y += dy;\r\n              }\r\n    \r\n              if (x &gt;= 0 && x &lt; GRID_SIZE && y &gt;= 0 && y &lt; GRID_SIZE && board[x][y] === player) {\r\n                flippedStones = flippedStones.concat(tempFlipped);\r\n              }\r\n            }\r\n    \r\n            return flippedStones;\r\n          }\r\n    \r\n          \/\/ \u6709\u52b9\u306a\u624b\u304c\u3042\u308b\u304b\u30c1\u30a7\u30c3\u30af\r\n          function hasValidMove() {\r\n            return board.some((row, i) =&gt; row.some((cell, j) =&gt; !cell && getFlippedStones(i, j, currentPlayer).length));\r\n          }\r\n    \r\n          \/\/ \u52dd\u8005\u3092\u5224\u5b9a\u3059\u308b\u95a2\u6570\r\n          function getWinner() {\r\n            let counts = board.flat().reduce(\r\n              (acc, cell) =&gt; {\r\n                if (cell) acc[cell]++;\r\n                return acc;\r\n              },\r\n              { black: 0, white: 0 }\r\n            );\r\n    \r\n            if (counts.black &gt; counts.white) return &quot;Black&quot;;\r\n            if (counts.white &gt; counts.black) return &quot;White&quot;;\r\n            return &quot;Draw&quot;;\r\n          }\r\n    \r\n          \/\/ \u30e6\u30fc\u30b6\u30fc\u304c\u30ad\u30e3\u30f3\u30d0\u30b9\u3092\u30af\u30ea\u30c3\u30af\u3057\u305f\u3068\u304d\u306e\u51e6\u7406\r\n          canvas.addEventListener(&quot;click&quot;, (e) =&gt; {\r\n            const rect = canvas.getBoundingClientRect();\r\n            const row = Math.floor((e.clientY - rect.top) \/ CELL_SIZE);\r\n            const col = Math.floor((e.clientX - rect.left) \/ CELL_SIZE);\r\n    \r\n            placeStone(row, col);\r\n          });\r\n    \r\n          \/\/ \u30ea\u30bb\u30c3\u30c8\u30dc\u30bf\u30f3\u306e\u30af\u30ea\u30c3\u30af\u30a4\u30d9\u30f3\u30c8\r\n          document.getElementById(&quot;reset-button&quot;).addEventListener(&quot;click&quot;, initGame);\r\n    \r\n          \/\/ \u30b2\u30fc\u30e0\u958b\u59cb\r\n          initGame();\r\n        &lt;\/script&gt;\r\n      &lt;\/body&gt;\r\n    &lt;\/html&gt;<\/code><\/pre>\n<p>\u30b3\u30fc\u30c9\u306e\u5404\u90e8\u5206\u306b\u30b3\u30e1\u30f3\u30c8\u3092\u4ed8\u3051\u3001\u30ed\u30b8\u30c3\u30af\u306e\u51e6\u7406\u5185\u5bb9\u3084\u6ce8\u610f\u3059\u3079\u304d\u70b9\u3092\u9806\u3092\u8ffd\u3063\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n<h2>1. HTML \u3068 CSS\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/h2>\n<p>\u307e\u305a\u306f\u3001\u30b2\u30fc\u30e0\u306eUI\u90e8\u5206\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<br \/>&lt;canvas&gt; \u8981\u7d20\u3092\u4f7f\u3063\u3066\u3001\u30b2\u30fc\u30e0\u76e4\u3092\u63cf\u753b\u3057\u3001\u30ea\u30bb\u30c3\u30c8\u30dc\u30bf\u30f3\u3092\u8a2d\u7f6e\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u30b2\u30fc\u30e0\u753b\u9762\u304c\u3069\u306e\u3088\u3046\u306b\u8868\u793a\u3055\u308c\u308b\u306e\u304b\u304c\u308f\u304b\u308a\u307e\u3059\u3002<\/p>\n<h3>HTML\u90e8\u5206<\/h3>\n<pre><code>&lt;!DOCTYPE html&gt;\r\n    &lt;html lang=<span>\"ja\"<\/span>&gt;\r\n      &lt;head&gt;\r\n        &lt;meta charset=<span>\"UTF-8\"<\/span> \/&gt;\r\n        &lt;meta name=<span>\"viewport\"<\/span> content=<span>\"width=device-width, initial-scale=1.0\"<\/span> \/&gt;\r\n        &lt;title&gt;\u30aa\u30bb\u30ed\u30b2\u30fc\u30e0&lt;\/title&gt;\r\n        &lt;style&gt;\r\n          body {\r\n            display: flex;\r\n            justify-content: center;\r\n            align-items: center;\r\n            height: <span>100<\/span>vh;\r\n            background-color: <span>#2c3e50;<\/span>\r\n            margin: <span>0<\/span>;\r\n          }\r\n          <span>#game-container {<\/span>\r\n            text-align: center;\r\n          }\r\n          canvas {\r\n            background-color: green;\r\n            display: block;\r\n            margin: <span>0<\/span> auto;\r\n          }\r\n          <span>#controls {<\/span>\r\n            margin-top: <span>10<\/span>px;\r\n          }\r\n          button {\r\n            padding: <span>10<\/span>px <span>20<\/span>px;\r\n            font-size: <span>16<\/span>px;\r\n            border: none;\r\n            background-color: <span>#3498db;<\/span>\r\n            color: <span>#fff;<\/span>\r\n            cursor: pointer;\r\n            border-radius: <span>5<\/span>px;\r\n          }\r\n          button:hover {\r\n            background-color: <span>#2980b9;<\/span>\r\n          }\r\n        &lt;\/style&gt;\r\n        &lt;script&gt;\r\n          <span>\/\/ \u3053\u3053\u306bJavaScript\u306e\u51e6\u7406\u3092\u66f8\u304d\u307e\u3059\u3002<\/span>\r\n        &lt;\/script&gt;\r\n      &lt;\/head&gt;<\/code><\/pre>\n<p>\u30dd\u30a4\u30f3\u30c8<\/p>\n<ul>\n<li>\n<p><strong>&lt;canvas&gt;<\/strong> \u8981\u7d20\u3092\u4f7f\u7528\u3057\u3066\u30aa\u30bb\u30ed\u306e\u30b2\u30fc\u30e0\u76e4\u3092\u63cf\u753b\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p><strong> <a href=\"https:\/\/note.com\/hashtag\/game\">#game<\/a> -container<\/strong> \u3068 <strong> <a href=\"https:\/\/note.com\/hashtag\/controls\">#controls<\/a> <\/strong> \u306f\u3001\u30b2\u30fc\u30e0\u306e\u30d3\u30b8\u30e5\u30a2\u30eb\u3068\u64cd\u4f5c\u3092\u7ba1\u7406\u3059\u308b\u305f\u3081\u306e\u30e9\u30c3\u30d1\u30fc\u3067\u3059\u3002<\/p>\n<\/li>\n<li>\n<p><strong>\u30dc\u30bf\u30f3\uff08\u30ea\u30bb\u30c3\u30c8\u7528\uff09<\/strong> \u304c\u30e6\u30fc\u30b6\u30fc\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306b\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/li>\n<\/ul>\n<h3>CSS\u90e8\u5206<\/h3>\n<p>CSS\u3067\u306f\u3001\u30da\u30fc\u30b8\u5168\u4f53\u306e\u30ec\u30a4\u30a2\u30a6\u30c8\u3092\u30bb\u30f3\u30bf\u30fc\u914d\u7f6e\u3057\u3001\u30b2\u30fc\u30e0\u76e4\uff08canvas\uff09\u306b\u7dd1\u8272\u306e\u80cc\u666f\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002\u307e\u305f\u3001\u30ea\u30bb\u30c3\u30c8\u30dc\u30bf\u30f3\u306e\u30b9\u30bf\u30a4\u30eb\u3082\u6574\u3048\u3066\u3044\u307e\u3059\u3002<\/p>\n<hr>\n<h2>2. JavaScript \u306e\u30ed\u30b8\u30c3\u30af\u89e3\u8aac<\/h2>\n<p>\u6b21\u306b\u3001\u30aa\u30bb\u30ed\u30b2\u30fc\u30e0\u306e\u30ed\u30b8\u30c3\u30af\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<br \/>\u30e6\u30fc\u30b6\u30fc\u304c\u30af\u30ea\u30c3\u30af\u3057\u305f\u4f4d\u7f6e\u306b\u77f3\u3092\u7f6e\u304d\u3001\u30bf\u30fc\u30f3\u3092\u4ea4\u4ee3\u3057\u306a\u304c\u3089\u30b2\u30fc\u30e0\u3092\u9032\u884c\u3055\u305b\u307e\u3059\u3002\u30aa\u30bb\u30ed\u306e\u30eb\u30fc\u30eb\u306b\u57fa\u3065\u3044\u3066\u3001\u77f3\u3092\u3072\u3063\u304f\u308a\u8fd4\u3059\u51e6\u7406\u3084\u30b2\u30fc\u30e0\u7d42\u4e86\u306e\u5224\u5b9a\u3092\u884c\u3044\u3001\u9806\u756a\u306b\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<h3>\u521d\u671f\u5316<\/h3>\n<pre><code><span>\/\/ \u30ad\u30e3\u30f3\u30d0\u30b9\uff08\u30b2\u30fc\u30e0\u76e4\uff09\u306e\u8981\u7d20\u3092\u53d6\u5f97\u3057\u3001\u63cf\u753b\u306e\u305f\u3081\u306e\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u3092\u53d6\u5f97<\/span>\r\n    <span>const<\/span> canvas = <span>document<\/span>.getElementById(<span>\"js-canvas\"<\/span>);\r\n    <span>const<\/span> ctx = canvas.getContext(<span>\"2d\"<\/span>);\r\n    \r\n    <span>\/\/ \u7d50\u679c\u8868\u793a\u7528\u306e\u8981\u7d20\u3092\u53d6\u5f97<\/span>\r\n    <span>const<\/span> result = <span>document<\/span>.getElementById(<span>\"js-result\"<\/span>);\r\n    \r\n    <span>\/\/ \u30ad\u30e3\u30f3\u30d0\u30b9\u306e\u5e45\u3092\u8a2d\u5b9a\uff08\u6700\u5927480px\u3001\u30a6\u30a3\u30f3\u30c9\u30a6\u306e\u5e45\u306b\u5fdc\u3058\u3066\u8abf\u6574\uff09<\/span>\r\n    canvas.width = <span>Math<\/span>.min(<span>480<\/span>, <span>window<\/span>.innerWidth - <span>20<\/span>);\r\n    canvas.height = canvas.width;<\/code><\/pre>\n<ul>\n<li>\n<p>canvas \u8981\u7d20\u3092\u53d6\u5f97\u3057\u3001\u63cf\u753b\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\uff08ctx\uff09\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002ctx \u306f\u3001\u30ad\u30e3\u30f3\u30d0\u30b9\u306b\u63cf\u753b\u3059\u308b\u305f\u3081\u306b\u5fc5\u8981\u306a\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>\u30a6\u30a3\u30f3\u30c9\u30a6\u30b5\u30a4\u30ba\u306b\u5fdc\u3058\u3066\u30ad\u30e3\u30f3\u30d0\u30b9\u306e\u30b5\u30a4\u30ba\u3092\u52d5\u7684\u306b\u8a2d\u5b9a\u3057\u3001\u6700\u5927\u5e45\u3092480px\u306b\u5236\u9650\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/li>\n<\/ul>\n<h3>\u30b2\u30fc\u30e0\u306e\u72b6\u614b\u7ba1\u7406<\/h3>\n<pre><code><span>\/\/ \u30b2\u30fc\u30e0\u30dc\u30fc\u30c9\u306e\u30b0\u30ea\u30c3\u30c9\u30b5\u30a4\u30ba\uff088\u00d78\uff09<\/span>\r\n    <span>const<\/span> GRID_SIZE = <span>8<\/span>;\r\n    \r\n    <span>\/\/ 1\u30de\u30b9\u306e\u5927\u304d\u3055\u3092\u8a08\u7b97<\/span>\r\n    <span>const<\/span> CELL_SIZE = canvas.width \/ GRID_SIZE;\r\n    \r\n    <span>\/\/ \u30b2\u30fc\u30e0\u306e\u72b6\u614b\u3092\u7ba1\u7406\u3059\u308b\u5909\u6570<\/span>\r\n    <span>let<\/span> board = []; <span>\/\/ 8\u00d78\u306e\u30b2\u30fc\u30e0\u30dc\u30fc\u30c9\uff082\u6b21\u5143\u914d\u5217\uff09<\/span>\r\n    <span>let<\/span> currentPlayer = <span>\"black\"<\/span>; <span>\/\/ \u73fe\u5728\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\uff08\u9ed2 or \u767d\uff09<\/span>\r\n    <span>let<\/span> gameState = <span>\"playing\"<\/span>; <span>\/\/ \u30b2\u30fc\u30e0\u306e\u72b6\u614b\uff08\"playing\"\uff1a\u9032\u884c\u4e2d\u3001\"gameover\"\uff1a\u7d42\u4e86\uff09<\/span><\/code><\/pre>\n<ul>\n<li>\n<p>\u30aa\u30bb\u30ed\u306e\u30dc\u30fc\u30c9\u306f <strong>8\u00d78 \u306e2\u6b21\u5143\u914d\u5217<\/strong> \u3067\u7ba1\u7406\u3055\u308c\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>currentPlayer \u306b\u306f\u73fe\u5728\u306e\u30bf\u30fc\u30f3\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\uff08\u9ed2\u307e\u305f\u306f\u767d\uff09\u3092\u4fdd\u6301\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>gameState \u306f\u30b2\u30fc\u30e0\u304c\u9032\u884c\u4e2d\u304b\u7d42\u4e86\u3057\u305f\u304b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<\/ul>\n<h3>\u30b2\u30fc\u30e0\u306e\u521d\u671f\u5316<\/h3>\n<h3>JavaScript\u306e\u95a2\u6570\u3068\u51e6\u7406\u306e\u6d41\u308c\u306b\u3064\u3044\u3066<\/h3>\n<p>JavaScript\u3067\u306f\u3001\u95a2\u6570\u306f\u305d\u306e\u307e\u307e\u3067\u306f\u5b9f\u884c\u3055\u308c\u307e\u305b\u3093\u3002\u95a2\u6570\u3092\u547c\u3073\u51fa\u3059\u3053\u3068\u306b\u3088\u3063\u3066\u521d\u3081\u3066\u3001\u305d\u306e\u51e6\u7406\u304c\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u8a18\u4e8b\u306e\u30aa\u30bb\u30ed\u30b2\u30fc\u30e0\u3082\u540c\u69d8\u3067\u3001\u30b2\u30fc\u30e0\u306e\u521d\u671f\u5316\u3084\u30b2\u30fc\u30e0\u306e\u9032\u884c\u306b\u95a2\u308f\u308b\u51e6\u7406\u306f\u3001\u3042\u3089\u304b\u3058\u3081\u5b9a\u7fa9\u3057\u305f\u95a2\u6570\u304c\u9069\u5207\u306b\u547c\u3070\u308c\u308b\u3053\u3068\u306b\u3088\u3063\u3066\u52d5\u304d\u307e\u3059\u3002<\/p>\n<p>\u7279\u306b\u91cd\u8981\u306a\u306e\u304c\u3001\u30da\u30fc\u30b8\u304c\u6700\u521d\u306b\u8aad\u307f\u8fbc\u307e\u308c\u305f\u969b\u306b\u5b9f\u884c\u3055\u308c\u308b\u51e6\u7406\u3067\u3059\u3002\u3053\u306e\u51e6\u7406\u306f\u3001\u30b2\u30fc\u30e0\u304c\u958b\u59cb\u3059\u308b\u305f\u3081\u306e\u521d\u671f\u8a2d\u5b9a\u3092\u884c\u3046\u5f79\u5272\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002\u305d\u306e\u305f\u3081\u3001\u6700\u521d\u306b\u547c\u3070\u308c\u308b\u3079\u304d\u95a2\u6570\u306finitGame()\u3067\u3059\u3002<\/p>\n<p>\u521d\u671f\u5316\u306e\u6d41\u308c<\/p>\n<pre><code><span>\/\/ \u30b2\u30fc\u30e0\u3092\u521d\u671f\u5316\u3059\u308b\u95a2\u6570<\/span>\r\n    <span><span>function<\/span> <span>initGame<\/span><span>()<\/span> <\/span>{\r\n      <span>\/\/ 8\u00d78\u306e\u30dc\u30fc\u30c9\u3092\u4f5c\u6210\u3057\u3001\u3059\u3079\u3066\u306e\u30de\u30b9\u3092null\uff08\u7a7a\uff09\u3067\u57cb\u3081\u308b<\/span>\r\n      board = <span>Array<\/span>.from({ length: GRID_SIZE }, () =&gt; <span>Array<\/span>(GRID_SIZE).fill(<span>null<\/span>));\r\n    \r\n      <span>\/\/ \u521d\u671f\u914d\u7f6e\uff08\u30aa\u30bb\u30ed\u306e\u6a19\u6e96\u7684\u306a\u958b\u59cb\u4f4d\u7f6e\uff09<\/span>\r\n      board[<span>3<\/span>][<span>3<\/span>] = board[<span>4<\/span>][<span>4<\/span>] = <span>\"white\"<\/span>;\r\n      board[<span>3<\/span>][<span>4<\/span>] = board[<span>4<\/span>][<span>3<\/span>] = <span>\"black\"<\/span>;\r\n    \r\n      <span>\/\/ \u9ed2\u304b\u3089\u30b9\u30bf\u30fc\u30c8<\/span>\r\n      currentPlayer = <span>\"black\"<\/span>;\r\n      gameState = <span>\"playing\"<\/span>;\r\n    \r\n      <span>\/\/ \u30dc\u30fc\u30c9\u3092\u63cf\u753b<\/span>\r\n      drawBoard();\r\n    }<\/code><\/pre>\n<ul>\n<li>\n<p>\u521d\u671f\u5316\u6642\u306b\u30b2\u30fc\u30e0\u30dc\u30fc\u30c9\u3092\u7a7a\uff08null\uff09\u3067\u57cb\u3081\u3001\u30aa\u30bb\u30ed\u306e\u6a19\u6e96\u914d\u7f6e\u306b\u5408\u308f\u305b\u3066\u9ed2\u3068\u767d\u306e\u77f3\u3092\u914d\u7f6e\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>\u30b2\u30fc\u30e0\u958b\u59cb\u306f\u9ed2\u304b\u3089\u30b9\u30bf\u30fc\u30c8\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<\/ul>\n<p>initGame() \u306f\u3001\u30b2\u30fc\u30e0\u306e\u6700\u521d\u306b\u547c\u3070\u308c\u3001\u4ee5\u4e0b\u306e\u51e6\u7406\u3092\u884c\u3044\u307e\u3059\u3002<\/p>\n<ol>\n<li>\n<p>\u30b2\u30fc\u30e0\u30dc\u30fc\u30c9\u3092\u7a7a\u306b\u521d\u671f\u5316\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>\u30aa\u30bb\u30ed\u306e\u6a19\u6e96\u7684\u306a\u521d\u671f\u914d\u7f6e\uff08\u9ed2\u3068\u767d\u306e\u77f3\uff09\u3092\u30dc\u30fc\u30c9\u306b\u30bb\u30c3\u30c8\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>\u30b2\u30fc\u30e0\u306e\u72b6\u614b\u3092\u300c\u9032\u884c\u4e2d\u300d\u3068\u3057\u3001\u9ed2\u304b\u3089\u30b9\u30bf\u30fc\u30c8\u3059\u308b\u3088\u3046\u306b\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>drawBoard() \u95a2\u6570\u3092\u547c\u3073\u51fa\u3057\u3066\u3001\u753b\u9762\u306b\u30dc\u30fc\u30c9\u3092\u63cf\u753b\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<\/ol>\n<p>\u3053\u306e\u3088\u3046\u306b\u3001initGame() \u306f\u30b2\u30fc\u30e0\u304c\u958b\u59cb\u3055\u308c\u308b\u969b\u306b\u6700\u521d\u306b\u547c\u3070\u308c\u308b\u95a2\u6570\u3067\u3042\u308a\u3001\u30b2\u30fc\u30e0\u306e\u9032\u884c\u306b\u5fc5\u8981\u306a\u521d\u671f\u5316\u3092\u3059\u3079\u3066\u884c\u3046\u975e\u5e38\u306b\u91cd\u8981\u306a\u5f79\u5272\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<h3>\u30b2\u30fc\u30e0\u30dc\u30fc\u30c9\u306e\u63cf\u753b<\/h3>\n<pre><code><span>\/\/ \u30b2\u30fc\u30e0\u30dc\u30fc\u30c9\u3092\u63cf\u753b\u3059\u308b\u95a2\u6570<\/span>\r\n    <span><span>function<\/span> <span>drawBoard<\/span>(<span><\/span>) <\/span>{\r\n      <span>\/\/ \u80cc\u666f\u3092\u7dd1\u8272\u306b\u8a2d\u5b9a<\/span>\r\n      ctx.fillStyle = <span>\"green\"<\/span>;\r\n      ctx.fillRect(<span>0<\/span>, <span>0<\/span>, canvas.width, canvas.height);\r\n    \r\n      <span>\/\/ \u30b0\u30ea\u30c3\u30c9\uff08\u7dda\uff09\u3092\u63cf\u753b<\/span>\r\n      <span>for<\/span> (<span>let<\/span> i = <span>1<\/span>; i &lt; GRID_SIZE; i++) {\r\n        ctx.beginPath();\r\n        ctx.moveTo(i * CELL_SIZE, <span>0<\/span>);\r\n        ctx.lineTo(i * CELL_SIZE, canvas.height);\r\n        ctx.stroke();\r\n    \r\n        ctx.beginPath();\r\n        ctx.moveTo(<span>0<\/span>, i * CELL_SIZE);\r\n        ctx.lineTo(canvas.width, i * CELL_SIZE);\r\n        ctx.stroke();\r\n      }\r\n    \r\n      <span>\/\/ \u5404\u30de\u30b9\u306b\u77f3\u3092\u63cf\u753b<\/span>\r\n      <span>for<\/span> (<span>let<\/span> i = <span>0<\/span>; i &lt; GRID_SIZE; i++) {\r\n        <span>for<\/span> (<span>let<\/span> j = <span>0<\/span>; j &lt; GRID_SIZE; j++) {\r\n          <span>if<\/span> (board[i][j]) {\r\n            ctx.fillStyle = board[i][j]; <span>\/\/ \u77f3\u306e\u8272\u3092\u8a2d\u5b9a\uff08\u9ed2 or \u767d\uff09<\/span>\r\n            ctx.beginPath();\r\n            ctx.arc(j * CELL_SIZE + CELL_SIZE \/ <span>2<\/span>, i * CELL_SIZE + CELL_SIZE \/ <span>2<\/span>, CELL_SIZE \/ <span>2<\/span> - <span>2<\/span>, <span>0<\/span>, <span>Math<\/span>.PI * <span>2<\/span>);\r\n            ctx.fill();\r\n          }\r\n        }\r\n      }\r\n    \r\n      <span>\/\/ \u30b2\u30fc\u30e0\u304c\u7d42\u4e86\u3057\u305f\u5834\u5408\u3001\u7d50\u679c\u3092\u8868\u793a<\/span>\r\n      <span>if<\/span> (gameState === <span>\"gameover\"<\/span>) {\r\n        ctx.fillStyle = <span>\"rgba(0, 0, 0, 0.5)\"<\/span>; <span>\/\/ \u534a\u900f\u660e\u306e\u80cc\u666f<\/span>\r\n        ctx.fillRect(<span>0<\/span>, <span>0<\/span>, canvas.width, canvas.height);\r\n        ctx.fillStyle = <span>\"white\"<\/span>;\r\n        ctx.font = <span>\"30px Arial\"<\/span>;\r\n        ctx.fillText(<span>`Game Over! <span>${getWinner()}<\/span> wins!`<\/span>, canvas.width \/ <span>2<\/span> - <span>100<\/span>, canvas.height \/ <span>2<\/span>);\r\n      }\r\n    }<\/code><\/pre>\n<ul>\n<li>\n<p>\u30dc\u30fc\u30c9\u306e\u63cf\u753b\u3067\u306f\u3001\u307e\u305a\u80cc\u666f\u8272\u3092\u5857\u308a\u3001\u6b21\u306b\u30b0\u30ea\u30c3\u30c9\uff08\u7dda\uff09\u3092\u63cf\u753b\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>\u5404\u30de\u30b9\u306b\u9ed2\u307e\u305f\u306f\u767d\u306e\u77f3\u3092\u63cf\u753b\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>\u30b2\u30fc\u30e0\u7d42\u4e86\u6642\u306b\u306f\u3001\u30b2\u30fc\u30e0\u30aa\u30fc\u30d0\u30fc\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<\/li>\n<\/ul>\n<h3>\u77f3\u3092\u7f6e\u304f\u51e6\u7406<\/h3>\n<pre><code><span>\/\/ \u77f3\u3092\u7f6e\u304f\u51e6\u7406<\/span>\r\n    <span><span>function<\/span> <span>placeStone<\/span>(<span>row, col<\/span>) <\/span>{\r\n      <span>\/\/ \u3059\u3067\u306b\u77f3\u304c\u7f6e\u304b\u308c\u3066\u3044\u308b or \u30b2\u30fc\u30e0\u7d42\u4e86\u6642\u306f\u4f55\u3082\u3057\u306a\u3044<\/span>\r\n      <span>if<\/span> (board[row][col] || gameState === <span>\"gameover\"<\/span>) <span>return<\/span>;\r\n    \r\n      <span>\/\/ \u3072\u3063\u304f\u308a\u8fd4\u305b\u308b\u77f3\u304c\u3042\u308b\u304b\u30c1\u30a7\u30c3\u30af<\/span>\r\n      <span>const<\/span> flippedStones = getFlippedStones(row, col, currentPlayer);\r\n      <span>if<\/span> (!flippedStones.length) <span>return<\/span>;\r\n    \r\n      <span>\/\/ \u77f3\u3092\u7f6e\u304f<\/span>\r\n      board[row][col] = currentPlayer;\r\n    \r\n      <span>\/\/ \u3072\u3063\u304f\u308a\u8fd4\u3059<\/span>\r\n      flippedStones.forEach(<span>(<span>[r, c]<\/span>) =&gt;<\/span> (board[r][c] = currentPlayer));\r\n    \r\n      <span>\/\/ \u30d7\u30ec\u30a4\u30e4\u30fc\u4ea4\u4ee3\u306e\u51e6\u7406\uff08\u30bf\u30fc\u30f3\u3092\u4ea4\u4ee3\uff09<\/span>\r\n      currentPlayer = currentPlayer === <span>\"black\"<\/span> ? <span>\"white\"<\/span> : <span>\"black\"<\/span>;\r\n    \r\n      <span>\/\/ \u3069\u3061\u3089\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u3082\u6709\u52b9\u306a\u624b\u304c\u306a\u3044\u5834\u5408\u3001\u30b2\u30fc\u30e0\u7d42\u4e86<\/span>\r\n      <span>if<\/span> (!hasValidMove()) {\r\n        currentPlayer = currentPlayer === <span>\"black\"<\/span> ? <span>\"white\"<\/span> : <span>\"black\"<\/span>;\r\n        <span>if<\/span> (!hasValidMove()) gameState = <span>\"gameover\"<\/span>;\r\n      }\r\n    \r\n      <span>\/\/ \u66f4\u65b0\u5f8c\u306e\u30dc\u30fc\u30c9\u3092\u63cf\u753b<\/span>\r\n      drawBoard();\r\n    }<\/code><\/pre>\n<ul>\n<li>\n<p>\u30af\u30ea\u30c3\u30af\u3055\u308c\u305f\u4f4d\u7f6e\u306b\u77f3\u3092\u7f6e\u304f\u51e6\u7406\u3067\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>\u7f6e\u3051\u308b\u304b\u3069\u3046\u304b\u306f\u3001\u3072\u3063\u304f\u308a\u8fd4\u305b\u308b\u77f3\u304c\u3042\u308b\u304b\u3092\u78ba\u8a8d\u3059\u308b\u3053\u3068\u3067\u5224\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>\u3072\u3063\u304f\u308a\u8fd4\u305b\u308b\u77f3\u304c\u3042\u308c\u3070\u3001\u305d\u306e\u77f3\u3092\u3072\u3063\u304f\u308a\u8fd4\u3057\u3001\u6b21\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u306b\u30bf\u30fc\u30f3\u3092\u79fb\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<\/ul>\n<h3>\u3072\u3063\u304f\u308a\u8fd4\u305b\u308b\u77f3\u306e\u5224\u5b9a<\/h3>\n<pre><code><span>\/\/ \u3072\u3063\u304f\u308a\u8fd4\u305b\u308b\u77f3\u3092\u63a2\u3059\u51e6\u7406<\/span>\r\n    <span>function <span>getFlippedStones<\/span>(<span>row, col, player<\/span>)<\/span> {\r\n      <span>const<\/span> opponent = player === <span>\"black\"<\/span> ? <span>\"white\"<\/span> : <span>\"black\"<\/span>;\r\n    \r\n      <span>\/\/ 8\u65b9\u5411\u306e\u5ea7\u6a19\u5909\u5316\uff08\u4e0a\u3001\u4e0b\u3001\u5de6\u3001\u53f3\u3001\u659c\u30814\u65b9\u5411\uff09<\/span>\r\n      <span>const<\/span> directions = [\r\n        [<span>-1, -1<\/span>], <span>\/\/ \u5de6\u4e0a<\/span>\r\n        [<span>-1, 0<\/span>],  <span>\/\/ \u4e0a<\/span>\r\n        [<span>-1, 1<\/span>],  <span>\/\/ \u53f3\u4e0a<\/span>\r\n        [<span>0, -1<\/span>],  <span>\/\/ \u5de6<\/span>\r\n        [<span>0, 1<\/span>],   <span>\/\/ \u53f3<\/span>\r\n        [<span>1, -1<\/span>],  <span>\/\/ \u5de6\u4e0b<\/span>\r\n        [<span>1, 0<\/span>],   <span>\/\/ \u4e0b<\/span>\r\n        [<span>1, 1<\/span>],   <span>\/\/ \u53f3\u4e0b<\/span>\r\n      ];\r\n    \r\n      <span>let<\/span> flippedStones = [];\r\n    \r\n      <span>\/\/ \u5404\u65b9\u5411\u306b\u5bfe\u3057\u3066\u3072\u3063\u304f\u308a\u8fd4\u305b\u308b\u77f3\u3092\u63a2\u3059<\/span>\r\n      <span>for<\/span> (<span>const<\/span> [dx, dy] of directions) {\r\n        <span>let<\/span> x = row + dx;\r\n        <span>let<\/span> y = col + dy;\r\n        <span>let<\/span> tempFlipped = [];\r\n    \r\n        <span>\/\/ \u76f8\u624b\u306e\u77f3\u304c\u3042\u308b\u9650\u308a\u30c1\u30a7\u30c3\u30af<\/span>\r\n        <span>while<\/span> (x &gt;= <span>0<\/span> &amp;&amp; x &lt; GRID_SIZE &amp;&amp; y &gt;= <span>0<\/span> &amp;&amp; y &lt; GRID_SIZE &amp;&amp; board[x][y] === opponent) {\r\n          tempFlipped.push([x, y]);\r\n          x += dx;\r\n          y += dy;\r\n        }\r\n    \r\n        <span>\/\/ \u3072\u3063\u304f\u308a\u8fd4\u305b\u308b\u5834\u5408\u306e\u307f\u8ffd\u52a0<\/span>\r\n        <span>if<\/span> (x &gt;= <span>0<\/span> &amp;&amp; x &lt; GRID_SIZE &amp;&amp; y &gt;= <span>0<\/span> &amp;&amp; y &lt; GRID_SIZE &amp;&amp; board[x][y] === player) {\r\n          flippedStones = flippedStones.concat(tempFlipped);\r\n        }\r\n      }\r\n    \r\n      <span>return<\/span> flippedStones;\r\n    }\r\n    <\/code><\/pre>\n<ul>\n<li>\n<p>\u3072\u3063\u304f\u308a\u8fd4\u305b\u308b\u77f3\u3092\u5224\u5b9a\u3059\u308b\u305f\u3081\u306b\u30018\u65b9\u5411\u306b\u5bfe\u3057\u3066\u76f8\u624b\u306e\u77f3\u304c\u3042\u308b\u304b\u3092\u78ba\u8a8d\u3057\u3001\u6700\u7d42\u7684\u306b\u81ea\u5206\u306e\u77f3\u304c\u6765\u308b\u4f4d\u7f6e\u307e\u3067\u30c1\u30a7\u30c3\u30af\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<\/ul>\n<hr>\n<h2>3. \u30b2\u30fc\u30e0\u306e\u7d42\u4e86\u5224\u5b9a\u3068\u30ea\u30bb\u30c3\u30c8<\/h2>\n<pre><code><span>\/\/ \u30b2\u30fc\u30e0\u7d42\u4e86\u6642\u306e\u52dd\u8005\u5224\u5b9a<\/span>\r\n    <span><span>function<\/span> <span>getWinner<\/span>(<span><\/span>) <\/span>{\r\n      <span>let<\/span> counts = board.flat().reduce(\r\n        <span>(<span>acc, cell<\/span>) =&gt;<\/span> {\r\n          <span>if<\/span> (cell) acc[cell]++;\r\n          <span>return<\/span> acc;\r\n        },\r\n        { <span>black<\/span>: <span>0<\/span>, <span>white<\/span>: <span>0<\/span> }\r\n      );\r\n    \r\n      <span>if<\/span> (counts.black &gt; counts.white) <span>return<\/span> <span>\"Black\"<\/span>;\r\n      <span>if<\/span> (counts.white &gt; counts.black) <span>return<\/span> <span>\"White\"<\/span>;\r\n      <span>return<\/span> <span>\"Draw\"<\/span>;\r\n    }\r\n    \r\n    <span>\/\/ \u30b2\u30fc\u30e0\u30ea\u30bb\u30c3\u30c8<\/span>\r\n    <span>document<\/span>.getElementById(<span>\"reset-button\"<\/span>).addEventListener(<span>\"click\"<\/span>, initGame);<\/code><\/pre>\n<p>\u3053\u308c\u3067\u3001\u30aa\u30bb\u30ed\u30b2\u30fc\u30e0\u304c\u5b8c\u6210\u3057\u307e\u3057\u305f\u3002\u30b2\u30fc\u30e0\u7d42\u4e86\u6642\u306b\u306f\u3001\u52dd\u8005\u3092\u5224\u5b9a\u3057\u3001\u30ea\u30bb\u30c3\u30c8\u30dc\u30bf\u30f3\u3067\u30b2\u30fc\u30e0\u3092\u518d\u30b9\u30bf\u30fc\u30c8\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002\u57fa\u672c\u7684\u306a\u30ed\u30b8\u30c3\u30af\u3092\u30b7\u30f3\u30d7\u30eb\u306b\u5b9f\u88c5\u3057\u3066\u3044\u308b\u306e\u3067\u3001\u3055\u3089\u306b\u6539\u826f\u3084\u6a5f\u80fd\u8ffd\u52a0\u3082\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<ul>\n<li>\n<p>\u30b2\u30fc\u30e0\u7d42\u4e86\u6642\u306b\u306f\u3001\u30dc\u30fc\u30c9\u306b\u7f6e\u304b\u308c\u305f\u77f3\u306e\u6570\u3092\u30ab\u30a6\u30f3\u30c8\u3057\u3066\u52dd\u8005\u3092\u5224\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>\u30ea\u30bb\u30c3\u30c8\u30dc\u30bf\u30f3\u304c\u30af\u30ea\u30c3\u30af\u3055\u308c\u308b\u3068\u3001initGame \u95a2\u6570\u304c\u547c\u3070\u308c\u3066\u3001\u30dc\u30fc\u30c9\u304c\u521d\u671f\u5316\u3055\u308c\u3001\u30b2\u30fc\u30e0\u304c\u6700\u521d\u304b\u3089\u59cb\u307e\u308a\u307e\u3059\u3002<\/p>\n<\/li>\n<\/ul>\n<h2>\u307e\u3068\u3081<\/h2>\n<p>\u3053\u306e\u30aa\u30bb\u30ed\u30b2\u30fc\u30e0\u306f\u3001\u57fa\u672c\u7684\u306a\u30b2\u30fc\u30e0\u306e\u6d41\u308c\uff08\u77f3\u3092\u3072\u3063\u304f\u308a\u8fd4\u3059\u3001\u30bf\u30fc\u30f3\u306e\u7ba1\u7406\u3001\u30b2\u30fc\u30e0\u7d42\u4e86\u5224\u5b9a\u306a\u3069\uff09\u3092\u30b7\u30f3\u30d7\u30eb\u306b\u5b9f\u88c5\u3057\u3066\u3044\u307e\u3059\u3002<br \/>&lt;canvas&gt; \u3092\u4f7f\u3063\u305f\u63cf\u753b\u3068\u3001JavaScript\u306e\u30a4\u30d9\u30f3\u30c8\u51e6\u7406\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u4ed5\u7d44\u307f\u3084\u30ed\u30b8\u30c3\u30af\u306e\u6d41\u308c\u3092\u8996\u899a\u7684\u306b\u78ba\u8a8d\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><\/p>\n<\/p><\/div>\n","protected":false},"featured_media":964,"template":"","_links":{"self":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/route\/962"}],"collection":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/route"}],"about":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/types\/route"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/media\/964"}],"wp:attachment":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/media?parent=962"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}