Day 2: python初心者がダンジョンゲーム作成してみる

# [Day 2: ゲームオブジェクトを作成する](https://qiita.com/tsuyoron515/items/78cc6d949123beea6f71#day-2-%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B:~:text=%E3%82%92%E5%AD%A6%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82-,Day%202%3A%20%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B,-%E3%83%97%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90)
## 今回作成した物の画像
___pygameの動画を撮影拒否されたので、画像添付___
![スクリーンショット 2023-07-06 231622.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778907/bccccf09-4cc0-b68a-081e-b7e3b17d90fa.png)



1. ライブラリのインポート:

```python
import pygame
import random
```

Pygameは、Pythonでゲームやマルチメディアアプリケーションを作成するためのモジュールです。また、ランダムな数値を生成するために`random`モジュールもインポートされています。

2. Pygameの初期化:

```python
pygame.init()
```

Pygameモジュールを初期化します。

3. ゲームの初期設定:

```python
screen_width = 800
screen_height = 600

common_width = 50
common_height = 50
```

画面の幅と高さ、オブジェクトの共通の大きさを設定しています。

4. 画面の作成:

```python
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("My Game")
```

`set_mode()`関数を使用して画面を作成し、`set_caption()`関数を使用してウィンドウのタイトルを設定しています。

5. Playerクラスの定義:

```python
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("player.png")
        self.image = pygame.transform.scale(self.image, (common_width, common_height))
        self.rect = self.image.get_rect()
        self.rect.center = (screen_width // 2, screen_height // 2)
        self.speed = 1

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT]:
            self.rect.x += self.speed
        if keys[pygame.K_UP]:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN]:
            self.rect.y += self.speed
```

`Player`クラスは、プレイヤーのキャラクターを表すオブジェクトです。`pygame.sprite.Sprite`クラスを継承しています。`__init__()`メソッドでは、プレイヤーの画像を読み込み、サイズを変更し、位置と速度を初期化しています。`update()`メソッドでは、キーボードの入力に応じてプレイヤーの位置を更新します。

6. Enemyクラスの定義:

```python
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("enemy.png")
        self.image = pygame.transform.scale(self.image, (common_width, common_height))
        self.rect = self.image.get_rect()
        self.rect.center = (random.randint(0, screen_width), random.randint(0, screen_height))
        self.speed = 1

    def update(self):
        self.rect.x += self.speed
        if self.rect.left > screen_width:
            self.rect.right = 0
            self.rect.bottom = random.randint(0, screen_height)
```

`Enemy`クラスは、敵キャラクターを表すオブジェクトです。`pygame.sprite.Sprite`クラスを継承しています。`__init__()`メソッドでは、敵の画像を読み込み、サイズを変更し、ランダムな位置と速度を初期化しています。`update()`メソッドでは、敵の位置を水平方向に移動させます。また、敵が画面外に出た場合には、ランダムな位置に再配置します。

7. Itemクラスの定義:

```python
class Item(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("item.png")
        self.image = pygame.transform.scale(self.image, (100, common_height))
        self.rect = self.image.get_rect()
        self.rect.center = (random.randint(0, screen_width), random.randint(0, screen_height))
        self.speed = 1

    def update(self):
        self.rect.x += self.speed
        if self.rect.left > screen_width:
            self.rect.right = 0
```

`Item`クラスは、アイテムを表すオブジェクトです。`pygame.sprite.Sprite`クラスを継承しています。`__init__()`メソッドでは、アイテムの画像を読み込み、サイズを変更し、ランダムな位置と速度を初期化しています。`update()`メソッドでは、アイテムの位置を水平方向に移動させます。また、アイテムが画面外に出た場合には、画面の反対側に再配置します。

8. プレイヤー、敵、アイテムの作成:

```python
player = Player()

enemies = pygame.sprite.Group()
for _ in range(5):
    enemy = Enemy()
    enemies.add(enemy)

items = pygame.sprite.Group()
for _ in range(10):
    item = Item()
    items.add(item)
```

`Player`クラスのインスタンスを作成し、`Enemy`クラスと`Item`クラスの複数のインスタンスを生成します。それぞれのインスタンスは、それぞれのグループに追加されます。

9. ゲームループ:

```python
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player.update()
    enemies.update()
    items.update()

    screen.fill((0, 0, 0))

    screen.blit(player.image, player.rect)
    for enemy in enemies:
        screen.blit(enemy.image, enemy.rect)
    for item in items:
        screen.blit(item.image, item.rect)

    pygame.display.flip()
```

ゲームのメインループが実行されます。イベントを処理し、プレイヤー、敵、アイテムの位置を更新します。`screen.fill()`関数を使用して画面を塗りつぶし、プレイヤー、敵、アイテムの画像を画面上に描画します。最後に`pygame.display.flip()`を呼び出して、画面を更新します。

10. ゲームの終了:

```python
pygame.quit()
```

ゲームループが終了した後、Pygameを終了させます。

# まとめ
今回で、インスタンスの概念や、継承、初期化について、学習ができました！
作成したものが目で見える形になると、少し楽しくなる！