pygameでAWSサービス名タイピング作ってみた(pyinstallerでexe化)

# AWS サービス名タイピングゲーム - 解説記事

## はじめに

本記事では、AWSのサービス名をタイピングするゲームの作成手順について解説します。このゲームは、Pythonのゲームライブラリ `pygame` を用いて構築されており、`pyinstaller` を使用して実行ファイルを作成する方法も含まれています。

## 目次

1. [プロジェクトの概要](#プロジェクトの概要)
2. [必要な環境](#必要な環境)
3. [インストール方法](#インストール方法)
4. [仮想環境（venv）の設定方法](#仮想環境venvの設定方法)
5. [使用方法](#使用方法)
6. [pyinstaller での実行ファイル作成](#pyinstallerでの実行ファイル作成)
7. [ゲームの詳細](#ゲームの詳細)
8. [まとめ](#まとめ)

## プロジェクトの概要

このゲームは、AWSのサービス名を素早く正確にタイピングすることでスコアを競います。各ラウンドでランダムに表示されるサービス名をタイピングし、時間内にできるだけ多くのポイントを獲得してください。

## 必要な環境

- Python 3.x
- `pygame` ライブラリ

## インストール方法

### Pythonと`pygame`のインストール

まず、Pythonがインストールされていることを確認し、`pygame` ライブラリをインストールします。

```bash
pip install pygame
```

次に、リポジトリをクローンまたはダウンロードします。

```bash
git clone https://github.com/your-username/aws-typing-game.git
cd aws-typing-game
```

## 仮想環境（venv）の設定方法

仮想環境を使用すると、依存関係が隔離され、プロジェクト間でのライブラリの衝突を避けることができます。以下の手順で仮想環境を設定します。

1. 仮想環境を作成します

   ```bash
   python -m venv venv
   ```

2. 仮想環境をアクティブにします

   - **Windows:**

     ```bash
     .\venv\Scripts\activate
     ```

   - **macOS/Linux:**

     ```bash
     source venv/bin/activate
     ```

3. 必要なライブラリを仮想環境内にインストールします

   ```bash
   pip install pygame
   ```

## 使用方法

1. 仮想環境をアクティブにします（上記の手順を参照）

2. ゲームのメインスクリプトを実行します

   ```bash
   python main.py
   ```

3. ゲームが起動したら、表示されるAWSサービス名をタイピングしてエンターキーを押します

4. 正確にタイピングすることでスコアが加算されます。タイムリミット内にできるだけ多くのサービス名をタイピングしてください

## pyinstaller での実行ファイル作成

ゲームを実行ファイルとして配布したい場合は、`pyinstaller` を使用して以下の手順で作成します。

1. 仮想環境がアクティブな状態で、`pyinstaller` をインストールします

   ```bash
   pip install pyinstaller
   ```

2. `pyinstaller` を使用して実行ファイルを作成します

   ```bash
   pyinstaller --onefile main.py
   ```

3. `dist` フォルダ内に `main` 実行ファイルが生成されます。このファイルをダブルクリックすることでゲームを起動できます

## ゲームの詳細

### ゲームの概要

このゲームは、プレイヤーがAWSのサービス名をタイピングし、正確に入力することでスコアを競うゲームです。以下は主要なゲームロジックの詳細です。

### ゲームの主要クラス

- **`Word` クラス:**

  各AWSサービス名を表すクラスです。`text`、`x`、`y` の属性を持ち、スクリーン上での描画と移動を担当します。

  ```python
  class Word:
      def __init__(self, text, x):
          self.text = text
          self.x = x
          self.y = 0

      def move(self, speed):
          self.y += speed

      def draw(self, screen):
          text_surface = FONT.render(self.text, True, BLACK)
          screen.blit(text_surface, (self.x, self.y))
  ```

- **`Game` クラス:**

  ゲーム全体のロジックを管理するクラスです。ゲームの開始、プレイ、ゲームオーバーの各状態を制御します。

  ```python
  class Game:
      def __init__(self):
          self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
          pygame.display.set_caption("AWS Service Name Typing Game")
          self.clock = pygame.time.Clock()
          self.start_time = 0
          self.reset_game()

      def reset_game(self):
          self.state = START
          self.words = []
          self.current_word = ""
          self.score = 0
          self.time_left = TIME_LIMIT
          self.input_text = ""
          self.composition = ""

      def run(self):
          while True:
              if self.state == START:
                  self.start_screen()
              elif self.state == READY:
                  self.ready_screen()
              elif self.state == PLAYING:
                  self.game_screen()
              elif self.state == GAME_OVER:
                  self.game_over_screen()
              elif self.state == RESULT:
                  self.result_screen()
  ```

### ゲームの動作

1. **スタート画面:**

   プレイヤーは難易度を選択し、ゲームを開始します。

   ```python
   def start_screen(self):
       self.screen.fill(WHITE)
       title_text = FONT.render("AWS タイピングゲーム", True, BLACK)
       self.screen.blit(title_text, title_text.get_rect(center=(WIDTH//2, HEIGHT//5)))
       # 省略...
       pygame.display.flip()

       for event in pygame.event.get():
           if event.type == pygame.QUIT:
               pygame.quit()
               sys.exit()
           if event.type == pygame.MOUSEBUTTONDOWN:
               mouse_pos = pygame.mouse.get_pos()
               # 省略...
   ```

2. **ゲーム画面:**

   単語が上から落ちてくる間にタイピングし、正確に入力するとスコアが加算されます。

   ```python
   def game_screen(self):
       self.screen.fill(WHITE)
       # 省略...

       for word in self.words:
           word.move(self.word_speed)
           word.draw(self.screen)

           if word.y > HEIGHT * 9/10:
               self.state = GAME_OVER
       # 省略...
   ```

3. **ゲームオーバー画面:**

   時間切れになるとゲームオーバー画面が表示されます。

   ```python
   def game_over_screen(self):
       self.screen.fill(RED)
       text = FONT.render(f"ゲームオーバー！{self.score}点でした。。スペースキーでリスタート", True, BLACK)
       self.screen.blit(text, text.get_rect(center=(WIDTH//2, HEIGHT//2)))
       pygame.display.flip()

       for event in pygame.event.get():
           if event.type == pygame.QUIT:
               pygame.quit()
               sys.exit()
           if event.type == pygame.KEYDOWN:
               if event.key == pygame.K_SPACE:
                   self.reset_game()
                   self.state = START
   ```

## まとめ

このゲームは、AWSのサービス名をタイピングし、スコアを競うシンプルで楽しいタイピングゲームです。`pygame` を使用してゲームを構築し、`pyinstaller` を使って実行ファイルを作成する手順も紹介しました。このプロジェクトを通じて、Pythonでのゲーム開発やパッケージングの基礎を学ぶことができます。

ゲームのさらなる改良や、他のテーマを用いたタイピングゲームの開発など、ぜひチャレンジしてみてください。質問やフィードバックがあれば、気軽にコメントしてください。

[git repo](https://github.com/sagong-ryung/aws-typing)