HTML・CSS・JavaScriptで作る4目並べ(Connect4)AI対戦ゲームの作り方をやさしく解説する記事のアイキャッチイメージ。

開発ガイド

【コピペで完成】4目並べ(Connect4)AI対戦の作り方|HTML・CSS・JavaScriptで簡単実装!

「ブラウザで動くゲームを自分で作ってみたい」
「AIが相手をしてくれる本格的なゲームを作りたい」
そんな方に向けて、この記事では 4目並べ(Connect4)AI対戦ゲームを“ゼロから自作する方法” を丁寧に解説します。

難しそうに見えるAIゲームですが、必要なのは
HTML・CSS・JavaScript の3つだけ。
しかも、1つの HTML ファイルをコピペするだけで動かせるので、
プログラミング初心者でも安心して取り組めます。

今回作るゲームは、

  • 落下アニメーションつきの本格ボード
  • 先手/後手の切り替え
  • AIの強さは3段階(初級・中級・上級)
  • 勝利ラインが光る演出
  • スマホ対応
    といった、完成度の高い仕上がりになります。

記事内では
「まずは動かす」→「仕組みを理解する」→「カスタマイズする」
という流れで、初心者でも迷わず進められる構成にしています。

4目並べ(Connect4)AI対戦はどんなゲーム?

まずは、この記事で作れる 完成版の4目並べ(Connect4)AI対戦ゲーム
どんな動きをするのかイメージしておきましょう。

以下のようなゲームが、HTML・CSS・JavaScript だけであなた自身の手で作れるようになります。

完成版を体験してみよう

【4目並べの基本ルール】

  • 縦6 × 横7 のボード を使う
  • プレイヤーは交互にコマを置く
  • コマは上から落ちて、その列の一番下に積み重なる
  • 縦・横・斜めのどこかで 4つ連続で並べたら勝ち!
  • 全てのマスが埋まっても勝者がいない場合はドローになります。

今回実装したゲームの仕様(実装ポイント)

先手・後手を自由に選択

ゲーム開始前に プレイヤー先手/AI先手 を切り替え可能。

AIの強さは 3 段階(初級・中級・上級)

ゲーム開始前に AI の強さを選択できます。

  • 初級:3手先まで読む
  • 中級:6手先を読む
  • 上級:8手先まで読む本格AI

初めての人でも簡単に勝てる設定から、
“本気でやらないと勝てない” レベルまで幅広く対応。

コマがストンと落ちるアニメーション

コマの落下演出。
視覚的に気持ちよく、完成度の高い見た目になります。

勝利ラインは光ってハイライト

4つが揃ったら、勝利したラインを 緑色の枠線 で強調表示。
初心者でも「どこで揃ったのか」がすぐわかります。

スコアを自動で記録

  • プレイヤー勝利数
  • AI勝利数

が自動でカウントされます。

スマホでもプレイ可能(レスポンシブ対応)

画面サイズに合わせて自動調整。
PC・スマホどちらでも遊べるようになっています。

まずは動かしてみよう(完成コードをコピペ)

4目並べ(Connect4)AI対戦ゲームは、
たった1つの HTML ファイルだけで動きます。

ゲーム作りが初めての方でも、以下の手順どおりに進めれば
必ず動く状態まで完成します。

必要なもの(最低限)

  • パソコン(Windows / Mac どちらでもOK)
  • ブラウザ(Chrome 推奨)
  • エディタ(VSCode・メモ帳・メモ帳アプリでも可)

最初は「メモ帳」でも問題ありません。

新規ファイルを用意する

  1. デスクトップなど分かりやすい場所に、任意のフォルダを作成(例:game-make)。
  2. メモ帳(Windows)やテキストエディット(Mac)などのテキストエディタを開く。
  3. ファイル名を connect4.html として保存。

完成コードをまるごと貼り付ける

下の「完成コード」をすべてコピーして、connect4.html に貼り付け、上書き保存します。

完成コード

ブラウザで開いて動作確認する

  1.  connect4.htmlダブルクリックして開く(既定のブラウザで起動)。
  2. すぐにプレイできます。
  3. スマホ表示の確認は、PCのブラウザでデベロッパーツールのデバイス表示を使うと便利です。

HTMLでゲームの土台を作成する

ここから、4目並べ(Connect4)AI対戦ゲームを“実際に形にしていく”工程に入ります。
まずは HTML でゲーム画面の土台(枠組み) を作ります。

HTMLは、ゲームの

  • ボード
  • スコア表示
  • ゲーム開始ボタン
  • 選択メニュー(先手・難易度)
    などの「見える部分」を構成する大事なパートです。

HTMLで作る主なパーツ

HTML部分に貼り付けるコードには、次のような構成が含まれます。

1. ゲーム全体を包む .wrap

