Python と Pygame を使ったヘビゲーム

PythonBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、Python と Pygame ライブラリを使ってヘビゲームを作成するプロセスを案内します。このゲームには、ゲームウィンドウ、ヘビ、パワーアップ、そしてスコアがあります。ヘビはゲームウィンドウの中を移動し、パワーアップを食べます。ヘビがパワーアップを食べると、ヘビの長さが 1 増えます。スコアは画面に表示されます。

👀 プレビュー

Snake game preview screenshot

🎯 タスク

このプロジェクトでは、以下のことを学びます。

  • Pygame を使ってゲームウィンドウを作成する方法
  • ユーザー入力を処理してヘビの動きを制御する方法
  • ヘビの位置を作成して更新する方法
  • ヘビとパワーアップを画面に描画する方法
  • ヘビとパワーアップの間の衝突を検出する方法
  • スコアを追跡する方法
  • スコアを画面に表示する方法

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • Pygame を使ってグラフィカルなゲームウィンドウを作成する
  • ユーザー入力を処理してゲームを制御する
  • ゲームオブジェクトを作成して更新する
  • ゲーム内の衝突を検出する
  • ゲームスコアを表示して更新する

プロジェクトファイルを作成する

snake_game.py という名前の新しいファイルを作成し、コードエディタで開きます。

cd ~/project
touch snake_game.py
sudo pip install pygame
✨ 解答を確認して練習

必要なモジュールをインポートする

snake_game.py ファイルで、pygamerandom モジュールをインポートします。

import pygame
import random
✨ 解答を確認して練習

Pygame を初期化する

モジュールをインポートした後、Pygame を初期化します。

pygame.init()
✨ 解答を確認して練習

ゲームウィンドウを設定する

ゲームウィンドウの幅、高さ、および 1 秒当たりのフレーム数(FPS)を定義します。

WIDTH = 800
HEIGHT = 600
FPS = 10
✨ 解答を確認して練習

色を定義する

ゲームで使用する色を定義します。

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
BACKGROUND_COLOR = (50, 50, 50)
✨ 解答を確認して練習

ゲームウィンドウをセットアップする

定義された幅と高さでゲームウィンドウを設定します。

screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Snake Game")
clock = pygame.time.Clock()

上記のコードでは、pygame.display.set_mode() は指定された幅と高さでディスプレイを初期化するために使用されます。pygame.display.set_caption() はゲームウィンドウのタイトルを設定するために使用されます。pygame.time.Clock() はゲーム内の時間を追跡するために使用されます。

✨ 解答を確認して練習

ヘビをセットアップする

ヘビのブロックサイズと速度を定義します。

snake_block_size = 20
snake_speed = 5

ブロックサイズを 20、速度を 5 に設定します。これは、ヘビが 1 回に 5 ピクセル移動することを意味します。

✨ 解答を確認して練習

ゲーム変数を設定する

スコアを表示するためのフォントスタイルとフォントサイズを定義します。

font_style = pygame.font.SysFont(None, 50)
score_font = pygame.font.SysFont(None, 35)
✨ 解答を確認して練習

パワーアップを設定する

パワーアップのブロックサイズを定義します。

powerup_block_size = 20
✨ 解答を確認して練習

関数を定義する

以下の関数を定義します。

draw_snake(snake_block_size, snake_list)

この関数は、画面上にヘビを描画します。

def draw_snake(snake_block_size, snake_list):
    for x in snake_list:
        pygame.draw.rect(
            screen, GREEN, [x[0], x[1], snake_block_size, snake_block_size]
        )

上記のコードでは、pygame.draw.rect() は画面上に矩形を描画するために使用されます。最初のパラメータは画面、2 番目のパラメータは色、3 番目のパラメータは矩形の位置とサイズです。

draw_powerup(powerup_x, powerup_y)

この関数は、画面上にパワーアップを描画します。

def draw_powerup(powerup_x, powerup_y):
    pygame.draw.rect(
        screen, RED, [powerup_x, powerup_y, powerup_block_size, powerup_block_size]
    )

上記のコードでは、pygame.draw.rect() は画面上に矩形を描画するために使用されます。最初のパラメータは画面、2 番目のパラメータは色、3 番目のパラメータは矩形の位置とサイズです。

display_score(score)

この関数は、画面上にスコアを表示します。

def display_score(score):
    value = score_font.render("Score: " + str(score), True, WHITE)
    screen.blit(value, [10, 10])

