Click here for free DL of the app version that can save data.
No:30970 59
Prev Next
オセロ
Developer User14987|Date and time 23/12/24 18:21:40
Build time 80.105 sec|Game capacity 18.642KB|Script


// ゲームの状態 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.
Prev Next   Back  0  0 Menu 

[PR]現在の欲しいゲームランキング

Click here for free DL of the app version that can save data.

(C)2023 HisashiApp