【Python初心者向け】Pythonを使った超簡単なシューティングゲームの作り方

CG/AI雑学

Pythonで何か作ってみたい!

最近AI技術が発達し、AI開発でよく使用されるプログラミング言語でのPythonに注目が集まっています。

ただ、「Pythonを勉強し始めたけど何をすればいいんだろう?」、「まずはPythonで何かを作ってみたい!」という方向けにPythonで超簡単に作成できるシューティングゲームをご紹介します!

Python初心者の方でもわかりやすく、ステップバイステップで解説しますので安心して最後まで記事を読んでいただけたらと思います。

Pyhon関連のおすすめ記事はコチラ

Pythonでシューティングゲームを作るために必要な準備

まずは、シューティングゲームを作るために必要なものを確認しましょう。

必要なツール・環境

  • Python(バージョン3.7以上推奨)
  • ライブラリ:以下のPythonライブラリをインストールします。
    ・pygame
  • エディタ(VSCode推奨)

環境セットアップ

  1. Pythonがインストールされていない場合は、Download Python | Python.orgからダウンロードしてインストールしてください。
  2. 必要なライブラリをインストールします。 以下のコマンドをターミナル(またはコマンドプロンプト)で実行してください。
pip install pygame

実際にコードを書いてみよう!

ここでは、簡単なシューティングゲームのサンプルコードを紹介します。
以下のコードをコピーして使えば、すぐに動作確認が可能です!

import pygame
import random

# 初期化
pygame.init()

# 画面サイズ設定
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("シューティングゲーム")

# 色の定義
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)

# プレイヤーの設定
player_size = 50
player_x = WIDTH // 2
player_y = HEIGHT - 80
player_speed = 5

# 弾の設定
bullet_width = 5
bullet_height = 10
bullets = []

# 敵の設定
enemy_size = 50
enemies = []
spawn_rate = 30  # 敵の出現頻度

