メインコンテンツへスキップ
見出し画像

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

     
     
    AIで時間を生み出す実験をしています。 元PC系出版社編集者。 Claude・ChatGPT・Geminiを並行使用しながら、 実践した話だけを書いています。

    あなたへのおすすめ