ゲーム開発

【Pyxel】Pythonでレトロゲームを作ろう! Day 7 -人工知能-

Pyxelでレトロゲームを作る7

こんにちは!

くるる
くるる
人気フクロウの”くるる”@kururu_owl だよー
はやぶさ
はやぶさ
元制御屋の”はやぶさ”@Cpp_Learningです

前回こんな記事を書きました↓

Pyxelでレトロゲームを作る3
【Pyxel】Pythonでレトロゲームを作ろう! Day 6 -当たり判定-こんにちは! 前回こんな記事を書きました↓ https://cpp-learning.com/pyxel_a...

本記事は『Pythonでレトロゲームを作ろう!』シリーズの”Day7”です!

本記事”Day7”が本シリーズの最終回となります。

【シリーズ構成】

  • Day1~Day4:基礎編
  • Day5~Day7:応用編

当初の予定ではDay5″もしくは”Day5”を待たずに打ち切りになると考えていました(基礎編+αくらいの内容にする予定でした)

しかし、嬉しいことにTwitter経由で本シリーズが「参考になった」・「勉強になる」という言葉を頂けました!

ありがとうございます!励みになりました!

お陰様で応用編を増やして”Day7″まで続けることができました!感謝!!

くるる
くるる
Day5″の本シリーズ最終回(仮)が悲しくて泣いちゃたけど…今日は泣かないよ!最後まで楽しく勉強するんだー
はやぶさ
はやぶさ
はい!今日も楽しく勉強しましょう!

【Day 7】Pyxelでレトロゲームを作ろう!

”Day6”の最後(次回予告)で”くるる”ちゃんから以下のことをお願いされました。

くるる
くるる
”ねずみ”が猫にこっそり近づいて攻撃する(Game Over!を狙う)を実装したい!

はい!『自動追従マウス』を作ってみました↓

人工知能

本サイトでは、プレイヤーが操作せずに自動で動くキャラを『人工知能』と呼ぶことにします。

ということで、本記事では『ゲームにおける人工知能』の作り方を説明します。

【補足】ゲームにおける人工知能

人工知能と聞いて『機械学習』を連想する人が多いと思いますが…

私が小さい頃は”マリオ”や”ロックマン”などの敵キャラ(ノンプレイヤーキャラクター)のことを『人工知能/AI/CPUキャラ』などと呼んでいました。

技術の発展と共に抽象的だった『人工知能』という言葉の定義が変わった気もしますが、今でも以下のように説明することがあります。

コンピュータゲームにおける人工知能は、コンピュータゲームにおいて、ノンプレイヤーキャラクター (NPC) の振る舞いに知能があるかのような錯覚を生み出す技法である。主な技法は人工知能 (AI) の既存技術を活用したものである。しかしゲームAIと呼ぶ場合、制御理論ロボット工学コンピュータグラフィックス計算機科学全般の技法を含む様々なアルゴリズムを指して使われることが多い。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

本シリーズは『レトロゲーム』関連の記事なので、あまり難しいことは考えずノンプレイヤーキャラクターの”ねずみ”は『人工知能』ということにしますね(*・ω・)ノ♪

人工知能と制御

上記の補足で説明した通り、ゲームAIでは制御理論などを使って、知能のあるゲームキャラを実装します。

今回も制御理論を使って猫にこっそり近づく知能のある”ねずみ”を実装しました。

先に種明かしすると、P制御を使っています。

くるる
くるる
だから”はやぶさ先生”の冒頭の挨拶が「現役エンジニアの~」じゃなくて「元制御屋の~」になってたんだね!

”はやぶさ先生”が元制御屋を名乗るときは、制御の話をしてくれるよね↓

元制御屋が深層学習でパラメータ同定する話
深層学習でシステム解析
【深層学習入門】超実践!Chainerと深層学習でシステム解析する方法ディープラーニング入門の記事を書きました。難易度は入門レベルですが『深層学習フレームワークChainerを使ってシステム解析する』という実践的な内容に仕上げました。制御・解析・分析などの課題解決に深層学習を使いたい人や、深層学習をビジネスや研究で使い人にオススメの記事です。...
元制御屋が振動解析でデータ分析する話
振動の基礎
【データ分析入門】機械学習未使用!Pythonでゼロから始める振動解析機械学習(深層学習含む)によるデータサイエンスが流行っていますが、フーリエ解析などの振動解析により、異常検知を行うこともできます。本記事はデータ分析/振動解析学ぶための実践的なチュートリアル記事です。...

