Pythonで〇×ゲームのAIを一から作成する　その1　はじめに

# 全体の目次

https://qiita.com/ysgeso/items/2381dd4e3283cbed49a0

# はじめに
AIがブームになって久しいですが、自分で〇×ゲームなどの簡単なゲームのAIを作ってみたいと思っている方は多いのではないでしょうか。

最近では、筆者も簡単な対戦ゲームのAIについてレクチャーする機会がそれなりに増えてきましたので、その際に利用できる資料を作成するという意味も兼ねて、簡単な対戦ゲームのAIを一から作ってみる記事を書いてみることにしました。

# 題材とするゲーム

本記事が取り上げるゲームは、誰でも一度は遊んだことがあると思われる、〇×ゲーム[^1]です。簡単にルールを説明すると、2人のプレイヤーが 3x3 のマスの中に交互に 〇 と × を置いていき、先に縦、横、斜めのいずれか一直線上に 〇 か × を3つ並べたプレイヤーの勝ちです。9マス全てのマスが埋まっても決着がつかない場合は引き分けとなります。

ちなみに、このゲームはお互いが最善手を取ると必ず引き分けになるので、ゲームとしてはあまり面白くありませんが、以下のような理由でプログラミングの初心者が、ゲームの実装や、ゲームのAIを最初に学ぶ題材としてはかなり良いのではないかと思います。

* 多くの人がルールを知っている
* ゲームのルールがシンプルで実装しやすい
* 人間でも、ある程度このゲームを遊べば、常に最善手を選ぶことが可能。そのため、人間の知識をベースに最強のAIを作ることができる
* ゲームの盤面の組み合わせが少ないので、すべての盤面をしらみつぶしに調べるという方法でAIを実装することができる[^2]
* ゲームが終了するまでの手数が少ない[^3]ので、機械学習の手法を使った場合でも、学習にかかる時間が短い

もしかするとルールを知らない人がいるかもしれないので、下記に〇×ゲームの Wikipeda のリンクを貼っておきますので、知らない人は読んでルールを理解しておいてください

https://ja.wikipedia.org/wiki/%E4%B8%89%E7%9B%AE%E4%B8%A6%E3%81%B9

# 本記事の対象者

本記事は、以下のような読者を想定して執筆しましたので、基本的なことを含めてゆっくりと丁寧に解説したいと思います。そのため、人によっては基本的すぎて退屈な内容も多くあると思います。そのような部分はさっと読み飛ばしてください。

* 変数、基本的なデータ型（数値、文字列など）、条件分岐、繰り返し、関数などのプログラミングの基本概念を理解している方
* 上記を、Python でどのように記述するかは理解しているが、Python のプログラミングは初心者の方
* 〇×ゲームのような、簡単なゲームを実装してみたいが、その方法が見当もつかない方
* 〇×ゲームのような、簡単なゲームのAIの仕組みを知りたい方
* 〇×ゲームのような、簡単なゲームのAIを実装してみたい方

# 〇×ゲームとその作成手順

本記事では、Pythonで〇×ゲーム及び、そのAIを一から以下のような手順で作成します。

* 〇×ゲームのプログラムを記述する
* 人間と同じような考え方でAIを作ってみる  
* ゲーム木探索を使ったAIを作ってみる
* 速度などの問題が発生するので、プログラムを改良する
* 機械学習の手法を使ったAIを作ってみる

その際に、プログラムは、以下のような方針で実装します。

* あらかじめ詳細な仕様を定めるのではなく、その場で必要に応じて機能を少しずつ実装していく
* なるべく Python の初心者でもわかるように解説しながらプログラムを記述していく
* 様々な実装方法を紹介する
* 参考になりそうなバグが発生した場合は、バグが発生したプログラムのコードを示した上で、解決方法を探っていく所まで記述する
* 最初は効率を考えずに、プログラミングの初心者が行うように泥臭くプログラムを記述し、後で改良を加えていくことにする

# プログラムの開発環境

プログラムの開発環境は以下の通りです。Windows で記述していますが、Python や Visual Studio Code はほとんどの OS にもあると思いますので、他の環境でも問題なく動作すると思います。開発環境などのインストール方法については、次の「その2」の記事を参照してください。

* Windows 11 
* Python のバージョンは 3.11.4[^4]
* プログラムの開発は、Visual Studio Code で行う
* Visual Studio Code の拡張機能を使って、JupyterLab の環境で実行する
* 使用する Python のモジュールについては必要になった時点で説明する
* コードは、GitHub[^5] で公開する

