Pythonツール ゲーム

Pythonでスペースインベーダー風のシューティングゲームを作成

概要

PythonとPygameライブラリを使用して、スペースインベーダー風のシューティングゲームを作成する方法を紹介します。このガイドでは、ゲームの基本的な構造、必要なライブラリのインストール方法、実際のプログラムコードを詳しく説明します。初心者から中級者まで、Pythonを使ってゲーム開発を楽しみたい方に最適です。

使用例

このシューティングゲームでは、プレイヤーが敵を倒しながらスコアを上げていきます。フェーズごとに敵の速度が上がり、一定数の敵を倒すごとに出現する敵の数が増加します。シンプルながらもエキサイティングなゲームプレイを楽しむことができます。

必要なPythonライブラリとインストール方法

このゲームを実行するためには、PythonとPygameライブラリが必要です。以下のコマンドでPygameライブラリをインストールできます。

pip install pygame

使用手順

  1. 必要なPythonライブラリをインストールします。
  2. 下記のプログラムコードをメモ帳などにコピーして、py-invaders.pyという名前のPythonファイルとして保存します。
  3. コマンドラインまたはターミナルで、保存したPythonファイルがあるディレクトリに移動します。
  4. 以下のコマンドを実行してゲームを開始します。
import pygame
import random

# 初期化
pygame.init()

# 画面設定
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Py-invaders")

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

# フォント設定
font = pygame.font.Font(None, 32)

# テキスト描画関数
def draw_text(text, x, y, color=WHITE):
render = font.render(text, True, color)
screen.blit(render, (x, y))

# プレイヤー設定
player_text = '^'
player_x = 370
player_y = 480
player_x_change = 0

# 弾丸設定
bullet_text = '|'
bullet_x = 0
bullet_y = 480
bullet_x_change = 0
bullet_y_change = 1 # 弾丸の速度を1/10にする
bullet_state = "ready"

# 敵設定
enemy_text = 'v'
enemies = []
enemy_speed = 0.04 # 初期速度
score_value = 0
phase = 1

# スコア設定
text_x = 10
text_y = 10

# ゲーム状態
game_state = "start"

def create_enemies(num):
enemies.clear()
for _ in range(num):
enemy_x = random.randint(0, 736)
enemy_y = random.randint(50, 150)
enemies.append([enemy_x, enemy_y, 2, 40])

def show_score(x, y):
score = font.render("Score : " + str(score_value), True, WHITE)
screen.blit(score, (x, y))

def is_collision(enemy_x, enemy_y, bullet_x, bullet_y):
distance = ((enemy_x - bullet_x)**2 + (enemy_y - bullet_y)**2)**0.5
return distance < 27

def reset_game():
global player_x, player_y, bullet_state, bullet_y, score_value, enemy_speed, phase
player_x = 370
player_y = 480
bullet_state = "ready"
bullet_y = 480
score_value = 0
enemy_speed = 0.04
phase = 1
create_enemies(1)

# ゲームループ
running = True
while running:
screen.fill(BLACK)

for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

if game_state == "start":
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
game_state = "play"
reset_game()
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
if 300 <= mouse_x <= 500 and 400 <= mouse_y <= 450:
game_state = "play"
reset_game()

elif game_state == "play":
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player_x_change = -0.5 # プレイヤーの速度を1/10にする
if event.key == pygame.K_RIGHT:
player_x_change = 0.5 # プレイヤーの速度を1/10にする
if event.key == pygame.K_SPACE:
if bullet_state == "ready":
bullet_x = player_x
bullet_y = player_y
bullet_state = "fire"

if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
player_x_change = 0

elif game_state == "gameover":
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
game_state = "start"

if game_state == "start":
draw_text("Py-invaders", 300, 200)
draw_text("Press Enter to Start", 260, 300)
pygame.draw.rect(screen, WHITE, [300, 400, 200, 50])
draw_text("Game Start", 320, 410, BLACK)

elif game_state == "play":
player_x += player_x_change
if player_x <= 0:
player_x = 0
elif player_x >= 736:
player_x = 736

for enemy in enemies:
enemy[0] += enemy[2] * enemy_speed
if enemy[0] <= 0:
enemy[2] = 2
enemy[1] += enemy[3]
elif enemy[0] >= 736:
enemy[2] = -2
enemy[1] += enemy[3]

if enemy[1] > 450:
game_state = "gameover"

if is_collision(enemy[0], enemy[1], player_x, player_y):
game_state = "gameover"

draw_text(enemy_text, enemy[0], enemy[1])

if bullet_y <= 0:
bullet_y = player_y
bullet_state = "ready"

if bullet_state == "fire":
draw_text(bullet_text, bullet_x + 16, bullet_y)
bullet_y -= bullet_y_change

for enemy in enemies:
if is_collision(enemy[0], enemy[1], bullet_x, bullet_y):
bullet_y = player_y
bullet_state = "ready"
score_value += 1
enemies.remove(enemy)
if len(enemies) == 0:
phase += 1
if phase % 5 == 0:
num_of_enemies = phase // 5 + 1
else:
num_of_enemies = 1
enemy_speed += 1 / 100.0 # 敵の速度を1/100ずつ増加させる
create_enemies(num_of_enemies)

draw_text(player_text, player_x, player_y)
show_score(text_x, text_y)

elif game_state == "gameover":
draw_text("Game Over", 300, 250)
draw_text("Press Enter to Restart", 220, 300)
draw_text(f"Final Score: {score_value}", 300, 350)

pygame.display.update()

注意点

  • このゲームはPython 3.xで動作します。Python 2.xでは動作しない可能性があります。
  • Pygameライブラリが正しくインストールされていることを確認してください。
  • スクリプト実行時にエラーが発生した場合は、エラーメッセージを確認し、必要な修正を行ってください。

プログラム

下記のコードをメモ帳などに丸々コピーして py-invaders.py にしてください。

[プログラムの記述は省略して良いです]

あるいは、下のテキストファイルをダウンロードし、「.txt」を「.py」に変えることでそのまま使えます。

まとめ

このガイドでは、PythonとPygameを使ってシンプルなスペースインベーダー風のシューティングゲームを作成する方法を紹介しました。ゲーム開発の基本を学びながら、Pythonのスキルを向上させることができます。さらに、このプログラムを拡張して、より複雑な機能やエキサイティングな要素を追加することも可能です。ゲーム開発の楽しさを体験しながら、Pythonのプログラミングスキルを磨いていきましょう。

-Pythonツール, ゲーム