見出し画像

ScratchからPython へ・・・その1    熊さんが動いた!

いきさつ

ChatGPTなどのテキスト生成AIを使ってPythonのプログラミングの入門的なことを個人のYoutube,このnoteなどで発表してきた。個人的にはPythonのプログラミングの経験はほどんど練習問題程度で生成AIがどこまでできるのか判断できず、そのための試行錯誤的な部分が多かった。
今回、Youtubeに専門チャンネルを立ち上げてることにした。最初の投稿はYouTubeだけの説明では個々のコードの理解も難しいかと思うのでこのnoteにはそのコードの理解を主として書いて行こうと思う。

プログラムの基本的なコード構造

まず最初にリートンに次の質問をした。

Pythonでゲームを作る基本的なコードの構造はどうなっていますか

フミオ

Pythonでゲームを作る基本的なコードの構造は次のようになります。
1. ライブラリのインポート: 必要なライブラリやモジュールをインポート します。例えば、PygameやTurtleなどのゲーム開発に特化したライブラリが使われます。
2.初期化処理: ゲームの初期化を行います。ウィンドウの生成、画像や音声の読み込み、変数の初期化などが含まれます。
3.ゲームループ: ゲームのメインループを作成します。このループはゲームの状態を更新し、入力を受け取り、画面を描画します。
4.イベントハンドリング: キーボードやマウスのイベントを処理します。例えば、キー入力やクリックイベントを受け取って、それに応じたアクションを実行します。
5.ゲームオブジェクトの更新: ゲーム内のオブジェクト(キャラクターや敵、アイテムなど)の状態や位置を更新します。物理演算や衝突判定もこのステップで行われることがあります。
6.画面の描画: ゲームオブジェクトの現在の状態や位置に基づいて、画面を再描画します。
7.ゲームの終了条件の判定: ゲームが続行可能かどうかを判定します。一定の条件が満たされた場合、ゲームを終了したりリスタートする処理を行います。

以上が基本的なゲーム作成のコード構造です。この基本的な構造に加えて、ゲームによっては追加の機能や処理が必要になる場合もあります。 プログラムの構造をしっかりと把握し、必要な機能を追加していくことが重要です。


リートン

具体的なコード

具体的なコードを教えてください

フミオ

もちろんです!以下に、PythonとPygameを使用してシンプルなゲームを作成する例を示します。

リートン
import pygame
from pygame.locals import *

# ゲームの初期化
pygame.init()
screen_width, screen_height = 640, 480
screen = pygame.display.set_mode((screen_width, screen_height))
clock = pygame.time.Clock()

# ゲームループ
running = True
while running:
  # イベントの処理
  for event in pygame.event.get():
    if event.type == QUIT:
      running = False

  # ゲームオブジェクトの更新
  
  # 画面の描画
  screen.fill((0, 0, 0))  # 背景を黒で塗りつぶす
  
  # 画面更新
  pygame.display.flip()
  
  # フレームレートの調整
  clock.tick(60)

# ゲーム終了
pygame.quit()

この例では、Pygameライブラリを使用して画面を作成し、画面を毎フレーム更新しています。イベントループでは、ゲームの終了イベント(ウィンドウを閉じるなど)を検出して、必要なアクションを実行します。 ゲームオブジェクトの更新や画面の描画の具体的な処理は、ゲームの内容によって異なります。この例では特に記述されていませんが、ゲーム内のオブジェクトやロジックを追加することができます。 必要に応じて、さらなる機能や処理を追加して、ゲームを開発していくことができます。ゲームの種類や要件に応じて、オブジェクトの更新や描画、衝突判定、スコアの計算、音楽の再生などを実装していくことができます。また、ゲーム開発にはゲームデザインの考え方やパターン、アルゴリズムの知識なども必要になりますので、それらも学習していくことをおすすめします。

リートン説明

上記の普通の言語による構造と、プログラムによる構造をよく見比べてみてください。若干の英語力が必要ですけど、わからないのはBingを開いて聞いて行けばと思います。

Editorの選択

上記の示されたプログラムを実行するにはeditorに書き込んで実行する必要があります。

テキスト・プログラミングが初めてでしたら、まずはMu-editorをお勧めします。

Mu editor 画面

このメニューの中で、新規・開く・保存・実行(停止)位を知ればとりあえずは使えますね。また、実力が上がってこれでは物足りないなどとなれば、つぎの高級エディターを使いこなすようになればいいかと思います。
なお、左上にモードというボタンがありますね。これをクリックしてPythonになっているか確認してください。

モードの選択でPython 3 を選ぶ

では、editorがきまれば、上のコードを打ち込んでみてください。コピペでもいけますが、、まずは、努力です。頑張ってください。出来た時の楽しみを味わってください。

実行

コードを打ったら、保存→実行の順で行ってください。タイプミスがあってもあんまりはっきりわからないかもしれませんね。一生懸命に考えてもわからないときはコピペで行きましょう。生成AIは必ずしも正しい答えを示さないといいますから、将来のためには、こういう誤り探しはやはり大事です。
さて、この結果として、つぎの結果が出ました。

プログラム実行結果