# プログラムの入手方法

本記事では、プログラムと、プログラムの実行結果を、下記のように背景が黒い部分の中に表記します。この部分のプログラムは、黒い部分の上にマウスを移動した際に、右上に表示されるボタンでクリップボードに __コピー__ することができます。

```python
a = 1
```

本文中で __行番号を使って説明を行う__ 6 行以上のプログラムは、下記のように __先頭に行番号をつけたプログラム__ を表記します。なお、行番号をつけたプログラムを __クリップボードにコピー__ すると、__行番号も含めたプログラムがコピー__ されるので、その下に __行番号がつかないプログラムを併記__ することにします。Visual Studio Code に __プログラムをコピーして実行したい__ 場合は、「__行番号のないプログラム__」のほうを __コピー__ して下さい。

なお、行番号のないプログラムを並べて表記すると、2 倍のスペースが必要になるので、「__行番号のないプログラム__」の部分を __クリック__ すると、行番号のないプログラムが __表示される__ ようにしました。下記の「行番号のないプログラム」の部分を __実際にクリック__ してみて下さい。

```python
1  a = 1
2  b = 1
3  c = 1
4  d = 1
5  e = 1
```

<details><summary><strong>行番号のないプログラム（ここをクリックして下さい）</strong></summary>

```diff_python
a = 1
b = 1
c = 1
d = 1
e = 1
```
</details>


記事で表記したプログラムは、下記の GitHub のページですべて公開します。

https://github.com/ysgeso/marubatsu

プログラムのダウンロードは、上記のページ内の緑色の「Code」というボタンをクリックして表示される「Download Zip」をクリックすることで行えます。

zip 形式で圧縮されているのでファイルを解凍して下さい。数字のフォルダは、本記事の記事の「その〇」の番号に対応しています。例えば「その2」の記事で作成したプログラムは、「002」というフォルダに保存されています。記事のプログラムは marubatsu.ipynb というファイルに保存されているので、自分で実行してみたい人は Visual Studio Code で開いて実行してみて下さい。

# 本記事でのノートの使い方

本記事を記述している Qiita では、記事内に以下のような __ノート__ を記述することができます。

:::note
これがノートです
:::

ノートには以下の 3 種類があり、本記事ではそれぞれを以下のような目的で利用します。

:::note
背景が薄い緑色のノートには、記事の本筋とは直接関係しない __補足説明__ を記述します。
いわゆるコラムのようなものなので、あまり興味がない内容だと思った場合は読み飛ばしてもらっても構いません。
:::

:::note warn
背景が薄い黄色のノートには、__重要な用語__ の説明など、__特に覚えておくべき内容__ を記述します。
:::
:::note alert
背景が赤いノートには、__間違っている内容__ や、__不正確な内容__ を記述します。主に、よく __誤解されている内容__ について説明する際に使います。
:::

# 間違いについて

記事を投稿する際に何度も推敲はしていますが、誤字脱字などの間違いがあるかもしれません。

また、Python に関して筆者が勘違いしているために、記事の内容が間違っていることもあるかもしれません。

そういった間違いを発見した場合は、指摘していただければできるだけ直したいと思いますので、遠慮なく指摘して下さい。

# おまけ

本記事とは関係ありませんが、初心者向けの「学生のためのJavaScript」という、JavaScript の本を執筆しましたので、プログラミングに興味がある方は参考にしていただけると幸いです。また、本書で使用するWeb教材はフリーソフトにしましたので、本書を購入していただかなくとも利用できます。興味がある方は[こちらのページ](https://web.tdupress.jp/downloadservice/ISBN978-4-501-55770-6/)からダウンロードしてみて下さい。

https://www.tdupress.jp/book/b600190.html

# 次回の記事

https://qiita.com/ysgeso/items/44c65c4bbec49cff7d77

[^1]:三目並べとも呼ばれます。英語では Tik tac toe と言うそうです
[^2]:オセロ、将棋、囲碁といったゲームでは盤面の組み合わせが多すぎて、すべての盤面をしらみつぶしに調べることは現実的に不可能です
[^3]:マスが 9 マスしかないので、最長でも9手でゲームが終了します。ちなみに、オセロの場合は最長で60手、将棋の場合は平均 100 手前後でゲームが終了するようです
[^4]:本記事執筆開始時の 2023年8月 時点での最新バージョンです
[^5]:GitHub (https://github.co.jp/) はソフトウェア開発者のためのプラットフォームで、作成したソフトウェアを公開することができます