# ゲームループ
running = True
clock = pygame.time.Clock()
while running:
    screen.fill(WHITE)
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    # キー入力
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and player_x > 0:
        player_x -= player_speed
    if keys[pygame.K_RIGHT] and player_x < WIDTH - player_size:
        player_x += player_speed
    if keys[pygame.K_SPACE]:
        bullets.append([player_x + player_size // 2, player_y])
    
    # 弾の移動
    for bullet in bullets:
        bullet[1] -= 10
    bullets = [bullet for bullet in bullets if bullet[1] > 0]
    
    # 敵の出現
    if random.randint(1, spawn_rate) == 1:
        enemies.append([random.randint(0, WIDTH - enemy_size), 0])
    
    # 敵の移動
    for enemy in enemies:
        enemy[1] += 3
    enemies = [enemy for enemy in enemies if enemy[1] < HEIGHT]
    
    # 衝突判定
    for bullet in bullets:
        for enemy in enemies:
            if (enemy[0] < bullet[0] < enemy[0] + enemy_size) and (enemy[1] < bullet[1] < enemy[1] + enemy_size):
                enemies.remove(enemy)
                bullets.remove(bullet)
                break
    
    # プレイヤー描画
    pygame.draw.rect(screen, BLUE, (player_x, player_y, player_size, player_size))
    
    # 弾描画
    for bullet in bullets:
        pygame.draw.rect(screen, RED, (bullet[0], bullet[1], bullet_width, bullet_height))
    
    # 敵描画
    for enemy in enemies:
        pygame.draw.rect(screen, RED, (enemy[0], enemy[1], enemy_size, enemy_size))
    
    pygame.display.flip()
    clock.tick(30)

pygame.quit()

コードの解説

上記のコードは、大きく分けて以下の16個の部分で構成されています。

初期設定

import pygame
import random

# 初期化
pygame.init()
  • pygame をインポートして初期化します。
  • random をインポートして敵の出現位置をランダムにします。

画面の設定

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("シューティングゲーム")
  • 画面サイズは 800×600 に設定。
  • pygame.display.set_caption() でウィンドウのタイトルを設定。

色の定義

WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
  • ゲーム内で使用する色をRGB値で定義。
    • 白 (背景)
    • 赤 (敵・弾)
    • 青 (プレイヤー)

プレイヤーの設定

player_size = 50
player_x = WIDTH // 2
player_y = HEIGHT - 80
player_speed = 5
  • プレイヤーの大きさは 50×50ピクセル
  • 初期位置は 画面下部の中央
  • 移動速度は 5 ピクセル。

弾と敵の設定

bullet_width = 5
bullet_height = 10
bullets = []

enemy_size = 50
enemies = []
spawn_rate = 30 # 敵の出現頻度
  • 弾のサイズは 5×10ピクセル
  • 敵の大きさは 50×50ピクセル
  • bullets発射された弾のリスト
  • enemies出現した敵のリスト
  • spawn_rate = 30敵がランダムに出現する確率

ゲームループ

running = True
clock = pygame.time.Clock()
while running:
  • running = True でゲームが動作中であることを示す。
  • clock = pygame.time.Clock()フレームレート制御用

イベント処理(ゲーム終了)

for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
  • プレイヤーが ウィンドウを閉じるrunning = False でループを終了。

プレイヤーの移動

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and player_x > 0:
player_x -= player_speed
if keys[pygame.K_RIGHT] and player_x < WIDTH - player_size:
player_x += player_speed
  • 左キー を押すと左に移動 (player_x -= player_speed)。
  • 右キー を押すと右に移動 (player_x += player_speed)。
  • 画面外に出ないように制限

弾の発射

if keys[pygame.K_SPACE]:
bullets.append([player_x + player_size // 2, player_y])
  • スペースキー を押すと弾を発射。
  • bullets.append() で新しい弾をリストに追加。

弾の移動

for bullet in bullets:
bullet[1] -= 10
bullets = [bullet for bullet in bullets if bullet[1] > 0]
  • 弾は 上に移動する(bullet[1] -= 10
  • 画面外に出た弾はリストから削除。

敵の出現

if random.randint(1, spawn_rate) == 1:
enemies.append([random.randint(0, WIDTH - enemy_size), 0])
  • ランダムな確率で敵を出現させる。
  • random.randint(0, WIDTH - enemy_size)ランダムな横位置 に敵を配置。

敵の移動

for enemy in enemies:
enemy[1] += 3
enemies = [enemy for enemy in enemies if enemy[1] < HEIGHT]
  • 敵は 下に移動する(enemy[1] += 3
  • 画面外に出た敵をリストから削除。

衝突判定(敵に当たったら消す)

for bullet in bullets:
for enemy in enemies:
if (enemy[0] < bullet[0] < enemy[0] + enemy_size) and (enemy[1] < bullet[1] < enemy[1] + enemy_size):
enemies.remove(enemy)
bullets.remove(bullet)
break
  • 弾が敵に当たったら 両方とも削除 する。
  • if (enemy[0] < bullet[0] < enemy[0] + enemy_size) and (enemy[1] < bullet[1] < enemy[1] + enemy_size):
    弾の座標が敵の範囲内ならヒットと判定

画面描画

pygame.draw.rect(screen, BLUE, (player_x, player_y, player_size, player_size))
  • プレイヤー(青い四角形)を描画。
for bullet in bullets:
pygame.draw.rect(screen, RED, (bullet[0], bullet[1], bullet_width, bullet_height))
  • 弾(赤い四角形)を描画。
for enemy in enemies:
pygame.draw.rect(screen, RED, (enemy[0], enemy[1], enemy_size, enemy_size))
  • 敵(赤い四角形)を描画。

画面更新 & フレームレート制御

pygame.display.flip()
clock.tick(30)
  • pygame.display.flip()画面を更新
  • clock.tick(30)フレームレートを30FPSに制御

ゲーム終了

pygame.quit()
  • pygame.quit() でゲームを終了。

動かしてみよう!

上記のコードをVSCode上で起動した結果がこちらです!

ちゃんとシューティングゲームになっていますね
ただ、スペースキーを押してる間球が出続けるので無敵状態みたいな感じになってます笑

(あとゲームオーバーないですよね笑)


【Amazon.co.jp限定】ロジクール ワイヤレスマウス トラックボール 無線 M575S Bluetooth Unifying 5ボタン windows mac iPad 電池寿命最大24ケ月 M575 ブラック 国内正規品

まとめ

今回はPythonを使用した簡単なシューティングゲームの作り方をご紹介しました。
色々と改善点があると思うので、ぜひこのコードを自分なりに修正して、より面白いゲームにしてみてください!

人気記事

新着記事

コメント

タイトルとURLをコピーしました