制御は工業製品で使われる難しいもの!と思われがちです。本サイトで「制御の敷居」を下げられると嬉しいなぁ…なんてことを考えています。

P制御を説明する前に

PID制御(P制御の内容含む)については”ググる”と良質な記事が沢山でてきます。

例えば、以下のサイトなど↓

モーターやロボットアームを例に数式も交えて分かりやすく解説しています。

同じ説明をしてもしょうがないので、本記事では『ゲームを題材にP制御を解説』してみます!

【復習】ゲームとベクトル

“Day4”で『ベクトル』について説明したのを覚えていますか?

Pyxelでレトロゲームを作る3
【Pyxel】Pythonでレトロゲームを作ろう! Day 4 -ベクトル-こんにちは! 前回こんな記事を書きました↓ https://cpp-learning.com/pyxel_c...

内容を忘れてしまった人は、読み返してほしくないなぁ

くるる
くるる
”くるる”は覚えてるよ!ベクトルは矢印で表現するんだよね!
Pyxelとベクトル

正解!

また、A点からB点に移動するということは…

  • x軸方向:A点から Xb – Xa だけ移動する
  • y軸方向:A点から Yb – Ya だけ移動する

という意味でしたね。

“Day4”では点Aが猫の座標・点Bがマウスカーソルの座標でした。

今回は以下のように点Aが敵キャラ(ねずみ)の座標・B点が猫の座標と定義します↓

Pyxelと人工知能

なので、敵キャラ(ねずみ)が猫に近づくには…

  • x軸方向:A点から Xb – Xa だけ移動する
  • y軸方向:A点から Yb – Ya だけ移動する

で実現できますね。

しかし、“Day4”と同じ方法で点A座標を点B座標に更新すると、敵キャラが”一瞬で”猫に追いついてしまいます。

この問題を解消し、猫にこっそり近づく”ねずみ”を実現するために”P制御”を使います。

制御/物理/数学のプログラミング

ゲームに限らず、抽象的な表現をプログラムで実現するのは非常に難しいです!

今回の場合”こっそり近づく”が抽象的なためプログラミング困難です。

抽象的な表現:こっそり近づく

なので”こっそり近づく”とはどういうことか?を考えてみます!

つまり、身近な物理現象で”こっそり近づく”を表現できないかを考えます。

ばねが良いと思いませんか?

ばね

『伸ばす長さに比例して、素早く縮まる特性をもつ”ばね”』

『猫までの距離に比例して、近づく移動量(移動速度)を変える”ねずみ”』

似ていますね。

具体的な表現:猫までの距離に比例して、”ねずみ”の移動量を変化させる

…という感じで、実装したいことを具体的に考えるとプログラミンしやすいです。

抽象的な表現はプログラミング困難ですが、物理現象に変換できればプログラミングしやすくなります。

ばねの特性

もう少し詳しく”ばねの特性”を説明します。

ばね

何も力を加えていない静止状態のばねの長さを”自然長”と呼びます。

ばねを伸ばしたり/縮めたりすると”自然長”に戻ろうとする特性があり、このとき働く力を”復元力”と呼びます。

また、ばねの長さに比例して”復元力”は強くなります。この”復元力”は中学生の頃に学ぶ『フックの法則』で算出することができます。

【フックの法則】 F = k・x(復元力:F, 自然長からの長さ:x, ばね定数:k)

技術や知識の積み重ねが大事です!

ばねとP制御

【P制御】の”P”は”Proportional:比例”の頭文字なので【P制御】のことを【比例制御】と呼ぶこともあります。

比例は上記の【ばねの特性】でも出てきたキーワードです。

【ばねの特性】自然長に戻すために、長さに比例した復元力が発生する

一方【P制御】は…

【P制御】目標値に近づくために、目標までの偏差に比例した入力値を制御する

と考え、以下の数式を使います。

【P制御】U = Kpe(入力値:U, ゲイン:Kp, 偏差:e)

つまり、【P制御】は【ばねの特性】と同じように考えることができます。

【P制御】の入力値:Uや偏差:eは制御対象により変わります。
今回は以下のように定義します。

  • 制御対象:画像上の”ねずみ”
  • 偏差:猫までの距離(目標までの距離)
  • 入力値:移動量(更新座標)

ふわぁーー💤という大きな欠伸が聞こえてきた。

くるる
くるる
数学とか物理の話を聞くと睡魔が…💤

いつもより静かだと思ったら…眠かったのか!笑

