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でインベーダーゲーム作りたい人はやってみて!