上記のコードでは、score_font.render() は画面上にスコアをレンダリングするために使用されます。最初のパラメータは表示するテキスト、2 番目のパラメータはアンチエイリアシング、3 番目のパラメータはテキストの色です。screen.blit() は画面上にテキストを描画するために使用されます。最初のパラメータは表示するテキスト、2 番目のパラメータはテキストの位置です。

game_loop()

この関数は、メインゲームループを含んでいます。

def game_loop():
    ## Game loop code goes here
✨ 解答を確認して練習

ゲームループコードを完成させる

game_loop() 関数を、while ループ内にゲームロジックを追加することで完成させます。

def game_loop():
    game_over = False
    game_close = False

    ## ヘビの初期位置を設定する
    x1 = WIDTH / 2
    y1 = HEIGHT / 2
    x1_change = 0
    y1_change = 0

    ## ヘビの体を設定する
    snake_list = []
    snake_length = 1

    ## パワーアップを設定する
    powerup_x = round(random.randrange(0, WIDTH - powerup_block_size) / 20) * 20
    powerup_y = round(random.randrange(0, HEIGHT - powerup_block_size) / 20) * 20

    ## ゲームループを設定する
    while not game_over:
        while game_close:
            screen.fill(BACKGROUND_COLOR)
            message = font_style.render("Press SPACE to play again", True, YELLOW)
            screen.blit(message, [WIDTH / 2 - 200, HEIGHT / 2 - 50])
            pygame.display.flip()

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    game_over = True
                    game_close = False
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_SPACE:
                        game_loop()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x1_change = -snake_block_size
                    y1_change = 0
                elif event.key == pygame.K_RIGHT:
                    x1_change = snake_block_size
                    y1_change = 0
                elif event.key == pygame.K_UP:
                    y1_change = -snake_block_size
                    x1_change = 0
                elif event.key == pygame.K_DOWN:
                    y1_change = snake_block_size
                    x1_change = 0

        if x1 >= WIDTH or x1 < 0 or y1 >= HEIGHT or y1 < 0:
            game_close = True

        x1 += x1_change
        y1 += y1_change
        screen.fill(BACKGROUND_COLOR)
        pygame.draw.rect(
            screen, BLUE, [powerup_x, powerup_y, powerup_block_size, powerup_block_size]
        )

        snake_head = []
        snake_head.append(x1)
        snake_head.append(y1)
        snake_list.append(snake_head)
        if len(snake_list) > snake_length:
            del snake_list[0]

        for x in snake_list[:-1]:
            if x == snake_head:
                game_close = True

        draw_snake(snake_block_size, snake_list)
        display_score(snake_length - 1)

        pygame.display.flip()

        if x1 == powerup_x and y1 == powerup_y:
            powerup_x = round(random.randrange(0, WIDTH - powerup_block_size) / 20) * 20
            powerup_y = (
                round(random.randrange(0, HEIGHT - powerup_block_size) / 20) * 20
            )
            snake_length += 1

        clock.tick(snake_speed)

    pygame.quit()

上記のコードでは、pygame.QUIT はゲームを終了するために使用されます。pygame.KEYDOWN はキーが押されたかどうかを確認するために使用されます。pygame.K_LEFTpygame.K_RIGHTpygame.K_UP、および pygame.K_DOWN はそれぞれ左矢印キー、右矢印キー、上矢印キー、および下矢印キーが押されたかどうかを確認するために使用されます。pygame.draw.rect() は画面上に矩形を描画するために使用されます。最初のパラメータは画面、2 番目のパラメータは色、3 番目のパラメータは矩形の位置とサイズです。pygame.display.flip() は画面を更新するために使用されます。pygame.time.Clock() はゲーム内の時間を追跡するために使用されます。pygame.time.Clock.tick() はゲームの FPS を設定するために使用されます。

✨ 解答を確認して練習

ゲームを実行する

ゲームを実行するために、ファイルの末尾に以下の内容を追加します。

game_loop()
pygame.quit()

最後に、デスクトップに切り替えて、以下のコマンドを使用してプロジェクトを実行します。

python snake_game.py
Snake game running command
✨ 解答を確認して練習

まとめ

おめでとうございます!Python と Pygame ライブラリを使って、成功裏にヘビゲームを作成しました。このプロジェクトでは、ゲームウィンドウを設定し、色を定義し、ヘビとパワーアップを描画し、スコアを表示し、ゲームロジックを実装する方法を学びました。これで、ゲームを実行して楽しむことができます。