ChatGPT によるリバーシゲームを作成してみます。
概要
ふとChatGPT でリバーシを作ったらどうなるか試したくなりました。
- ChatGPT 4o
- JavaScript
続き
チャットの内容
簡単なやり取りで、ゲーム作成・改良が出来ました。
チャットの内容を公開リンクにしてみました。
- JavaScript で、リバーシゲームを作成してください
- コードを応答
- 初期画面不正
- 初期画面に4つの駒が配置されていません
- コードを応答
- ゲーム画面表示・動作
- ゲーム中も白と黒の個数を表示して
- コードを応答
- 初期画面不正
- 初期画面に4つの駒が配置されていません
- コードを応答
- ゲーム画面表示・動作
- リセットボタンを追加して
- コードを応答
- ゲーム画面表示・動作
作成されたコード
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>リバーシゲーム</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
}
table {
margin: 20px auto;
border-collapse: collapse;
}
td {
width: 50px;
height: 50px;
border: 1px solid black;
text-align: center;
vertical-align: middle;
font-size: 24px;
cursor: pointer;
}
.black {
background-color: black;
}
.white {
background-color: white;
}
.empty {
background-color: green;
}
</style>
</head>
<body>
<h1>リバーシゲーム</h1>
<table id="board"></table>
<p id="status"></p>
<p>黒: <span id="black-count">2</span> 白: <span id="white-count">2</span></p>
<button id="reset-btn">リセット</button> <!-- リセットボタンを追加 -->
<script src="reversi.js"></script>
</body>
</html>
.riversi.js
const SIZE = 8;
const EMPTY = 0;
const BLACK = 1;
const WHITE = 2;
let board = [];
let currentPlayer = BLACK;
// 初期化
function initBoard() {
board = Array(SIZE).fill(null).map(() => Array(SIZE).fill(EMPTY));
// 初期配置
board[3][3] = WHITE;
board[3][4] = BLACK;
board[4][3] = BLACK;
board[4][4] = WHITE;
renderBoard();
updateStatus();
}
// ボードを描画
function renderBoard() {
const table = document.getElementById('board');
table.innerHTML = '';
let blackCount = 0;
let whiteCount = 0;
for (let y = 0; y < SIZE; y++) {
const row = document.createElement('tr');
for (let x = 0; x < SIZE; x++) {
const cell = document.createElement('td');
// 駒の状態に応じてクラスを追加
if (board[y][x] === BLACK) {
cell.classList.add('black');
blackCount++; // 黒の数をカウント
} else if (board[y][x] === WHITE) {
cell.classList.add('white');
whiteCount++; // 白の数をカウント
} else {
cell.classList.add('empty'); // 空のマスのみ空にする
}
cell.addEventListener('click', () => handleClick(x, y));
row.appendChild(cell);
}
table.appendChild(row);
}
// 駒の数を表示
document.getElementById('black-count').textContent = blackCount;
document.getElementById('white-count').textContent = whiteCount;
}
// 駒を置く処理
function handleClick(x, y) {
if (board[y][x] !== EMPTY || !isValidMove(x, y, currentPlayer)) {
return;
}
placeDisk(x, y, currentPlayer);
flipDisks(x, y, currentPlayer);
currentPlayer = currentPlayer === BLACK ? WHITE : BLACK;
renderBoard();
updateStatus();
if (!canMove(currentPlayer)) {
currentPlayer = currentPlayer === BLACK ? WHITE : BLACK;
if (!canMove(currentPlayer)) {
endGame();
}
}
}
// 駒を置く
function placeDisk(x, y, player) {
board[y][x] = player;
}
// 駒をひっくり返す
function flipDisks(x, y, player) {
const directions = [
[0, 1], [1, 0], [0, -1], [-1, 0],
[1, 1], [1, -1], [-1, 1], [-1, -1]
];
for (let [dx, dy] of directions) {
if (canFlip(x, y, dx, dy, player)) {
let nx = x + dx;
let ny = y + dy;
while (board[ny][nx] !== player) {
board[ny][nx] = player;
nx += dx;
ny += dy;
}
}
}
}
// 駒をひっくり返せるか確認
function canFlip(x, y, dx, dy, player) {
let nx = x + dx;
let ny = y + dy;
let foundOpponent = false;
while (nx >= 0 && nx < SIZE && ny >= 0 && ny < SIZE) {
if (board[ny][nx] === EMPTY) return false;
if (board[ny][nx] === player) return foundOpponent;
foundOpponent = true;
nx += dx;
ny += dy;
}
return false;
}
// 有効な手か確認
function isValidMove(x, y, player) {
const directions = [
[0, 1], [1, 0], [0, -1], [-1, 0],
[1, 1], [1, -1], [-1, 1], [-1, -1]
];
return directions.some(([dx, dy]) => canFlip(x, y, dx, dy, player));
}
// 現在のプレイヤーが手を打てるか確認
function canMove(player) {
for (let y = 0; y < SIZE; y++) {
for (let x = 0; x < SIZE; x++) {
if (board[y][x] === EMPTY && isValidMove(x, y, player)) {
return true;
}
}
}
return false;
}
// ゲーム終了
function endGame() {
const blackCount = board.flat().filter(disk => disk === BLACK).length;
const whiteCount = board.flat().filter(disk => disk === WHITE).length;
const status = document.getElementById('status');
if (blackCount > whiteCount) {
status.textContent = `黒の勝ち! 黒: ${blackCount}, 白: ${whiteCount}`;
} else if (whiteCount > blackCount) {
status.textContent = `白の勝ち! 黒: ${blackCount}, 白: ${whiteCount}`;
} else {
status.textContent = `引き分け! 黒: ${blackCount}, 白: ${whiteCount}`;
}
}
// 状態を更新
function updateStatus() {
const status = document.getElementById('status');
status.textContent = currentPlayer === BLACK ? '黒のターン' : '白のターン';
}
// リセットボタンの処理
document.getElementById('reset-btn').addEventListener('click', function() {
currentPlayer = BLACK; // 黒を先攻にリセット
initBoard(); // ボードを初期化
});
// 初期化
initBoard();