見出し画像

AIプログラミング日記:pythonでスペースインベーダーゲームの基本部分を作ってみた件

シューティングゲームの金字塔「スペースインベーダーゲーム」がAIに作れるか検証してみました。ご存じない方のために説明すると、隊列を組んで画面上から迫ってくるインベーダーを、プレイヤーが操作する自機を操作して、迎撃するというものです。


できる、できない、さあどっち?

これくらい有名なゲームならば、画面やルールはいくらでもネット上に情報がありそうなので、ここはストレートなプロンプトを送信します。

👦pythonでスペースインベーダーゲームを作ってください。

スペース・インベーダーゲームを作成するには、
Pygameライブラリを使用します。
ゲームの基本的なコードを作成します。

<コード>

すごい! もうできちゃったー! よし実行だ!

きゃー、ぜんぜんちがーう!!!

イメージはスペースインベーダーとは程遠い感じ。これは、普通のシューティングゲームです。
ただし、敵(赤い四角)が画面上部から現れて下方に向かって移動。自機を左右カーソルキーで左動かして、スペースキーを押せば弾が発射。弾が敵に当たると消滅と、シューティングゲームとしての最低限のコードにはなってます。むしろ、弾が連続発射できるところなんか気が利いているとも言えますね。

フォーメーションを指示する

スペース・インベーダーの一番の特徴は、隊列を組んで迫ってくるところです。これをプロンプトのために言語化しなくてはなりません。

「横11列×縦5列の隊列を組んでいる」
「左右に移動しながら、下に降りてくる」

うーん、こんなんで通じるかしら、などと考えているうちに閃きました。

そうだ、Wikipediaからパクろう!

さすがWikipediaです。シンプルかつ的確にインベーダーの動きが記載されていて、これはありがたい!「ゲーム画面とゲーム内容」に掲載されている文章をそのままプロンプトに追加します。

👦インベーダーのフォーメーションを次のようにしてください。
「画面の中央やや上方に、縦5段 横11列の、計55のインベーダーが現れる。 インベーダーは、軍団状で、隊列状態でまとまって横移動をしながら、端にたどり着く度に一段下がり、下がり終えると進行方向を逆方向変えて再び移動しはじめる。これを繰り返すことによって、段々と下に降りてくる。」

結果こうなりました。

インベーダーがフォーメーションを組んで移動する機能を追加します。
具体的には、インベーダーが11列5段で画面上部に配置され、横移動しながら端
に達するたびに一段下がり、進行方向を逆にする動作を実装します。

以下のコードは、指定されたフォーメーションでインベーダーが移動するスペース・
インベーダーゲームです。
<コード>

すげー! ちゃんと隊列組んで迫ってくる~♪ 端を消した場合には、その分、左右端のキャラ位置の更新もしてくれています。これぞインベーダーゲームという感じです。

でも、何か足りないなー。

敵からのビーム発射を実装する

そうです。敵がビームを撃ってきません。これでは緊迫感がもう一つです。しかし、インベーダーゲームでは、すべてのインベーダーがビームを撃ってくるわけではなく、撃ってくるのは一番下のインベーダのみ。これは少しややこしいですね。

うまくいくかわかりませんが次のプロンプトを与えてみました。

👦インベーダーからビームが下方に発射されるようにしてください。撃っていいのは、各列の一番下のインベーダーのみにしてください。

敵がビームを発射する機能を追加します。
ビームは一番下の列の敵から発射されます。
以下のコードは、指定された機能を追加したスペース・インベーダーゲームです。
<コード>

黄色いビームがいっぱい出たー!!

しかも、自機に敵の弾が当たると、コンソールに「Player hit!」と表示されています。もうすでに当たり判定まで実装されているとは驚きです。

Player hit!
Player hit!
Player hit!
Player hit!

ビーム数をコントロールする

ビームが出たのはいいのですが、これはちょっと多すぎ。少しばかり減らす必要がありそうです。

このとき、通常であれば、次のようなプロンプトを与えたくなるところです。

👦ビームの数を減らしてください。

これでもいいかもしれませんが、この場合、どのようなロジックで減らされるのかはAI任せになってしまうので、先が読めません。そこでより具体的に次のプロンプトを与えることにしました。

👦ビーム数が多すぎます。ビームの数を減らすための、間引き率を指定できるようにしてください。 間引き率を100にすると、弾が全く出ません。間引き率を0にすると最大数になります。そして間引き率を50にすると、50%間引きされます。

了解しました。
間引き率を導入して、ビームの数を調整できるようにしましょう。
以下に、間引き率を実装した完全なコードを示します
<コード>

ちょうどいい感じー!

ソースコードをみたらbeam_thinning_rateという定数が追加されていました。

beam_thinning_rate = 80  # 間引き率: 0-100 (0: 最大数, 100: ビーム発射なし)

そもそもスペースインベーダーではステージが進むと敵のビーム数が増えるようになっています。ということは、ステージごとに、この間引き率を下げていけば難易度アップが簡単にできますね。

まとめ

スペースインベーダーゲームとしては、スコアもついていませんし、より本物に近づけるならトーチカやらUFOやら、ステージ更新やらが必要ではあります。しかしながら、基本部分の実装という意味ではいい感じでしょう。

というわけで、AIでインベーダーゲーム作りたい人はやってみて!

この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?