はじめに
このプロジェクトでは、HTML、CSS、JavaScript を使用して Tic-Tac-Toe(三目並べ)ゲームを作成する方法を学びます。Tic-Tac-Toe は、3x3 のグリッド上で 2 人のプレイヤーが交互に X または O を配置するゲームです。目的は、水平、垂直、または対角線上に自分のマークを 3 つ並べることです。必要な HTML、CSS、JavaScript ファイルを作成し、ステップバイステップでゲームロジックを実装していきます。
👀 プレビュー

🎯 タスク
このプロジェクトでは、以下の内容を学びます:
- HTML を使用して Tic-Tac-Toe ゲームの基本構造を構築する方法。
- CSS スタイルを追加してゲーム要素の外観を定義する方法。
- JavaScript を使用してゲームロジックを実装する方法。
- ユーザーインタラクションの処理、勝利や引き分けの判定、スコアの更新を行う方法。
- ゲームボードのレンダリングとターン表示の更新を行う方法。
- プレイヤーがゲームをリセットして新しいラウンドを開始できるようにする方法。
🏆 達成目標
このプロジェクトを完了すると、以下のことができるようになります:
- Web アプリケーション用の HTML ファイルの構造化。
- CSS クラスを使用した要素のスタイリング。
- JavaScript を使用したゲームロジックの実装。
- ユーザーインタラクションの処理と UI の適切な更新。
- ゲームボードのレンダリングとターン表示の更新。
- イベントリスナーの作成と JavaScript でのイベント処理。
HTML ファイルの作成
index.html という名前の新しいファイルを作成し、以下のコードを追加します。
cd ~/project
touch index.html
このコードは、Tic-Tac-Toe ゲームの基本構造を設定します。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Tic-Tac-Toe</title>
<link
href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css"
rel="stylesheet"
/>
<style>
/* CSS styles for the game */
</style>
</head>
<body>
<div id="app">
<h1 class="text-3xl font-bold mb-4 text-gray-900">Tic-Tac-Toe</h1>
<div id="board" class="grid grid-cols-3 gap-4 mb-4">
<!-- Game board cells -->
</div>
<div id="scoreboard" class="flex justify-between items-center mb-4">
<!-- Player scores -->
</div>
<div
id="turn-indicator"
class="text-2xl font-bold mb-4 text-gray-900"
></div>
<button
id="reset-button"
class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"
>
Reset Game
</button>
</div>
<script>
// JavaScript code for the game logic
</script>
</body>
</html>
CSS スタイルの追加
HTML ファイルの <head> セクションにある <style> タグ内に、ゲームに必要な CSS スタイルを追加します。これらのスタイルは、ゲームボード、セル、スコア、ボタンなどのゲーム要素の外観を定義します。
<style>
.board-cell {
width: 100px;
height: 100px;
}
body {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
background-color: #222;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
}
#app {
text-align: center;
background-color: #f5f5f5;
border-radius: 8px;
padding: 24px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
h1 {
font-size: 32px;
color: #333;
}
.text-gray-900 {
color: #333 !important;
}
.text-2xl {
font-size: 24px;
}
.bg-blue-500 {
background-color: #4267b2;
}
.bg-blue-500:hover {
background-color: #3b5ca0;
}
.bg-blue-700 {
background-color: #385898;
}
.text-white {
color: #fff !important;
}
.rounded {
border-radius: 4px;
}
.highlight {
background-color: #ffed4a;
}
</style>
また、style.css をプロジェクトに追加し、<link> タグを使用して HTML ファイルにリンクすることもできます。
<link rel="stylesheet" href="style.css" />
お好みの方法を選択してください。
ゲームロジックの JavaScript コードを追加
HTML ファイルの最後にある <script> タグ内に、ゲームロジックを処理する JavaScript コードを追加します。このコードは、ゲームの状態を追跡し、ユーザーインタラクションを処理し、勝利や引き分けを判定し、スコアを更新し、ゲームボードをレンダリングします。
<script>
// Game logic code
</script>
ゲーム変数の初期化
JavaScript コードの冒頭で必要な変数を宣言します。これらの変数は、ゲームの状態、プレイヤーのスコア、およびその他の関連情報を保持します。
// Game logic
const board = ["", "", "", "", "", "", "", "", ""];
let currentPlayer = "X";
let gameEnded = false;
let playerXScore = 0;
let playerOScore = 0;
let winningCells = [];
セルクリックの処理
ゲームボードのセルがクリックされたときに呼び出される handleCellClick 関数を作成します。この関数は、ボードの更新、勝利判定、スコア更新、現在のプレイヤーの切り替えなど、主要なゲームロジックを処理します。
function handleCellClick(index) {
if (gameEnded || board[index] !== "") return;
board[index] = currentPlayer;
renderBoard();
if (checkWin()) {
updateScore();
highlightWinningCells();
alert(`Player ${currentPlayer} wins!`);
gameEnded = true;
} else if (board.every((cell) => cell !== "")) {
alert("It's a tie!");
gameEnded = true;
} else {
currentPlayer = currentPlayer === "X" ? "O" : "X";
updateTurnIndicator();
}
}
勝利判定
ゲームボード上に勝利条件が満たされているかを確認する checkWin 関数を作成します。この関数は、ボード配列の値と勝利の組み合わせを比較して、プレイヤーがゲームに勝利したかどうかを判断します。
function checkWin() {
const winningCombinations = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[0, 3, 6],
[1, 4, 7],
[2, 5, 8],
[0, 4, 8],
[2, 4, 6]
];
for (let i = 0; i < winningCombinations.length; i++) {
const [a, b, c] = winningCombinations[i];
if (board[a] !== "" && board[a] === board[b] && board[a] === board[c]) {
winningCells = [a, b, c];
return true;
}
}
return false;
}
ゲームのリセット
ゲームの状態を初期値にリセットする resetGame 関数を作成します。この関数はリセットボタンがクリックされたときに呼び出され、ボードをクリアし、現在のプレイヤーをリセットし、勝利セルをクリアし、ターン表示を更新して、ボードを再レンダリングします。
function resetGame() {
board.fill("");
currentPlayer = "X";
gameEnded = false;
winningCells = [];
updateTurnIndicator();
renderBoard();
}
プレイヤーのスコア更新
プレイヤーのスコアを更新する updateScore 関数を作成します。この関数は、プレイヤーがゲームに勝利したときに呼び出されます。対応するプレイヤーのスコアをインクリメントし、ページ上のスコア表示を更新します。
function updateScore() {
if (currentPlayer === "X") {
playerXScore++;
document.getElementById("player-x-score").textContent = playerXScore;
} else {
playerOScore++;
document.getElementById("player-o-score").textContent = playerOScore;
}
}
ターン表示の更新
現在のプレイヤーのターンを示すために、ページ上のターン表示を更新する updateTurnIndicator 関数を作成します。
function updateTurnIndicator() {
const turnIndicator = document.getElementById("turn-indicator");
turnIndicator.textContent = `Current Turn: Player ${currentPlayer}`;
}
勝利セルのハイライト
ゲームボード上の勝利セルにハイライトクラスを追加する highlightWinningCells 関数を作成します。この関数は、プレイヤーがゲームに勝利したときに呼び出されます。
function highlightWinningCells() {
const cells = document.querySelectorAll(".board-cell");
cells.forEach((cell, index) => {
if (winningCells.includes(index)) {
cell.classList.add("highlight");
}
});
}
ゲームボードのレンダリング
board 配列の現在の状態に従って、ページ上のゲームボードを更新する renderBoard 関数を作成します。この関数は、各プレイヤーの移動後に視覚情報を更新するために呼び出されます。
function renderBoard() {
const cells = document.querySelectorAll(".board-cell");
cells.forEach((cell, index) => {
cell.textContent = board[index];
cell.classList.remove("highlight");
});
}
イベントリスナーの追加
ゲームボードのセルとリセットボタンにイベントリスナーを追加します。これらのイベントリスナーは、イベントが発生したときに対応する関数を呼び出します。
// Event listeners
const cells = document.querySelectorAll(".board-cell");
cells.forEach((cell, index) => {
cell.addEventListener("click", () => handleCellClick(index));
});
const resetButton = document.getElementById("reset-button");
resetButton.addEventListener("click", resetGame);
初期レンダリング
JavaScript コードの最後に、初期レンダリング用のコードを追加します。このコードは、ゲームの初期状態を設定し、ターン表示を更新し、ゲームボードをレンダリングします。
// Initial render
updateTurnIndicator();
renderBoard();
プロジェクトの実行
これでプロジェクトを実行し、Tic-Tac-Toe をプレイできます!
WebIDE の右下隅にある Go Live ボタンをクリックして、プロジェクトを実行します。

これにより、Web 8080 タブでプロジェクトが開きます。

セルをクリックして移動し、リセットボタンをクリックして新しいゲームを開始してください。
まとめ
おめでとうございます!HTML、CSS、JavaScript を使用して Tic-Tac-Toe ゲームを無事に作成できました。このプロジェクトでは、HTML ファイルの作成、CSS スタイルの追加、ゲームロジックの実装、ユーザーインタラクションの処理を網羅しました。このゲームでは、2 人のプレイヤーが交互にプレイし、勝利や引き分けの判定、スコアの更新、勝利セルのハイライトが行われます。これでプロジェクトを実行して、Tic-Tac-Toe を楽しんでください!



