1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

猿でもわかるAIプログラミングシリーズ 🐵💻 AIでじゃんけんゲームを作ってみた!

Posted at

AIでじゃんけんゲームを作ってみた!〜Pythonと機械学習で勝ちパターンを学習〜


1. はじめに:なぜ「じゃんけん」なのか?

皆さん、「じゃんけん(グー・チョキ・パー)」でAIを作るって聞くと、「それって運ゲーじゃないの?」と思うかもしれません。でも、実は人間がやるじゃんけんには クセ傾向 があることが研究でも知られています。

今回のテーマはそんな人間のじゃんけん傾向をAIに学ばせて、勝ちにいくAIじゃんけんプレイヤーを作るというものです。

本記事では、以下のような実践的な要素を交えて、AIじゃんけんの作り方を解説していきます:

  • 過去の手を学習して次の手を予測する
  • 機械学習モデル(決定木)による分類
  • 簡単なUIで対戦可能なCLIアプリ化

2. 技術概要:じゃんけんAIはどう学ぶ?

✨今回使う技術要素

項目 内容
使用言語 Python 3
ライブラリ scikit-learn, pandas, joblib
モデル 決定木(DecisionTreeClassifier)
学習対象 プレイヤーの手の履歴から次の手を予測

「前回と前々回の手が何だったか」を特徴量(Feature)として、次の手(Label)を予測するという形で学習させます。


3. 実装:じゃんけんAIをPythonで作ってみよう!

3.1 必要なライブラリをインストール

pip install pandas scikit-learn joblib

3.2 データ構造と学習ロジック

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from joblib import dump, load

# じゃんけんの手を数値に変換(グー:0, チョキ:1, パー:2)
def convert_hand(hand):
    return {"グー": 0, "チョキ": 1, "パー": 2}[hand]

# 学習用データの準備
data = [
    {"prev1": 0, "prev2": 1, "next": 2},
    {"prev1": 1, "prev2": 2, "next": 0},
    {"prev1": 2, "prev2": 0, "next": 1},
    # ... 実際はもっと大量の履歴を保存する
]
df = pd.DataFrame(data)

X = df[["prev1", "prev2"]]
y = df["next"]

# 決定木モデルで学習
model = DecisionTreeClassifier()
model.fit(X, y)

# モデルを保存
dump(model, "janken_model.joblib")

3.3 推論してみよう!

# モデル読み込み
model = load("janken_model.joblib")

# 前の2手を与える
prev1 = convert_hand("グー")
prev2 = convert_hand("チョキ")
pred = model.predict([[prev1, prev2]])[0]

# 結果を表示
reverse_map = {0: "グー", 1: "チョキ", 2: "パー"}
print(f"AIの予測: {reverse_map[pred]}")

3.4 対戦アプリのミニCLI版

history = [0, 1]  # 仮の初期値:グー, チョキ

while True:
    player_input = input("あなたの手(グー・チョキ・パー)> ")
    if player_input not in ["グー", "チョキ", "パー"]:
        print("無効な入力です")
        continue

    player_hand = convert_hand(player_input)
    ai_hand = model.predict([history[-2:]])[0]

    print(f"AIの手: {reverse_map[ai_hand]}")

    # 勝敗判定(省略可能)
    result = (player_hand - ai_hand) % 3
    if result == 0:
        print("あいこ!")
    elif result == 1:
        print("あなたの勝ち!")
    else:
        print("AIの勝ち!")

    history.append(player_hand)

4. 現場Tips:AIじゃんけんでハマったポイント

✅ よくある落とし穴

  • データが偏っていると、「グーばかり出すAI」になる
  • 人間のクセは人それぞれ:個人別のモデルが有効な場合も
  • モデルに過学習が発生しやすい → データ量を増やすかモデルの深さを制限

🛠実務的な活用アイデア

  • ユーザーの操作ログを使ったパターン予測
  • ゲームAIの学習基礎に
  • スマートなおもちゃへの組み込み

5. 発展:もっと強いAIにするには?

  • RNNやLSTMを使って「長期的な傾向」を学習(次回記事候補!)
  • 強化学習で報酬(勝ち)を最大化するような戦略を学ばせる
  • マルチプレイヤー対応で各プレイヤーごとのモデル切り替え

6. まとめ:じゃんけんでもAIは使える!

✅ 本記事の要点まとめ

  • じゃんけんは運だけではない、人間には傾向がある
  • シンプルな特徴量でも予測モデルは作れる
  • 実務にもつながる「予測ロジック」の基礎が学べる

📝おまけ:全コードはGitHubにて公開予定(近日中)


この記事が役に立ったら、いいね&フォローお願いします!
質問や改善提案などもぜひコメントで教えてください🙌

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?