見出し画像

ChatGPTによるプログラミング学習05:追いかけっこゲーム

はじめに

ChatGPTをちょっと外れてpygameでのゲームプログラムについて勉強しました。その中でぼんやりとプログラミングスタイルなどもわかった来た気がします。そんな知識を生かしながらまたChatGPTによる学習に戻ります。
今回はメクルンのサンプル「追いかけっこゲーム」を使わせてもらいました。

おいかけっこゲーム

メクルンでのおいかけっこゲームのプログラム作成項目のタイトルを拾い、これを仕様というかプログラム指示とおもい、このまま、ChatGPTにお願いをしました。

結果がこれです。

import pygame
import random

# 画面の幅と高さ
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

# 初期化
pygame.init()

# ゲーム画面の設定
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("おいかけっこゲーム")

# 色の設定
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)

# キャラクターの設定
player_image = pygame.image.load("cat.png").convert()
player_image.set_colorkey(WHITE)
player_rect = player_image.get_rect()

# おにの設定
enemy_image = pygame.image.load("beetle.png").convert()
enemy_image.set_colorkey(WHITE)
enemy_rect = enemy_image.get_rect()
enemy_rect.x = random.randrange(SCREEN_WIDTH - enemy_rect.width)
enemy_rect.y = random.randrange(SCREEN_HEIGHT - enemy_rect.height)

# 背景画像の設定
background_image = pygame.image.load("Background.png").convert()

# 効果音の読み込み
collision_sound = pygame.mixer.Sound("collision.wav")

# ゲームループの開始
game_over = False

clock = pygame.time.Clock()

while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True

    # キャラクターの移動
    player_rect.center = pygame.mouse.get_pos()

    # おにの移動
    if enemy_rect.x < player_rect.x:
        enemy_rect.x += 3
    else:
        enemy_rect.x -= 3

    if enemy_rect.y < player_rect.y:
        enemy_rect.y += 3
    else:
        enemy_rect.y -= 3

    # タッチされたら
    if player_rect.colliderect(enemy_rect):
        pygame.mixer.Sound.play(collision_sound)
        game_over = True

    # 画面の描画
    screen.blit(background_image, [0, 0])
    screen.blit(player_image, player_rect)
    screen.blit(enemy_image, enemy_rect)
    pygame.display.flip()

    # フレームレートの設定
    clock.tick(60)

# 終了処理
pygame.quit()

これをざっと、コメントだけをみながらでも読むと大体やっていることがわかります。音も適当に入れてくれています。これで、できた!と思ったのですが、問題は素材のことで、今回はScratch素材をそのままダウンロードして使っています。ひとつはそのサイズがあっていません。
サイズを調整するには次のコマンドを使うことはすでに承知です。

import pygame

# 画像の読み込み
cat_image = pygame.image.load("cat.png").convert()
beetle_image = pygame.image.load("beetle.png").convert()