真っ黒な画面が出てきました。これは正しい結果でしょうか。何か、エラーでこういう図が出てきたのでしょうか?
プログラムには次の行があります。
# 画面の描画
screen.fill((0, 0, 0)) # 背景を黒で塗りつぶす
(0,0,0)は色のRGB表記で黒を表します。これで画面が黒になったことは間違いとは言えないですね。でも、ちょっと寂しい(^^♪。

もう少し、進みましょう。

赤い四角形を動かす

次の質問・お願いをしました。

次のプログラムに赤い四角形が左右に動いて端についたら跳ね返るという動きを追加してください

フミオ

ミスして、プログラムをつけ忘れました( ノД`)シクシク…
が、つぎの回答をしてくれました。

すみませんが、具体的なプログラムのご提供がないため具体的な修正は困難ですが、以下のコードスニペットは、pygameで赤い四角形が画面の左右端で跳ね返る様子を示しています:

リートン
import pygame
from pygame.locals import *

# Pygameを初期化
pygame.init()

# 画面サイズの設定
screen = pygame.display.set_mode((600, 400))

# 動きのスピード
speed = [2, 0]

# 四角形の初期位置
rect = pygame.Rect(50, 50, 60, 60)

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

    # 四角形の位置を更新
    rect.move_ip(speed)

    # 画面の端で跳ね返る動き
    if rect.left < 0 or rect.right > 600:
        speed[0] = -speed[0]

    # 画面の描画
    screen.fill((0, 0, 0))  # 背景を黒で塗りつぶす
    pygame.draw.rect(screen, (255, 0, 0), rect)  # 四角形を描画

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

# Pygameを終了
pygame.quit()

上記のコードでは、rectは四角形の初期位置とサイズを定義し、speedは四角形の移動速度を定義しています。whileループの中で、四角形の新しい位置が計算され、その後で四角形が画面の端に達したかどうかが確認され、達していた場合は移動方向を反転させます。

リートン

ミスをしましたが、ちゃんと前のコード・スニペット(というのかな)を使って作ってくれました。

前のプログラムに変更点を入れて修正してください。いい勉強になるかと思います。

実行結果です
※ うまく埋め込みが機能しなかった?のでこれで勘弁してください。
速度などを変えていいかもしれませんね。

順調にプログラムが進んでいます。

熊さんを動かす

今度はScratch素材を使ってみましょう。
・ 赤い四角を熊さんに変更します
・ 黒い背景を砂漠の絵にします。

ありがとうございます。黒い背景の代わりにbackground.png を使い、赤い四角の代わりにbear.svg を使ってもらえませんか。また、移動速度をもっと遅くしてもらえませんか。左右の端で、姿勢も反転してもらえませんか。よろしくお願いします

フミオ

指定された条件に基づいてプログラムを変更します。しかしながら、pygameは直接svgファイルをサポートしていませんので、それを標準の画像形式(例えばpng)に変換することを推奨します。以下の例では、bear.pngと側します。
また、物体が跳ね返るときに姿勢を反転させるには、画像を水平に反転する必要があります。そのため、pygame.transform.flip()関数を使用します。
以下に、修正したコードを示します。

リートン
import pygame
from pygame.locals import *

# Pygameを初期化
pygame.init()

# 画面サイズの設定
screen = pygame.display.set_mode((600, 400))

# 背景画像の設定
background = pygame.image.load('background.png')

# オブジェクトの画像と速度を設定
bear = pygame.image.load('bear.png')
bear_rect = bear.get_rect()
speed = [1, 0]  # 速度を遅く設定
flip_bear = False  # オブジェクトの初期向き

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

    # 四角形の位置を更新
    bear_rect.move_ip(speed)

    # 画面の端で跳ね返る動き
    if bear_rect.left < 0 or bear_rect.right > 600:
        speed[0] = -speed[0]
        flip_bear = not flip_bear  # 姿勢を反転

    # 画面の描画
    screen.blit(background, (0, 0))  # 背景画像を描画
    screen.blit(pygame.transform.flip(bear, flip_bear, False), bear_rect)  # 四角形を描画
    # flip_bearがTrueのとき、画像は水平に反転します。Falseのときは通常通りの向きです。

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

# Pygameを終了
pygame.quit()

bear.svg が望ましくないとのことですが、svg形式でうまくいきますので、実際はbear.svgで使いました。また、何か問題があった時に考えましょう。

このコードは、bear.pngとbackground.pngが同じディレクトリ内にあることを前提としています。また、背景画像は画面解像度と一致するサイズである必要があります。適切なサイズに両方の画像を調整することが必要です。
なお、pygame.transform.flip(bear, flip_bear, False)は、flip_bearがTrueの場合、画像が水平方向に反転します。Falseの場合、画像は正常な状態を保ちます。

リートン

プログラムの実行結果です。
うまく、埋め込みができていませんが、これで見れればありがたいです。
※ 見えないときは連絡願えるとありがたいです。

まとめ

最初のステップとしてゲームつくりの構造を学び、Scratch素材を使っての簡単なプログラムを例示した。Scratchでは簡単にできますが、Pythonではそれなりのコードになりますね。

今回は簡単な結果でしたが、次回はこれを動物も増やして運動会的なものを作ってみましょう。

リンク

1.Youtube 投稿

2023/12/07


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