はやぶさ
はやぶさ
じゃあ“Day4”と同じように、次からゲームを例に説明するね
くるる
くるる
目覚めたわ!

大きい”くるる”ちゃんの目が、更に大きく”カッ”と開いた!

”やる気スイッチ”入りました!笑

PyxelとP制御

猫と”ねずみ”をばねで接続します!

Pyxelと人工知能

ばねが伸びるとどうなるか?を考えてみます↓

【ばねが伸びる】

  1. 猫が”ねずみ”から逃げる
  2. ばねが伸びる
  3. 復元力:大
  4. ”ねずみ”が走って追いかけてくる(移動量:大)

ばねが縮むとどうなるか?を考えてみます↓

【ばねが縮む(自然長に近づく)】

  1. ”ねずみ”が猫に追いつく
  2. ばねが縮む(目標に近づく=偏差が小さくなる)
  3. 復元力:小
  4. ”ねずみ”がこっそり近づく(移動量:小)
くるる
くるる
もう分かりやすい!楽しい!

より正確には、x軸方向・y軸方向それぞれに”ばね”を接続するイメージです↓

Pyxelと人工知能

こうすることで、x軸方向とy軸方向で移動量を制御できます。

くるる
くるる
偏差e=0になったときが、猫に追いついたときだね♪

その通り!

じゃあ、ばねを伸ばす以外に”ねずみ”の移動量を増やすにはどうすれば良いかな?

くるる
くるる
ばね定数が大きい”ばね”を接続する!

大正解!

【P制御】なら”ゲイン:Kp”を大きくすれば、“猫までの距離:e”に比例して”ねずみの移動量(更新座標):U”が大きくなるように制御できます!

【P制御】U = Kpe(入力値:U, ゲイン:Kp, 偏差:e)

はやぶさ
はやぶさ
ゲインのチューニングは制御屋の腕の見せ所です!
くるる
くるる
P制御すげー!制御屋カッコイイ!!

苦手な分野(今回の場合は物理や制御)でも自分の好きな分野(ゲームなど)に落とし込めば、学ぶのが楽しくなるかも!

P制御のソースコード

以上を踏まえて、Pyxelを使ったP制御のソースコードは以下の通りです↓

くるる
くるる
”制御”楽しい!

今回は【P制御】ですが、本記事をきっかけに”制御”に興味をもった人が【PI制御】【PID制御】などに挑戦してくれたら、最高に嬉しいです(*・ω・)ノ♪

最終的に完成したソースコード

最終的に完成したソースコードはこちらです↓

くるる
くるる
これで『人工知能キャラ』が作れる!!

おわりに

『Pythonでレトロゲームを作ろう!Day 7-人工知能-』について説明しました。

ゲーム開発(pyxelの使い方)を題材にして、楽しくプログラミングの勉強ができると良いなーとか考えながら、シリーズ記事を書いています。

今回は元制御屋として書いてみたかった、【P制御】を題材にしました。

くるる
くるる
本シリーズ最初の”Day1”が『画像処理』で最終回が『制御』とか”はやぶさ先生”らしいね♪
くるる
くるる
本シリーズ勉強なったし、何より楽しかったよー!
はやぶさ
はやぶさ
ありがとう”くるる”ちゃん!本シリーズを読んでくれた人も同じ感想だと嬉しいな

この記事が本シリーズの最終回です(総集編を書く予定ですが、チュートリアルとしては本当に最終回です。)

本シリーズで紹介したソースコードを自由にカスタムして、自分オリジナルのゲームを作ってみて下さいね!

くるる
くるる
”くるる”は本シリーズで学んだことを活かして『マウスパニック』っていうゲームを作ったよー

総集編でソースコードを公開しますね!

本シリーズ楽しかったかな?Twitterなどで感想をツイートしてくれると嬉しいです!

Twitterアカウント:”はやぶさ”@Cpp_Learning

”くるる”ちゃんも待っているので、気軽にサイト『はやぶさの技術ノート』に遊びに来てくださいね(*・ω・)ノ♪

ご愛読ありがとうございました!

『Pythonでレトロゲームを作ろう!』シリーズ(完)

LINEスタンプ配信中!

フクロウのLINEスタンプ

当サイトのマスコットキャラクター

「フクロウのくるる」が

LINEスタンプになりました!

勉強で疲れたあなたに癒しをお届け☆

お迎え待ってます(*・ω・)ノ♪

今すぐお迎えする

40個セットがたったの50コインとお得です