画面中央にボードや設定UIをまとめて配置するための大枠です。

操作UI(先手・難易度・スタートボタン)

  • 先手/後手(プレイヤー or AI)を選ぶセレクトボックス<select id="first">
  • AIの強さ(初級・中級・上級)を選ぶセレクトボックス<select id="level">
  • ゲーム開始ボタン<button id="btnStart">

HTML側では、これらを <select><button> で定義しています。

現在の手番やスコアを表示する

ゲームが始まると、

  • 「プレイヤー(赤)の番です」
  • 「AIが思考中です…」
  • 「あなたの勝ち!」

などのメッセージが表示されます。

また、スコア(プレイヤー勝利数・AI勝利数)もここに表示されます。

HTML側では、これらを <div class="msg" id="message"><div class="status"> で定義しています。

ボード(6行 × 7列)を表示する仕組み

4目並べの「6行 × 7列」のボードは、
HTMLに直接書くのではなく、
JavaScript が <div class="grid" id="grid"> の中に自動生成します。

HTML側では「ボードを置くための空の箱」だけを用意しておき、
実際のマス(セル)はすべてスクリプトで生成される仕組みです。

▼ HTMLにあるのは“枠”だけ

▼ JavaScript側で動的にマスを追加

  • 6×7 のセルをループで生成
  • DOMに追加してボードを構築
  • Clickイベントや石の描画はここで行う

マスは JavaScript が自動で作るので、HTMLは“置き場”だけ用意します。

ほーく
ほーく

CSSでボードとコマの見た目・アニメーションを作る

HTMLでゲームの「土台(枠)」ができたので、
この章では CSS を使って見た目を整え、4目並べらしい盤面とコマ を作っていきます。