# 画像のサイズを半分に縮小
cat_image = pygame.transform.scale(cat_image, (cat_image.get_width() // 2, cat_image.get_height() // 2))
beetle_image = pygame.transform.scale(beetle_image, (beetle_image.get_width() // 2, beetle_image.get_height() // 2))

この修正を入れましたが、つぎは透明・透かしの部分がうまくいっていません。pythonには透かしの透明化処理もできるようでこれを使いました。

player_image.set_colorkey(BLACK)

修正した全体のコードを次にしめします。

import pygame
import random

# 画面の幅と高さ
SCREEN_WIDTH = 720
SCREEN_HEIGHT = 540

# 初期化
pygame.init()
pygame.display.init()

# ゲーム画面の設定
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("おいかけっこゲーム")

# 色の設定
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)

# キャラクターの設定
cat_image = pygame.image.load("cat.png").convert()
player_image = pygame.transform.scale(cat_image, (cat_image.get_width() * 0.2, cat_image.get_height() * 0.2))
player_image.set_colorkey(BLACK)
player_rect = player_image.get_rect()

# おにの設定
beetle_image = pygame.image.load("beetle.png").convert()
enemy_image = pygame.transform.scale(beetle_image, (beetle_image.get_width() *0.2, beetle_image.get_height() * 0.2))

enemy_image.set_colorkey(BLACK)
enemy_rect = enemy_image.get_rect()
enemy_rect.x = random.randrange(SCREEN_WIDTH - enemy_rect.width)
enemy_rect.y = random.randrange(SCREEN_HEIGHT - enemy_rect.height)

# 背景画像の設定
bg_image = pygame.image.load("Background.png").convert()
background_image = pygame.transform.scale(bg_image, (bg_image.get_width() * 1.5, bg_image.get_height() * 1.5))

# 効果音の読み込み
collision_sound = pygame.mixer.Sound("Collect.wav")

# ゲームループの開始
game_over = False

clock = pygame.time.Clock()

while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True

    # キャラクターの移動
    player_rect.center = pygame.mouse.get_pos()

    # おにの移動
    if enemy_rect.x < player_rect.x:
        enemy_rect.x += 1
    else:
        enemy_rect.x -= 1

    if enemy_rect.y < player_rect.y:
        enemy_rect.y += 1
    else:
        enemy_rect.y -= 1

    # タッチされたら
    if player_rect.colliderect(enemy_rect):
        pygame.mixer.Sound.play(collision_sound)
        game_over = True

    # 画面の描画
    screen.blit(background_image, [0, 0])
    screen.blit(player_image, player_rect)
    screen.blit(enemy_image, enemy_rect)
    #pygame .display.flip()
    pygame.display.update()

    # フレームレートの設定
    clock.tick(60)

# 終了処理
pygame.mixer.quit()
pygame.display.quit()
pygame.quit()

結果です。ちょっと、画像が荒い感じですね。

Class,Groupを使った場合

正式なプログラムとしてはcat,beetleなどにClassを使うものかと思っているので、そのお願いをしてみました。
結果がこちらです。

import pygame
import random

# ゲーム画面のサイズ
WIDTH = 600
HEIGHT = 400

# 色の定義
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

# 初期化
pygame.init()

# 画面の設定
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("おいかけっこゲーム")

# キャラクターのクラス
class Character(pygame.sprite.Sprite):
    def __init__(self, image_path, x, y):
        super().__init__()
        self.image = pygame.image.load(image_path).convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

    def move(self, pos):
        self.rect.center = pos

# おにのクラス
class Oni(pygame.sprite.Sprite):
    def __init__(self, image_path, x, y):
        super().__init__()
        self.image = pygame.image.load(image_path).convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.speed = 5

    def move_towards_character(self, character):
        dx = character.rect.x - self.rect.x
        dy = character.rect.y - self.rect.y
        distance = max(abs(dx), abs(dy))
        if distance > 0:
            speed = min(distance, self.speed)
            self.rect.x += dx / distance * speed
            self.rect.y += dy / distance * speed

# 衝突音のクラス
class SoundEffect:
    def __init__(self, sound_path):
        self.sound = pygame.mixer.Sound(sound_path)

    def play(self):
        self.sound.play()

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

# キャラクターの作成
character = Character("cat.png", WIDTH // 2, HEIGHT // 2)
all_sprites.add(character)
characters.add(character)

# おにの作成
oni = Oni("beetle.png", random.randint(0, WIDTH), random.randint(0, HEIGHT))
all_sprites.add(oni)
onis.add(oni)

# 衝突音の作成
collision_sound = SoundEffect("Collision.wav")

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

    # キャラクターの移動
    mouse_pos = pygame.mouse.get_pos()
    character.move(mouse_pos)

    # おにの移動
    oni.move_towards_character(character)

    # 衝突判定
    if pygame.sprite.spritecollide(character, onis, False):
        collision_sound.play()
        running = False

    # 画面の描画
    screen.fill(WHITE)
    all_sprites.draw(screen)
    pygame.display.update()

# 終了処理
pygame.quit()

一応、プログラムは書いてくれて、大きさ調整もできたのですが、透明化で失敗です。前に使えた player_image.set_colorkey(BLACK)が使えませんでした。失敗作を出すのもいいのですが、これでとどめておきます。

まとめ

とりあえずは簡単な問題を作る内容リストを示すだけで、ChatGPTに作ってもらうことができた。一歩前進かな。思いもかけず、透明の問題でてこずってしまった。一歩前進一歩後退?かな。

最後に、今回サンプルを使わせてもらったメクルン関係者に謝辞を述べたいと思います。次にも、また使わせてもらいたいと思います。

                                                                                          20230503 作成

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