はじめに
このプロジェクトでは、Pygame ライブラリを使って簡単なレーシングゲームを作成する方法を学びます。このゲームには、プレイヤー用の車と複数の敵用の車が登場します。プレイヤー用の車は矢印キーで左右に移動でき、敵用の車は画面を下方向に移動します。ゴールはできるだけ敵用の車との衝突を避けることです。衝突が発生するとゲームオーバー画面が表示され、「R」キーを押すことでゲームを再開できます。
👀 プレビュー

🎯 タスク
このプロジェクトで学ぶことは以下の通りです。
- ゲームウィンドウを設定し、必要なライブラリをインポートする方法
- 色を定義し、車の画像を読み込む方法
- プレイヤー用の車を定義する方法
- 敵用の車を定義する方法
- ゲームオーバー用の変数とフォントを定義する方法
- ゲームロジックを実装する方法
- ゲームオーバー画面を表示する方法
- ゲームを終了する方法
🏆 成果
このプロジェクトを完了すると、以下のことができるようになります。
- Pygame ライブラリを使ってゲームウィンドウを作成する
- ゲーム内で画像を読み込んで表示する
- ゲームオブジェクト間の衝突を処理する
- 連続したゲームプレイのためのゲームループを実装する
- ゲームオブジェクトを制御するためのユーザー入力を処理する
- Pygame のフォントモジュールを使って画面にテキストを表示する
プロジェクトファイルを作成する
racing_game.pyという名前の新しいファイルを作成します。
cd ~/project
touch racing_game.py
ゲームウィンドウを設定し、必要なライブラリをインポートする
import pygame
import random
## Pygame を初期化する
pygame.init()
## ゲームウィンドウを設定する
window_width = 800
window_height = 600
window = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption("Racing Game")
このステップでは、pygame ライブラリをインポートして初期化します。その後、幅 800 ピクセル、高さ 600 ピクセルのゲームウィンドウを設定します。また、ウィンドウのタイトルを「Racing Game」に設定します。
ターミナルで以下のコマンドを実行して pygame ライブラリをインストールします。
sudo pip install pygame
色を定義し、車の画像を読み込む
## 色を定義する
background_color = (30, 30, 30)
player_car_color = (255, 255, 255)
enemy_car_color = (255, 0, 0)
text_color = (255, 255, 255)
## 車の画像を読み込む
player_car_img = pygame.image.load("player_car.png").convert_alpha()
enemy_car_img = pygame.image.load("enemy_car.png").convert_alpha()
このステップでは、ゲームで使用するいくつかの色を定義します。background_color、player_car_color、enemy_car_color、および text_color です。また、pygame.image.load() 関数を使って、プレイヤー用の車と敵用の車の画像を読み込みます。
player_car.png と enemy_car.png の画像は、~/project ディレクトリに含まれています。
プレイヤー用の車を定義する
## プレイヤー用の車を定義する
player_car_width = player_car_img.get_width()
player_car_height = player_car_img.get_height()
player_car_x = window_width // 2 - player_car_width // 2
player_car_y = window_height - player_car_height - 10
player_car_speed = 5
このステップでは、プレイヤー用の車のプロパティを定義します。player_car_width と player_car_height は、プレイヤー用の車の画像の寸法に設定されます。player_car_x と player_car_y は、画面上のプレイヤー用の車の初期位置を表します。player_car_speed は、プレイヤー用の車が移動できる速度を決定します。
敵の車を定義する
## 敵用の車を定義する
enemy_cars = []
num_enemy_cars = 3
enemy_car_width = 80
enemy_car_height = 160
for _ in range(num_enemy_cars):
enemy_car_x = random.randint(0, window_width - enemy_car_width)
enemy_car_y = random.randint(-window_height, -enemy_car_height)
enemy_car_speed = random.randint(2, 5)
enemy_cars.append({"x": enemy_car_x, "y": enemy_car_y, "speed": enemy_car_speed})
このステップでは、敵用の車のプロパティを定義します。enemy_cars は、敵用の車のオブジェクトを格納するリストです。num_enemy_cars は、ゲーム内の敵用の車の数を決定します。enemy_car_width と enemy_car_height は、敵用の車の画像の寸法を表します。各敵用の車に対してランダムな位置と速度を生成し、enemy_cars リストに追加するためにループを使用します。
ゲームオーバーの変数とフォントを定義する
## ゲームオーバー用の変数を定義する
game_over = False
font = pygame.font.Font(None, 50)
game_over_text = font.render("Game Over", True, text_color)
restart_text = font.render("Press R to Restart", True, text_color)
このステップでは、ゲームオーバー画面に関連する変数を定義します。game_over は、ゲームが終了しているかどうかを示すブール型の変数です。font は、サイズ 50 の Pygame のフォントオブジェクトです。フォントを使って「Game Over」のテキストと「Press R to Restart」のテキストをレンダリングし、game_over_text と restart_text の変数に格納します。
ゲームループ
## ゲームループ
running = True
clock = pygame.time.Clock()
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_r and game_over:
game_over = False
player_car_x = window_width // 2 - player_car_width // 2
player_car_y = window_height - player_car_height - 10
for enemy_car in enemy_cars:
enemy_car["x"] = random.randint(0, window_width - enemy_car_width)
enemy_car["y"] = random.randint(-window_height, -enemy_car_height)
if not game_over:
## ゲームロジックコードはここに書きます...
## ウィンドウを更新する
window.fill(background_color)
window.blit(player_car_img, (player_car_x, player_car_y))
for enemy_car in enemy_cars:
window.blit(enemy_car_img, (enemy_car["x"], enemy_car["y"]))
else:
## ゲームオーバー画面のコードはここに書きます...
pygame.display.update()
clock.tick(60)
このステップでは、while ループを使ってゲームループを設定します。running 変数が True の間、ループは実行されます。イベントの種類とキーをチェックすることで、ゲームの終了や再開などのイベントを処理します。ゲームが終了していない場合、if not game_over ブロック内のコードが実行され、これにはゲームロジックと画面上にプレイヤー用の車と敵用の車を描画する処理が含まれます。ゲームが終了している場合、else ブロック内のコードが実行され、ゲームオーバー画面が表示されます。最後に、画面を更新してフレームレートを毎秒 60 フレームに設定します。
ゲームロジックコード
if not game_over:
## プレイヤー用の車を移動させる
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and player_car_x > player_car_speed:
player_car_x -= player_car_speed
if (
keys[pygame.K_RIGHT]
and player_car_x < window_width - player_car_width - player_car_speed
):
player_car_x += player_car_speed
## 敵用の車を移動させる
for enemy_car in enemy_cars:
enemy_car["y"] += enemy_car["speed"]
if enemy_car["y"] > window_height:
enemy_car["x"] = random.randint(0, window_width - enemy_car_width)
enemy_car["y"] = random.randint(-window_height, -enemy_car_height)
enemy_car["speed"] = random.randint(2, 5)
## 衝突をチェックする
if player_car_y < enemy_car["y"] + enemy_car_height:
if (
player_car_x < enemy_car["x"] + enemy_car_width
and player_car_x + player_car_width > enemy_car["x"]
):
game_over = True
このステップでは、ゲームループ内にゲームロジックコードを実装します。ユーザー入力をチェックしてプレイヤー用の車を左右に移動させます。敵用の車の位置を更新し、プレイヤー用の車と敵用の車の間で衝突が発生したかどうかをチェックします。衝突が発生した場合、game_over 変数を True に設定します。
ゲームオーバー画面のコード
else:
## ゲームオーバー画面
window.fill(background_color)
game_over_rect = game_over_text.get_rect(
center=(window_width // 2, window_height // 2 - 50)
)
restart_rect = restart_text.get_rect(
center=(window_width // 2, window_height // 2 + 50)
)
window.blit(game_over_text, game_over_rect)
window.blit(restart_text, restart_rect)
このステップでは、ゲームループ内にゲームオーバー画面のコードを実装します。window.blit() 関数を使って、ゲームオーバーのテキストと再開のテキストを画面に表示します。get_rect() と center プロパティを使って、テキストを画面の中央に配置します。
ゲームを終了する
## ゲームを終了する
pygame.quit()
この最後のステップでは、ゲームループが終了したときにゲームを終了し、Pygame のウィンドウを閉じます。
次に、次のコマンドを使ってゲームを実行できます:
python racing_game.py

まとめ
おめでとうございます!Pygame ライブラリを使って、簡単なレーシングゲームを成功裏に作成しました。このゲームには、左右に移動できるプレイヤー用の車と、複数の敵用の車が含まれています。目的は、できるだけ長い間敵用の車との衝突を避けることです。また、このゲームにはゲームオーバー画面があり、「R」キーを押すことでゲームを再開できます。ゲーム開発技術を向上させるために、練習と実験を続けてください。



