見出し画像

生成AIでプログラミング はじめの一歩

経緯・・・Pythonプログラミング

過去にChatGPTでプログラミングの勉強ができるかとトライしてみましたが、どういう形でできるかがわからず、やさしい問題はChatGPTで作ってもらえましたが、ちょっと難しくなるとうまくコミュニケーションが取れずに挫折してしまいました。

今回はもう少し基礎的なアプローチをして自分からもうすこし積極的な付き合い方をしてみようと思います。生成AIもChatGPTだけでなく、Bingも使えるし、名前もCoPilotという名前になって、やはり主人公は自分で頑張ってみたいと思います。

プログラムの対象としてはPythonを選びました

ゲームを作るには

CoderDojo天白を主宰していて、いくつかの簡単なScratchのゲームを作っていました。まずはこれらのプログラムをPython を使って、どういう形で作っていけばいいかを ChatGPT に聞きました。。。

準備

まずはChatGPTの言い分です(^^♪

Pythonでゲームを作るのはとても楽しいことです!PythonにはPygameというゲーム開発ライブラリ※※があり、Pythonで2Dゲームを作成することができます。

Pygameを使用するには、まずPythonをインストールする必要があります。次に、Pygameをインストールする必要があります。以下のコマンドを使用してインストールできます。

pip install pygame

※僕は Visual Studio Code を使っていますが、その Terminal部 で実行します。
※※補足01で述べていますが、ゲームを作るには Arcade というのが新しいライブラリもありますので、後日、こちらも使ってみたいと思います。

ゲームを作ろう

Pygameのインポート

次をプログラムの最初に書きます。

import pygame

Pygameの初期化

pygame.init()

ゲーム画面の作成

screen = pygame.display.set_mode((width, height))

簡単な画面を作ってみましょう

「Pythonで600×600の大きさの画面を作ってください」と聞いてみました。
次の返事を返してくれました。

import pygame
import sys

# 初期化
pygame.init()

# ウィンドウのサイズ
width, height = 600, 600

# ウィンドウの作成
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("600x600ウィンドウ")

# ゲームループ
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 画面をクリア
    screen.fill((255, 255, 255))  # 白色で塗りつぶす

    # ここに描画や処理を追加できます

    # 画面を更新
    pygame.display.flip()

ゲームループの上半分だけではうまく動きませんでした。もう少し、最低限のプログラムとしても必要なようですね。

ゲームループの作成

先ほどのプログラムの後半の部分がやはり必要なようですね。

while True:
    # イベントの取得
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            # ゲームを終了する
            pygame.quit()
            sys.exit()
    
    # 画面を塗りつぶす
    screen.fill((255, 255, 255))
    
    # 画面を更新する
    pygame.display.flip()

まだ、ゲームをしていないのに、このようなループが必要なのですね。イベントの取得の部分は QUIT というイベントを待ってゲームを終了するということですね。正常には矢印が出るのですが、これがないと砂時計になってうまくプログラムが動いてないということのようです。画面の塗りつぶし、更新もある時間間隔で更新されているということですね。ここまで来て、やっと白い画面が生成されます。
※図は黒に変更しました。
※※画像を背景にするで背景を画像に設定する方法を示しました。

最初の画面

プレイヤーを作ります

ゲームオブジェクトの作成

背景ができたので、その中にオブジェクトを配置します。

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((50, 50))
        self.image.fill((255, 0, 0))
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
    
    def update(self):
        # プレイヤーの移動などの処理を記述する
        pass

これで、class という概念が出てきて、プレイヤーの属性が示され、赤色で大きさが(50,50)ということがわかります。update があるので、ゲームループに入れるのでしょうか。class 定義はゲームループの外にしますね。

ゲームオブジェクトの表示

all_sprites = pygame.sprite.Group()
player = Player(100, 100)
all_sprites.add(player)

while True:
    # イベントの取得
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            # ゲームを終了する
            pygame.quit()
            sys.exit()
    
    # 画面を塗りつぶす
    screen.fill((255, 255, 255))
    
    # ゲームオブジェクトの表示
    all_sprites.update()
    all_sprites.draw(screen)
    
    # 画面を更新する
    pygame.display.flip()

ここでは新しくGroupというのが出てきます。ぼんやりとはわかるのですが、具体的なプログラミング方法が頭に入らないのでこれも補足03で聞いてみました。

今回作ったゲームは!

今回、作ったプログラムはつぎのようになります。

import pygame
import sys

# 初期化
pygame.init()

# ウィンドウのサイズ
width, height = 600, 600

# ウィンドウの作成
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("600x600ウィンドウ")

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((50, 50))
        self.image.fill((255, 0, 0))
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
    
    def update(self):
        # プレイヤーの移動などの処理を記述する
        pass

all_sprites = pygame.sprite.Group()
player = Player(100, 100)
all_sprites.add(player)

# ゲームループ
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 画面をクリア
    screen.fill((0,0,0))  # 黒色で塗りつぶす

    # ここに描画や処理を追加できます
    
    # ゲームオブジェクトの表示
    all_sprites.update()
    all_sprites.draw(screen)
    

    # 画面を更新
    pygame.display.flip()

結果はつぎのようになりました。

今回の結果です

背景が黒で、赤い直径50ピクセルの四角形が上左を原点として(100,100)の位置に配置されています。

まとめ

今回は、僕自身もある程度 Python に慣れてきているので何かスムースにやることが出来ました。

次回は動かしたいですね、

また、ご期待ください(^^♪

補足01:ゲーム開発ライブラリ―

Python のゲーム開発用ライブラリーには次のものがあげられます。

  1. Pygame:

    • シンプルで使いやすい2Dゲームライブラリ。

    • グラフィックス、サウンド、イベントハンドリングなどをサポート。

  2. Pyglet:

    • グラフィカルなウィンドウを扱うためのクロスプラットフォームライブラリ。

    • OpenGLを用いた高度なグラフィックスもサポート。

  3. Arcade:

    • Pygameよりも新しい、モダンでシンプルな2Dゲーム開発用ライブラリ。

    • Python 3.6以上が必要。

  4. Ren'Py:

    • ビジュアルノベルやインタラクティブなストーリーを作るための専用ライブラリ。

    • ビジュアルノベルエンジンとして有名。

  5. Godot Engine:

    • ゲーム開発用の統合環境を提供するオープンソースゲームエンジン。

    • Pythonに対応しており、GDScriptと呼ばれる専用のスクリプト言語も利用可能。

  6. PyOpenGL:

    • OpenGLをPythonから利用できるようにするラッパーライブラリ。

    • 3Dグラフィックスプログラミングに適している。

これらのライブラリは、ゲーム開発者がプロジェクトの要件に合わせて選択できるようになっています。プロジェクトの規模、目的、お好みによって最適なものを選ぶと良いでしょう。

補足02:画像を背景にする

まず、適当な画像ファイル(例: "background.jpg")をプロジェクトフォルダに用意してください。

import pygame
import sys

# 初期化
pygame.init()

# ウィンドウのサイズ
width, height = 600, 600

# ウィンドウの作成
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("画像を背景にする")

# 背景画像の読み込み
background_image = pygame.image.load("background.jpg")
background_rect = background_image.get_rect()

# ゲームループ
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 画面をクリア
    screen.fill((255, 255, 255))  # 白色で塗りつぶす

    # 背景画像を描画
    screen.blit(background_image, background_rect)

    # ここに描画や処理を追加できます

    # 画面を更新
    pygame.display.flip()

画像を読み込んで、ゲームループの中に入れればいいだけです。

補足03:Groupについて

Pygame ライブラリでの Group は、複数の Sprite オブジェクトをまとめて管理するためのコンテナです。Sprite はゲーム開発でよく使用される、画面上の可視オブジェクトやキャラクターを表すクラスです。Group はこれらの Sprite オブジェクトをグループ化して、一括で描画や更新を行うのに便利な機能を提供します。

以下に、Group を使った基本的な例を示します:

import pygame
import sys

# 初期化
pygame.init()

# ウィンドウのサイズ
width, height = 600, 600

# ウィンドウの作成
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Groupの例")

# グループの作成
all_sprites = pygame.sprite.Group()

# Sprite クラスの定義
class MySprite(pygame.sprite.Sprite):
    def __init__(self, color, width, height):
        super().__init__()
        self.image = pygame.Surface((width, height))
        self.image.fill(color)
        self.rect = self.image.get_rect()

# スプライトの生成
sprite1 = MySprite((255, 0, 0), 50, 50)
sprite2 = MySprite((0, 255, 0), 50, 50)

# グループにスプライトを追加
all_sprites.add(sprite1)
all_sprites.add(sprite2)

# ゲームループ
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 画面をクリア
    screen.fill((255, 255, 255))

    # グループ内の全てのスプライトを描画
    all_sprites.draw(screen)

    # ここに描画や処理を追加できます

    # 画面を更新
    pygame.display.flip()

# グループの作成
all_sprites = pygame.sprite.Group()
というグループを作り、
# グループにスプライトを追加
all_sprites.add(sprite1)
all_sprites.add(sprite2)
でいろんなスプライト(オブジェクト)をそこに入れるということですね。
それで一括して処理してくれるのでプログラムが簡単になるということのようです。

2013/11/21 松成文夫


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