CSS変数でサイズや色を一括管理(:root

CSSの先頭では、:root に以下のような変数が定義されています。

  • --rows … 行数(6
  • --cols … 列数(7
  • --cell-size … 1マスの大きさ
  • --board-color … 盤面の色(青)
  • --player1-color … プレイヤー(赤)のコマ色
  • --player2-color … AI(黄)のコマ色
  • --accent-color … 勝利ラインの光り方に使う色(緑)

これらの変数は、のちほど出てくる .grid.stone で使われます。
サイズや色をあとからまとめて調整できるのがポイントです。

全体レイアウト:.wrap.controls

画面全体の見た目を整えているのがこちらです。

  • body … 背景色や中央寄せ、余白など
  • .wrap … ゲーム全体のカード風コンテナ
    • 白背景に丸みのある角
    • 影をつけて「ひとつのツール」に見えるように
  • .controls … 先手・レベル・「ゲーム開始」ボタンの並び
    • フレックスレイアウトで横並び
    • スマホでも崩れにくいように gapflex-wrap を設定

ここまでで、ツールらしい見た目 が整います。

盤面を描画する .board-container.grid

4目並べのボードは、以下の2つで構成されています。

  • .board-container
    • 枠線(border)と角丸(border-radius
    • 影(box-shadow)で立体感
    • background-color: var(--board-color); でボード全体を青く
  • .grid
    • display: grid;
    • grid-template-columns: repeat(var(--cols), var(--cell-size));
    • grid-template-rows: repeat(var(--rows), var(--cell-size));
      6行 × 7列のマス目レイアウト を作っています。

実際の「マス」は、JavaScriptが #grid の中に .cell 要素をどんどん append して生成していく仕組みです。

穴の開いたボードを再現する .cell.cell::after

盤面の1マスは .cell で表現されます。

  • .cell
    • 各マスの大きさ(width / height
    • 中央寄せ(display: flex; align-items: center; justify-content: center;
    • マウスカーソル用の cursor: pointer;

さらに、.cell::after白い円形の「穴」 を重ねることで、
4目並べのボードらしい見た目を実現しています。

コマ(石)の見た目:.stone, .stone.player1, .stone.player2

コマは .stone クラスで表示されます。

  • .stone … コマ共通の形(円・サイズ・位置)
  • .stone.player1 … プレイヤー(赤)のコマ色
  • .stone.player2 … AI(黄)のコマ色

円のサイズを .cell::after と揃えることで、
穴の中にぴったり収まるような見た目になっています。

勝利ラインのハイライト:.stone.win-highlight

4つそろったときに、そのラインを光らせているのが
.stone.win-highlight です。

  • 緑色の光(box-shadow
  • 白い枠線で「ここが勝ち!」と分かりやすく強調

JavaScriptから勝利したコマにこのクラスを追加することで、
自動的にエフェクトが適用されます。

コマが落ちる演出:@keyframes drop.stone.dropping

CSSアニメーションで「上からストンと落ちる」動きを付けています。

  • --drop-start-row … どの高さから落ちてくるかをJS側で設定
  • .stone.dropping を付けたコマだけ、上から下へスッと落ちる

視覚的に「置いた感」が出るので、
ゲームがぐっと気持ちよくなります。

列をわかりやすくするハイライト:.column-highlight

マウスを重ねた列をわかりやすくするためのクラスです。

JavaScript側で、同じ列の .cell
.column-highlight を付けたり外したりしています。

スマホ対応:@media (max-width: 600px)

画面幅が狭いとき(スマホなど)は、
@media (max-width: 600px) の中で

  • --cell-size13vw に変更
  • .grid の幅・高さをそれに合わせて再計算
  • .wrap の余白を少し減らす
  • .controls の並びが詰まりすぎないよう調整

といったレスポンシブ対応を行っています。

JavaScriptでゲームのロジックを作る

この章では、4目並べ(Connect4)AI対戦ゲームの
JavaScript ロジックの流れを、できるだけ噛み砕いて解説します。

定数と状態管理:ゲームの「ルール」と「今の状況」を持つ

まず最初に、ゲームの基本ルールと状態を定義しています。

  • ROWS / COLS … 盤面サイズ(6行×7列)
  • CONNECT_COUNT … 何個そろえたら勝ちか(4個)
  • EMPTY / PLAYER1 / PLAYER2 … 盤面上の状態を数字で表現
  • ANIMATION_DURATION … 落下アニメーションの時間(ミリ秒)

さらに、ゲーム全体の状態は gameState オブジェクトでまとめています。

  • boardboard[row][col] でコマの状態を保存
  • currentPlayer … 今打つ側(PLAYER1 か PLAYER2)
  • humanColor / aiColor … プレイヤーとAIの担当色
  • playerScore / aiScore … 勝利数
  • isThinking … AIが思考中かどうか(多重入力防止)

gameState に状態をまとめると、“今ゲームがどんな状況か” が追いやすくなります。

ほーく
ほーく

DOM要素の取得と 2次元配列参照

HTML側の要素は、次のように getElementById で取得しています。

  • #grid … 盤面(マス)を並べるコンテナ
  • #message … 「プレイヤーの番です」「AIが思考中です…」などのメッセージ表示
  • #btnStart … ゲーム開始/再開ボタン
  • #first … 先手(プレイヤー or AI)選択
  • #level … AIの強さ(3 / 6 / 8)選択
  • #scorePlayer / #scoreAI … スコア表示

また、盤面に対応するセルと石の DOM を
2次元配列で参照できるようにしています。

これにより、

  • cellEls[r][c] … r 行 c 列の .cell 要素
  • stoneEls[r][c] … r 行 c 列に対応する .stone 要素

という形で、あとから高速にアクセスできます。

盤面DOMを作る:createBoardDOM()

盤面の 6×7 のマスは、HTMLに直接書かれておらず、
JavaScript の createBoardDOM() で動的に生成されています。

ポイント:

  • .cell 要素に data-r / data-c を持たせて、どの行・列か分かるようにしている
  • .stone は常に存在し、クラス(.player1 / .player2)で色を切り替える方式
  • クリック・マウスオーバーは #grid に対する イベント委譲 で処理

基本ユーティリティ関数

ゲームロジックを読みやすくするために、
いくつかの「小さな便利関数」が用意されています。

代表的なもの:

  • getNextOpenRow() … 指定列で「一番下から見て空いている行」を返す
  • getLegalMoves() … まだ石を置ける列の一覧を返す

勝敗判定:checkWin() と評価用ロジック

勝敗の判定は、DIRECTIONScountLine() を使って行います。

checkWin(boardState, r, c, color) は、
最後に置いた位置 (r, c) から各方向へ同じ色が
4つ連続しているかどうか を調べます。

評価関数 evaluateBoard() では、
4マスの「窓」をスライドしながら、

  • 自分の石 3つ+空き1つ → 高得点
  • 自分の石 2つ+空き2つ → そこそこ得点
  • 中央の列 → 少しボーナス

といったスコアを加算しています(WEIGHTS.CENTER / WEIGHTS.THREE_IN_A_ROW など)。

石を置く流れ:handleBoardClick()handleMove()

プレイヤーが盤面をクリックしたときの流れはこうです。

  1. gridEl に登録された handleBoardClick() が呼ばれる
  2. e.target.closest('.cell') でクリックされた .cell を取得
  3. cell.dataset.c から列番号 colIndex を取得
  4. handlePlayerClick(colIndex)handleMove(colIndex, gameState.humanColor, false) を実行

handleMove(colIndex, color, isAI) の中では、

  • applyMoveAndCheck()board に石を置きつつ、勝敗をチェック
  • 落下アニメーションを handleDropAnimation() で再生
  • 勝ちなら gameOver(color)、引き分けなら gameOver(EMPTY)
  • どちらでもないなら currentPlayer を交代し updateStatus() を実行
  • AIのターンになったら aiTurn() を呼び出す

という一連の流れを管理しています。

画面更新:redrawStones() とハイライト

redrawStones() は、gameState.board の内容を
画面の .stone に反映させる関数です。

  • stoneEls[r][c]classList をクリア
  • 値が PLAYER1 なら .player1 を、PLAYER2 なら .player2 を付ける
  • 勝利ラインがある場合は .win-highlight を付与して光らせる

列のハイライトは highlightColumn(colIndex, highlight) が担当し、
cellEls[r][colIndex].classList.toggle('column-highlight', highlight);
で列全体を分かりやすくしています。

AIのロジック:aiTurn()minimax()

AIのターンでは、aiTurn() が中心になります。

ポイント:

  • gameState.isThinking で重複操作を防止
  • findForcedMove()
    • 自分がすぐ勝てる手
    • 相手がすぐ勝ちそうな手
      を先にチェック(「即勝ち・即ブロック」)
  • それ以外は minimax()
    与えられた深さ(レベルごとに 3 / 6 / 8)まで探索
  • αβ枝刈り(アルファ・ベータ)で不要な探索を早めにカット
  • 中央列に近い着手ほど優先して探索し、賢く振る舞うように工夫

【カスタマイズ案】自分だけの4目並べに進化させよう

4目並べ(Connect4)AI対戦ゲームは、
そのままでも十分遊べますが、
ちょっとしたカスタマイズで“オリジナルゲーム”に進化します。

ここでは、初心者でも簡単にできるものから、
AIロジックを深めたい人向けの高度な改造まで紹介します。

コマの色を変える(初心者向け)

プレイヤーやAIの色は、CSSの変数で変えられます。

色を変えるだけで、ゲームの雰囲気がガラッと変わります。

AIの評価関数を調整する(中〜上級)

AIの強さを本格的に変えたいなら、
evaluateBoard() のスコアリングを調整します。

たとえば:

  • 中央列の優先度を強める
  • 2連・3連のスコアを別の値にする
  • 相手の脅威(危険な形)に高い評価をつける

ほんの少し変えるだけで“性格の違うAI”が生まれます。

おすすめの学習リソース|もっとスキルを伸ばしたいあなたへ

4目並べ(Connect4)」を完成させたことで、あなたはすでに HTML・CSS・JavaScriptの基礎 に触れました。
ここからさらにステップアップするために役立つ学習リソースを紹介します。

おすすめ書籍

『ゲームで学ぶJavaScript入門 増補改訂版 ~ブラウザゲームづくりでHTML&CSSも身につく!』

  • ゲームを作りながら学べるので、退屈せずにJavaScriptの基礎が身につく
  • HTML・CSS・JavaScriptの基本を一冊で網羅、Web制作の土台が自然に理解できる
  • 13本のサンプルゲームを実際に動かせるから「作れる喜び」が味わえる
  • 初心者・中高生にもやさしい解説で、初めてのゲームプログラミングに最適

『スラスラわかるHTML&CSSのきほん』(SBクリエイティブ)

  • Web制作初心者に最適な入門書。HTMLとCSSの仕組みをやさしく解説。
  • これからWebページを作ってみたい方にぴったり。
  • レイアウトの基本やスタイルの調整方法など、実践的に学べます。
SBクリエイティブ/狩野祐東

オンライン講座編

Udemy|世界最大級のオンライン学習プラットフォーム

世界中で利用されるオンライン学習サイト。
HTML、CSS、JavaScriptの入門から応用まで、高評価の講座が数百種類揃っています。
初心者でも動画を見ながら手を動かせるので、挫折しにくいのが魅力です。

【まとめ】4目並べAIを作ってゲーム開発の基礎を身につけよう

ここまでの手順で、4目並べ(Connect4)AI対戦ゲームが完成しました。
HTML・CSS・JavaScript だけで、

  • 盤面の生成
  • 石の落下アニメーション
  • 勝利判定
  • AIとの対戦

といった本格的なゲームが作れたのは、大きな経験になります。

「動くゲームを作れた」という経験は、
プログラミングを続ける上で大きな自信になります。

ぜひこの経験を活かして、
さらに楽しい作品を作り続けてください!

関連記事

【実際に遊べる 4目並べ(Connect4)はこちら。AIと対戦してみましょう!】▼

4目並べ(Connect4)づくりを楽しめた方は、以下の記事もおすすめです。
どれもブラウザだけで動く本格的なゲームを題材にしており、AIロジックやJavaScriptの理解がさらに深まります。

【作り方記事】まるばつゲーム(三目並べ)の作り方|AI対戦ロジックを学ぼう!

【作り方記事】五目並べAI対戦の作り方|本格的なAI構築の応用編

-開発ガイド
-, , , , ,