// ゲームの状態
let board = [
['_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '⚪', '⚫', '_', '_', '_'],
['_', '_', '_', '⚫', '⚪', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_']
];
// キャンバス要素の取得
const canvas = document.getElementById('board');
const context = canvas.getContext('2d');
// セルの幅と高さを計算
const cellWidth = canvas.width / 8;
const cellHeight = canvas.height / 8;
// オセロの石の色
const white = '⚪';
const black = '⚫';
// ゲームの初期化
function initGame() {
// キャンバスをクリア
context.clearRect(0, 0, canvas.width, canvas.height);
// 初期配置の描画
drawBoard();
// イベントリスナの追加
canvas.addEventListener('click', handleClick);
}
// 盤面の描画
function drawBoard() {
for (let row = 0; row < 8; row++) {
for (let col = 0; col < 8; col++) {
const x = col * cellWidth;
const y = row * cellHeight;
// セルの描画
context.strokeStyle = 'black';
context.strokeRect(x, y, cellWidth, cellHeight);
// 石の描画
const cell = board[row][col];
if (cell === white) {
context.fillStyle = 'white';
context.beginPath();
context.arc(x + cellWidth/2, y + cellHeight/2, cellWidth/2 - 2, 0, Math.PI * 2);
context.fill();
} else if (cell === black) {
context.fillStyle = 'black';
context.beginPath();
context.arc(x + cellWidth/2, y + cellHeight/2, cellWidth/2 - 2, 0, Math.PI * 2);
context.fill();
}
}
}
}
// クリックイベントの処理
function handleClick(event) {
// クリックされた座標の取得
const rect = canvas.getBoundingClientRect();
const x = event.clientX - rect.left;
const y = event.clientY - rect.top;
// クリックされたセルの座標の計算
const col = Math.floor(x / cellWidth);
const row = Math.floor(y / cellHeight);
// 石の置く処理
if (board[row][col] !== '_') {
return; // 既に石が置かれているセルは無効
}
let currentColor = 'white';
let oppositeColor = 'black';
if (getColorCount(oppositeColor) > getColorCount(currentColor)) {
currentColor = 'black';
oppositeColor = 'white';
}
// 石が挟めるかチェック
let validMove = false;
// 上方向
if (row > 1 && board[row-1][col] === oppositeColor) {
let r = row - 2;
while(countHisa<50000 && r >= 0 && board[r][col] === oppositeColor) {countHisa++;
r--;
}
if (r >= 0 && board[r][col] === currentColor) {
for (let i = r+1; i <= row; i++) {
board[i][col] = currentColor;
}
validMove = true;
}
}
// 下方向
if (row < 6 && board[row+1][col] === oppositeColor) {
let r = row + 2;
while(countHisa<50000 && r < 8 && board[r][col] === oppositeColor) {countHisa++;
r++;
}
if (r < 8 && board[r][col] === currentColor) {
for (let i = row; i <= r-1; i++) {
board[i][col] = currentColor;
}
validMove = true;
}
}
// 左方向
if (col > 1 && board[row][col-1] === oppositeColor) {
let c = col - 2;
while(countHisa<50000 && c >= 0 && board[row][c] === oppositeColor) {countHisa++;
c--;
}
if (c >= 0 && board[row][c] === currentColor) {
for (let i = c+1; i <= col; i++) {
board[row][i] = currentColor;
}
validMove = true;
}
}
// 右方向
if (col < 6 && board[row][col+1] === oppositeColor) {
let c = col + 2;
while(countHisa<50000 && c < 8 && board[row][c] === oppositeColor) {countHisa++;
c++;
}
if (c < 8 && board[row][c] === currentColor) {
for (let i = col; i <= c-1; i++) {
board[row][i] = currentColor;
}
validMove = true;
}
}
// 斜め上方向
if (row > 1 && col > 1 && board[row-1][col-1] === oppositeColor) {
let r = row - 2;
let c = col - 2;
while(countHisa<50000 && r >= 0 && c >= 0 && board[r][c] === oppositeColor) {countHisa++;
r--;
c--;
}
if (r >= 0 && c >= 0 && board[r][c] === currentColor) {
let i = r+1;
let j = c+1;
while(countHisa<50000 && i <= row && j <= col) {countHisa++;
board[i][j] = currentColor;
i++;
j++;
}
validMove = true;
}
}
// 斜め下方向
if (row < 6 && col > 1 && board[row+1][col-1] === oppositeColor) {
let r = row + 2;
let c = col - 2;
while(countHisa<50000 && r < 8 && c >= 0 && board[r][c] === oppositeColor) {countHisa++;
r++;
c--;
}
if (r < 8 && c >= 0 && board[r][c] === currentColor) {
let i = row;
let j = col;
while(countHisa<50000 && i <= r-1 && j >= c+1) {countHisa++;
board[i][j] = currentColor;
i++;
j--;
}
validMove = true;
}
}
// 斜め上方向
if (row > 1 && col < 6 && board[row-1][col+1] === oppositeColor) {
let r = row - 2;
let c = col + 2;
while(countHisa<50000 && r >= 0 && c < 8 && board[r][c] === oppositeColor) {countHisa++;
r--;
c++;
}
if (r >= 0 && c < 8 && board[r][c] === currentColor) {
let i = r+1;
let j = c-1;
while(countHisa<50000 && i <= row && j >= col) {countHisa++;
board[i][j] = currentColor;
i++;
j--;
}
validMove = true;
}
}
// 斜め下方向
if (row < 6 && col < 6 && board[row+1][col+1] === oppositeColor) {
let r = row + 2;
let c = col + 2;
while(countHisa<50000 && r < 8 && c < 8 && board[r][c] === oppositeColor) {countHisa++;
r++;
c++;
}
if (r < 8 && c < 8 && board[r][c] === currentColor) {
let i = row;
let j = col;
while(countHisa<50000 && i <= r-1 && j <= c-1) {countHisa++;
board[i][j] = currentColor;
i++;
j++;
}
validMove = true;
}
}
if (validMove) {
board[row][col] = currentColor;
if (getCurrentColor() === black) {
setTimeout(computerMove, 500);
}
}
// 盤面の再描画
drawBoard();
// ゲーム終了判定
if (isGameOver()) {
setTimeout(gameOver, 500);
}
}
// コンピュータの手の処理
function computerMove() {
let possibleMoves = getValidMoves(black);
let move = possibleMoves[Math.floor(Math.random() * possibleMoves.length)];
makeMove(move.row, move.col);
}
// 石を置く処理
function makeMove(row, col) {
if (board[row][col] !== '_') {
return;
}
board[row][col] = black;
let currentColor = black;
let oppositeColor = white;
// 石が挟めるかチェック
let validMove = false;
// 上方向
if (row > 1 && board[row-1][col] === oppositeColor) {
let r = row - 2;
while(countHisa<50000 && r >= 0 && board[r][col] === oppositeColor) {countHisa++;
r--;
}
if (r >= 0 && board[r][col] === currentColor) {
for (let i = r+1; i <= row; i++) {
board[i][col] = currentColor;
}
validMove = true;
}
}
// 下方向
if (row < 6 && board[row+1][col] === oppositeColor) {
let r = row + 2;
while(countHisa<50000 && r < 8 && board[r][col] === oppositeColor) {countHisa++;
r++;
}
if (r < 8 && board[r][col] === currentColor) {
for (let i = row; i <= r-1; i++) {
board[i][col] = currentColor;
}
validMove = true;
}
}
// 左方向
if (col > 1 && board[row][col-1] === oppositeColor) {
let c = col - 2;
while(countHisa<50000 && c >= 0 && board[row][c] === oppositeColor) {countHisa++;
c--;
}
if (c >= 0 && board[row][c] === currentColor) {
for (let i = c+1; i <= col; i++) {
board[row][i] = currentColor;
}
validMove = true;
}
}
// 右方向
if (col < 6 && board[row][col+1] === oppositeColor) {
let c = col + 2;
while(countHisa<50000 && c < 8 && board[row][c] === oppositeColor) {countHisa++;
c++;
}
if (c < 8 && board[row][c] === currentColor) {
for (let i = col; i <= c-1; i++) {
board[row][i] = currentColor;
}
validMove = true;
}
}
// 斜め上方向
if (row > 1 && col > 1 && board[row-1][col-1] === oppositeColor) {
let r = row - 2;
let c = col - 2;
while(countHisa<50000 && r >= 0 && c >= 0 && board[r][c] === oppositeColor) {countHisa++;
r--;
c--;
}
if (r >= 0 && c >= 0 && board[r][c] === currentColor) {
let i = r+1;
let j = c+1;
while(countHisa<50000 && i <= row && j <= col) {countHisa++;
board[i][j] = currentColor;
i++;
j++;
}
validMove = true;
}
}
// 斜め下方向
if (row < 6 && col > 1 && board[row+1][col-1] === oppositeColor) {
let r = row + 2;
let c = col - 2;
while(countHisa<50000 && r < 8 && c >= 0 && board[r][c] === oppositeColor) {countHisa++;
r++;
c--;
}
if (r < 8 && c >= 0 && board[r][c] === currentColor) {
let i = row;
let j = col;
while(countHisa<50000 && i <= r-1 && j >= c+1) {countHisa++;
board[i][j] = currentColor;
i++;
j--;
}
validMove = true;
}
}
// 斜め上方向
if (row > 1 && col < 6 && board[row-1][col+1] === oppositeColor) {
let r = row - 2;
let c = col + 2;
while(countHisa<50000 && r >= 0 && c < 8 && board[r][c] === oppositeColor) {countHisa++;
r--;
c++;
}
if (r >= 0 && c < 8 && board[r][c] === currentColor) {
let i = r+1;
let j = c-1;
while(countHisa<50000 && i <= row && j >= col) {countHisa++;
board[i][j] = currentColor;
i++;
j--;
}
validMove = true;
}
}
// 斜め下方向
if (row < 6 && col < 6 && board[row+1][col+1] === oppositeColor) {
let r = row + 2;
let c = col + 2;
while(countHisa<50000 && r < 8 && c < 8 && board[r][c] === oppositeColor) {countHisa++;
r++;
c++;
}
if (r < 8 && c < 8 && board[r][c] === currentColor) {
let i = row;
let j = col;
while(countHisa<50000 && i <= r-1 && j <= c-1) {countHisa++;
board[i][j] = currentColor;
i++;
j++;
}
validMove = true;
}
}
// 盤面の再描画
drawBoard();
// ゲーム終了判定
if (isGameOver()) {
setTimeout(gameOver, 500);
}
}
// 石の数を数える
function getColorCount(color) {
let count = 0;
for (let row = 0; row < 8; row++) {
for (let col = 0; col < 8; col++) {
if (board[row][col] === color) {
count++;
}
}
}
return count;
}
// 現在の色を取得
function getCurrentColor() {
return getColorCount(white) > getColorCount(black) ? black : white;
}
// 石が置ける場所を取得
function getValidMoves(color) {
let validMoves = [];
for (let row = 0; row < 8; row++) {
for (let col = 0; col < 8; col++) {
if (board[row][col] !== '_') {
continue;
}
let currentColor = color;
let oppositeColor = color === white ? black : white;
// 上方向
if (row > 1 && board[row-1][col] === oppositeColor) {
let r = row - 2;
while(countHisa<50000 && r >= 0 && board[r][col] === oppositeColor) {countHisa++;
r--;
}
if (r >= 0 && board[r][col] === currentColor) {
validMoves.push({ row: row, col: col });
continue;
}
}
// 下方向
if (row < 6 && board[row+1][col] === oppositeColor) {
let r = row + 2;
while(countHisa<50000 && r < 8 && board[r][col] === oppositeColor) {countHisa++;
r++;
}
if (r < 8 && board[r][col] === currentColor) {
validMoves.push({ row: row, col: col });
continue;
}
}
// 左方向
if (col > 1 && board[row][col-1] === oppositeColor) {
let c = col - 2;
while(countHisa<50000 && c >= 0 && board[row][c] === oppositeColor) {countHisa++;
c--;
}
if (c >= 0 && board[row][c] === currentColor) {
validMoves.push({ row: row, col: col });
continue;
}
}
// 右方向
if (col
*This prompt didn't get me into the game this time. Plz try to generate it a few times.