見出し画像

生成AIでプログラミング・・・紙吹雪を降らせたよ!

紙吹雪

Scratchのチュートリアルサイト「メクルン」に「Scratchで紙吹雪を作ってみよう」というトピックスがありました。色を変えるのが面白かったので、ここでは「Pythonで紙吹雪を作ってみよう」ということに挑戦させてもらうことにしました。

素片を作成

文夫
紙吹雪を作るPythonのプログラムを作りたいと思います。ステージは480×360で紙紙片の大きさは10×10ピクセルのおおきさで色は空色、背景色は白でお願いします。
ChatGPT
紙吹雪を作るPythonプログラムを作成することは楽しいプロジェクトです。以下は、Pygameライブラリを使用してステージを作成し、空色の紙片が白い背景に降りるプログラムの例です。まず、Pygameをインストールする必要があります。次に、以下のコードを使ってプログラムを作成できます。

import pygame
import sys
import random

# 初期化
pygame.init()

# ステージのサイズ
width, height = 480, 360

# 色の定義
white = (255, 255, 255)
sky_blue = (135, 206, 235)

# 紙片のサイズ
paper_size = 10

# Pygameの設定
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("紙吹雪")

clock = pygame.time.Clock()

def create_paper():
    x = random.randint(0, width - paper_size)
    y = random.randint(-height, 0)
    return {'x': x, 'y': y}

def draw_paper(x, y):
    pygame.draw.rect(screen, sky_blue, (x, y, paper_size, paper_size))

papers = [create_paper() for _ in range(100)]

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

    # 背景を白に設定
    screen.fill(white)

    # 紙片を描画
    for paper in papers:
        draw_paper(paper['x'], paper['y'])
        paper['y'] += 1

        # 紙片が画面外に出たら再配置
        if paper['y'] > height:
            paper['y'] = random.randint(-height, 0)
            paper['x'] = random.randint(0, width - paper_size)

    pygame.display.flip()
    clock.tick(60)

このプログラムでは、pygame ライブラリを使用して画面を初期化し、背景を白色に設定しています。紙片はリストで管理され、毎フレームごとに描画され、画面下部に到達したら再配置されます。プログラムはウィンドウを閉じるまで実行され続けます。
結果です
期待通りのものができています

色をランダムにする

前にアドバイスとして、初期化を関数にするといいと言われたのでそこを直して、色をランダムに変えるようにお願いしました。

ChatGPT
以下は、紙片の色をランダムに変えるように修正されたコードです。create_paper 関数でランダムな色を生成し、それを紙片の属性として保持します。

import pygame
import sys
import random

# 初期化
def initialize_game():
    pygame.init()

    # ステージのサイズ
    width = 480
    height = 360

    # 色の定義
    white = (255, 255, 255)
    sky_blue = (135, 206, 235)

    # 紙片のサイズ
    paper_size = 10

    # Pygameの設定
    screen = pygame.display.set_mode((width, height))
    pygame.display.set_caption("紙吹雪")

    clock = pygame.time.Clock()

    return width, height, white, sky_blue, paper_size, screen, clock

# 初期化関数を呼び出して変数を取得
width, height, white, sky_blue, paper_size, screen, clock = initialize_game()

def create_paper():
    x = random.randint(0, width - paper_size)
    y = random.randint(-height, 0)
    color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    return {'x': x, 'y': y, 'color': color}

def draw_paper(x, y, color):
    pygame.draw.rect(screen, color, (x, y, paper_size, paper_size))

papers = [create_paper() for _ in range(100)]

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

    # 背景を白に設定
    screen.fill(white)

    # 紙片を描画
    for paper in papers:
        draw_paper(paper['x'], paper['y'], paper['color'])
        paper['y'] += 1

        # 紙片が画面外に出たら再配置
        if paper['y'] > height:
            paper['y'] = random.randint(-height, 0)
            paper['x'] = random.randint(0, width - paper_size)
            paper['color'] = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))

    pygame.display.flip()
    clock.tick(60)

初期化することによって定義と次の2行が必要になります。

    return width, height, white, sky_blue, paper_size, screen, clock

# 初期化関数を呼び出して変数を取得
width, height, white, sky_blue, paper_size, screen, clock = initialize_game()

結果です。綺麗な紙片が見えますね。

落下速度と左右の揺れを入れる

文夫
次に紙素片の落下速度をランダムにしてください。また左右に少しずつ振らせてください

ChatGPT
了解しました。以下は、紙片の落下速度をランダムに設定し、左右に少しずつ揺れるように変更されたコードです。

import pygame
import sys
import random

# 初期化
def initialize_game():
    pygame.init()

    # ステージのサイズ
    width = 480
    height = 360

    # 色の定義
    white = (255, 255, 255)
    sky_blue = (135, 206, 235)

    # 紙片のサイズ
    paper_size = 10

    # Pygameの設定
    screen = pygame.display.set_mode((width, height))
    pygame.display.set_caption("紙吹雪")

    clock = pygame.time.Clock()

    return width, height, white, sky_blue, paper_size, screen, clock

# 初期化関数を呼び出して変数を取得
width, height, white, sky_blue, paper_size, screen, clock = initialize_game()

def create_paper():
    x = random.randint(0, width - paper_size)
    y = random.randint(-height, 0)
    color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    speed = random.uniform(1, 3)  # 落下速度をランダムに設定
    sway = random.uniform(-1, 1)  # 左右に振れる量をランダムに設定
    return {'x': x, 'y': y, 'color': color, 'speed': speed, 'sway': sway}

def draw_paper(x, y, color):
    pygame.draw.rect(screen, color, (x, y, paper_size, paper_size))

papers = [create_paper() for _ in range(100)]

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

    # 背景を白に設定
    screen.fill(white)

    # 紙片を描画
    for paper in papers:
        draw_paper(paper['x'], paper['y'], paper['color'])
        paper['y'] += paper['speed']
        paper['x'] += paper['sway']

        # 紙片が画面外に出たら再配置
        if paper['y'] > height:
            paper['y'] = random.randint(-height, 0)
            paper['x'] = random.randint(0, width - paper_size)
            paper['color'] = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
            paper['speed'] = random.uniform(1, 3)
            paper['sway'] = random.uniform(-1, 1)

    pygame.display.flip()
    clock.tick(60)

y方向にspeed, x方向にswayということで実現しています。
結果です。

綺麗な紙吹雪ができているかと思います。

まとめ

綺麗な紙吹雪を作ることが出来ました。素片の回転も試みたのですが、なぜかうまくいきませんでした。今回は色のRGBの数値で直接扱うことが出来ましたが、Scratchで作った素片を使うとうまくいきませんでした。

2023/1129  松成 文夫 


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