生成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 松成 文夫
この記事が気に入ったらサポートをしてみませんか?