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

# [Day 1: Pygameの基本を学ぶ](https://qiita.com/tsuyoron515/items/78cc6d949123beea6f71#day-0-%E3%83%80%E3%83%B3%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AE%E6%9C%80%E4%BD%8E%E9%99%90%E8%A6%81%E7%B4%A0:~:text=%E8%A8%88%E7%94%BB%E3%82%92%E7%AB%8B%E3%81%A6%E3%82%8B-,Day%201%3A%20Pygame%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%82%92%E5%AD%A6%E3%81%B6,-Pygame%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)


## Pygameのインストール
1. 公式サイト(https://www.pygame.org/news) にアクセスします。
2. ダウンロードページから、最新版のPygameを探します。
3. 対応するオペレーティングシステム（Windows、Mac、Linux）に合わせて、Pygameのインストーラーまたはパッケージをダウンロードします。
4. ダウンロードが完了したら、インストーラーを実行してPygameをインストールします。

## Pygameの基本機能の学習
1. Pythonの開発環境を起動します（例：PyCharm、Visual Studio Code）。
2. 新しいPythonファイルを作成し、任意の名前で保存します（例：game.py）。
3. 以下のコードをファイルに追加して保存します。

```python
import pygame

# 表示モジュールの初期化
pygame.init()

# ゲームの初期設定
# 画面の幅と高さ
screen_width = 800
screen_height = 600

# 画面の作成
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("My Game")

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

    # 画面のクリア
    screen.fill((0, 0, 0))

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

# ゲームの終了
pygame.quit()
```

4. コードを実行すると、Pygameウィンドウが表示されますが、何も表示されません。ただし、ウィンドウを閉じることはできます。

5. 関数の具体的な内容については、[pygame documentation](https://www.pygame.org/docs/ref/display.html) を参考に学習することができます。

### ウィンドウの作成
1. `screen_width`と`screen_height`変数を適切な値に変更して、ウィンドウの幅と高さを設定します。
2. `pygame.display.set_caption`の引数を変更して、ウィンドウのタイトルを設定します。
3. `screen.fill()` は、Pygameの Surface オブジェクト（通常は `pygame.display.set_mode()` で作成されるウィンドウ）を指定した色で塗りつぶすメソッドです。具体的には、指定した色でウィンドウ全体を塗りつぶします。
`screen.fill(color)` のように使用します。`color` は RGB 値または色の定数で指定される色を示します。例えば、 `(255, 255, 255)` は白色を表し、 `(0, 0, 0)` は黒色を表します。

### スプライトの表示
Pygameでは、スプライト（画像や図形などのゲームオブジェクト）を表示することができます。以下の手順でスプライトを表示してみましょう。

1. 画像ファイル（例："player.png"）をプロジェクトのディレクトリに保存します。
2. 以下のコードを追加して、スプライトを表示します。

```python
import pygame
# 表示モジュールの初期化
pygame.init()

# ゲームの初期設定
# 画面の幅と高さ
screen_width = 800
screen_height = 600

# 画面の作成
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("My Game")

# スプライトの読み込み
player_image = pygame.image.load("player.png")
player_rect = player_image.get_rect()
player_rect.center = (screen_width // 2, screen_height // 2)

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

    # 画面のクリア
    screen.fill((0, 0, 0))

    # スプライトの描画
    screen.blit(player_image, player_rect)

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

# ゲームの終了
pygame.quit()
```

3. コードを実行すると、"player.png"で指定した画像がウィンドウの中央に表示されます。

### ユーザー入力の処理

1. イベントループの中で、`pygame.event.get()` を使用してイベントを取得します。
2. 取得したイベントを処理するためのループを作成します。
3. イベントのタイプを確認し、キーボードのキー押下やマウスのクリックなどを検出します。

```python
# ゲームループ内でのイベント処理の例
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE:
            # スペースキーが押された時の処理
            pass
    elif event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == 1:
            # マウスの左ボタンがクリックされた時の処理
            pass
```

### アニメーション

1. ゲームループ内で、スプライトの位置や状態を更新します。
2. スプライトの描画前に、画面のクリアを行います。
3. スプライトを描画した後に、画面を更新します。

```python
# ゲームループ内でのアニメーションの例
while running:
    # 位置や状態の更新
    sprite.update()

    # 画面のクリア
    screen.fill((0, 0, 0))

    # スプライトの描画
    sprite.draw(screen)

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

### 衝突検出

1. スプライト同士やスプライトとオブジェクトの衝突を検出するための方法を選択します（例：矩形の衝突判定、円形の衝突判定など）。
2. 衝突判定を行い、必要に応じて適切な処理を実装します。

```python
# スプライト同士の矩形衝突判定の例
if sprite1.rect.colliderect(sprite2.rect):
    # 衝突時の処理
    pass

# スプライトと壁の衝突判定の例
if sprite.rect.left < 0 or sprite.rect.right > screen_width:
    # 壁に衝突した時の処理
    pass
```

### サウンドと音楽

1. 音声ファイル（例："sound.wav"）をプロジェクトのディレクトリに保存します。
2. サウンドや音楽をロードし、再生するためのコードを追加します。

```python
# サウンドのロード
sound = pygame.mixer.Sound("sound.wav")

# サウンドの再生
sound.play()

# 音楽のロードと再生
pygame.mixer.music.load("music.mp3")
pygame.mixer.music.play(-1)  # -1を指定するとループ再生します
```

### テキストの表示

1. テキストを表示するフォントを選択します（例："Arial", "Verdana"など）。
2. フォントのサイズやスタイルを設定します。
3. テキストを描画する前に、テキストをSurfaceオブジェクトにレンダリングします。
4. Surfaceオブジェクトを画面に描画します。

```python
# フォントの設定
font = pygame.font.Font("font.ttf", 24)  # フォントファイル（例："font.ttf"）とサイズを指定

# テキストのレンダリング
text_surface = font.render("Hello, Pygame!", True, (255, 255, 255))  # テキスト、アンチエイリアス、色を指定

# テキストの描画
screen.blit(text_surface, (x, y))  # x, yはテキストの左上座標
```

# まとめ
基本的な関数については、[pygame documentation](https://www.pygame.org/docs/ref/display.html) を参考に学習していき、基本的な処理については、ゲームループ内に記載すると良い事が分かりました！

# 参考サイト
[pygame documentation](https://www.pygame.org/docs/ref/display.html)
[pygame の初心者ガイド](https://www.pygame.org/docs/tut/newbieguide.html)