【ゼロから始めるPython】Pythonでマリオ風ゲームを作ってみよう!

Python
この記事を書いた人
柊あい

生成AI研究家。新卒で一般企業に就職するも、日々の過酷な残業でメンタルを崩し、退職。
そんな中、生成AIに出会い、当時はまだ珍しかったAI活用フリーランサーとして活動。現在はAI活用を広めるインフルエンサーとして、本サイトの記事の執筆を担当。

公式SNSをフォローする

はじめに

マリオのような横スクロール型のゲームは、Pythonでゲームプログラミングを学ぶ初心者の方に最適です。このプロジェクトでは、pygameライブラリを使ってシンプルな横スクロール型のアクションゲームを作成し、基本的なプログラミングの概念である関数、ループ、条件分岐を活用していきます。プレイヤーはキャラクターを左右に移動させ、ジャンプして障害物や敵を避けながらゴールを目指します。

このゲームを通じて、Pythonの基礎をしっかりと身につけながら、実際のゲーム開発で必要なテクニックも学べるでしょう!

Pythonで制作できるゲーム一覧はこちらの記事で確認できます!

必要な機能

このプロジェクトでは、以下の機能を順番に実装します。

  1. ゲームウィンドウの設定
    • pygameを使用して、ゲームが表示されるウィンドウを作成し、キャラクターの移動やゲーム進行ができるように設定します。
  2. キャラクターの移動とジャンプ
    • プレイヤーがキーボードを使ってキャラクターを左右に動かしたり、ジャンプしたりする機能を作成します。
  3. 敵キャラクターの移動
    • 敵キャラクター(クリボー)を設定し、一定の範囲で行ったり来たりする動きを実装します。
  4. 衝突と勝敗判定
    • キャラクターが敵と衝突したり、ゴールに到達したりした際に、ゲームオーバーやクリアを判定する機能を実装します。
  5. 障害物と地形の配置
    • 障害物を配置し、プレイヤーがジャンプして回避できるようにすることで、ゲームにアクション要素を追加します。

これから、各機能を順を追って構築し、Pythonで楽しめるマリオ風ゲームを作成していきましょう!

準備: 必要なライブラリのインストール

まず、pygameライブラリをインストールします。以下のコマンドをターミナルで実行してください。

pip install pygame

ステップ1: 基本設定と画面の準備

ゲームのウィンドウサイズやフレームレートなどの基本設定を行います。

import pygame
import sys

# 初期化
pygame.init()

# ウィンドウサイズの設定
WIDTH, HEIGHT = 800, 400
window = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("スーパーマリオ")

# FPS設定
clock = pygame.time.Clock()
FPS = 60

ここでは、pygame.init()pygameを初期化し、幅800ピクセル、縦400ピクセルのウィンドウを設定しました。FPSは1秒あたりのフレーム数で、60FPSに設定しています。


ステップ2: 色とキャラクター・ゲーム要素の設定

次に、キャラクターやオブジェクトの色を定義し、ゲーム内のキャラクター(マリオ、クリボー、ゴール)と障害物を設定します。

# カラー定義
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BROWN = (139, 69, 19)
GRAY = (169, 169, 169)
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)

# ゲーム状態
START_SCREEN = 0
PLAYING = 1
GAME_OVER = 2
GAME_CLEAR = 3
state = START_SCREEN

# ゲーム要素の初期化関数
def init_game():
    global mario, goomba, goomba_speed, game_over, game_clear, on_ground, mario_velocity_y
    mario = pygame.Rect(100, HEIGHT - 70, 40, 40)
    goomba = pygame.Rect(600, HEIGHT - 40, 40, 40)
    goomba_speed = 2
    game_over = False
    game_clear = False
    on_ground = True
    mario_velocity_y = 0

goomba_start_x = 500
goomba_end_x = 700

# 障害物設定
obstacles = [pygame.Rect(300, HEIGHT - 100, 50, 50), pygame.Rect(500, HEIGHT - 150, 50, 50)]

goal = pygame.Rect(750, HEIGHT - 150, 20, 150)
init_game()

ここでは、pygame.Rect()でキャラクターや障害物を矩形で設定しています。goomba(クリボー)は地面沿いに配置され、mariogoalの位置も指定しています。goomba_start_xgoomba_end_xは、クリボーが行ったり来たりする移動範囲を設定しています。

Pythonでのゲーム制作を学びたい人はこちらの書籍がおすすめです!

Amazon.co.jp: Pythonではじめるゲーム制作 超入門 知識ゼロからのプログラミング&アルゴリズムと数学 eBook : 廣瀬 豪: 本
Amazon.co.jp: Pythonではじめるゲーム制作 超入門 知識ゼロからのプログラミング&アルゴリズムと数学 eBook : 廣瀬 豪: 本

ステップ3: ゲームループの構築

メインのゲームループを作成し、キーボード操作でマリオが左右に移動できるようにします。

# メインループ
running = True
while running:
    window.fill(WHITE)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if state == START_SCREEN and event.key == pygame.K_RETURN:
                state = PLAYING
                init_game()
            elif (state == GAME_OVER or state == GAME_CLEAR) and event.key == pygame.K_RETURN:
                state = START_SCREEN

    if state == START_SCREEN:
        font = pygame.font.SysFont(None, 55)
        text = font.render("Press ENTER to Start", True, BLACK)
        window.blit(text, (WIDTH // 2 - 150, HEIGHT // 2))
    elif state == PLAYING:
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and mario.left > 0:
            mario.x -= 5
        if keys[pygame.K_RIGHT] and mario.right < WIDTH:
            mario.x += 5
        if keys[pygame.K_SPACE] and on_ground:
            mario_velocity_y = -15
            on_ground = False

        mario_velocity_y += 0.5
        mario.y += mario_velocity_y
        if mario.y >= HEIGHT - mario.height:
            mario.y = HEIGHT - mario.height
            on_ground = True
            mario_velocity_y = 0

        for obstacle in obstacles:
            pygame.draw.rect(window, BLACK, obstacle)
            if mario.colliderect(obstacle):
                if mario_velocity_y > 0:
                    mario.y = obstacle.top - mario.height
                    on_ground = True
                    mario_velocity_y = 0
                elif mario_velocity_y < 0:
                    mario.y = obstacle.bottom
                    mario_velocity_y = 0
                if mario.x < obstacle.left:
                    mario.x = obstacle.left - mario.width
                elif mario.x > obstacle.right:
                    mario.x = obstacle.right

ここでは、if keys[pygame.K_LEFT]で左矢印キーを押したときに左に移動し、if keys[pygame.K_SPACE]でスペースキーが押されるとジャンプします。また、重力を設定し、地面での跳ね返りも処理しています。

AIを使ってPythonのプログラムを簡単に生成したい方にオススメ!

ChatGPT活用塾
「起業家として成功したい」「フリーランスで稼ぎたい」「副業で稼ぎたい」そんな方々向けのChatGPT講座。eラーニング+コーチングであなたの業務を効率化させます。

ステップ4: クリボーの移動と衝突判定

クリボーが指定された範囲内を行ったり来たりするようにし、マリオと接触した際の処理を追加します。

        goomba.x += goomba_speed
        if goomba.x <= goomba_start_x or goomba.x >= goomba_end_x:
            goomba_speed = -goomba_speed

        if mario.colliderect(goomba):
            if mario_velocity_y > 0:
                goomba.x = -100
            else:
                state = GAME_OVER

ここでは、クリボーが範囲内を左右に移動し、マリオがジャンプ中にクリボーに触れるとクリボーを消し、地上で衝突した場合はgame_overTrueにしてゲームオーバーとします。


ステップ5: ゴールの判定

マリオがゴールに到達したときに、ステージクリアと表示する処理を追加します。

        if mario.colliderect(goal):
            state = GAME_CLEAR

ステップ6: キャラクターとメッセージの描画

各要素を描画し、クリアやゲームオーバーのメッセージを表示します。

        pygame.draw.rect(window, RED, mario)
        pygame.draw.rect(window, BROWN, goomba)
        pygame.draw.rect(window, GRAY, goal)
    elif state == GAME_OVER:
        font = pygame.font.SysFont(None, 55)
        text = font.render("Game Over! Press ENTER", True, RED)
        window.blit(text, (WIDTH // 2 - 150, HEIGHT // 2))
    elif state == GAME_CLEAR:
        font = pygame.font.SysFont(None, 55)
        text = font.render("Stage Clear! Press ENTER", True, GREEN)
        window.blit(text, (WIDTH // 2 - 150, HEIGHT // 2))

    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()
sys.exit()

ここで、pygame.draw.rectでキャラクターとオブジェクトを描画し、Game OverStage Clearのメッセージを表示しています。

Pythonでのゲーム制作を学びたい人はこちらの書籍がおすすめです!

Amazon.co.jp: Pythonではじめるゲーム制作 超入門 知識ゼロからのプログラミング&アルゴリズムと数学 eBook : 廣瀬 豪: 本
Amazon.co.jp: Pythonではじめるゲーム制作 超入門 知識ゼロからのプログラミング&アルゴリズムと数学 eBook : 廣瀬 豪: 本

コード全体

import pygame
import sys

# 初期化
pygame.init()

# ウィンドウサイズの設定
WIDTH, HEIGHT = 800, 400
window = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("スーパーマリオ")

# FPS設定
clock = pygame.time.Clock()
FPS = 60

# カラー定義
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BROWN = (139, 69, 19)
GRAY = (169, 169, 169)
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)

# ゲーム状態
START_SCREEN = 0
PLAYING = 1
GAME_OVER = 2
GAME_CLEAR = 3
state = START_SCREEN

# ゲーム要素の初期化関数
def init_game():
    global mario, goomba, goomba_speed, game_over, game_clear, on_ground, mario_velocity_y
    mario = pygame.Rect(100, HEIGHT - 70, 40, 40)
    goomba = pygame.Rect(600, HEIGHT - 40, 40, 40)
    goomba_speed = 2
    game_over = False
    game_clear = False
    on_ground = True
    mario_velocity_y = 0

goomba_start_x = 500
goomba_end_x = 700

# 障害物設定
obstacles = [pygame.Rect(300, HEIGHT - 100, 50, 50), pygame.Rect(500, HEIGHT - 150, 50, 50)]

goal = pygame.Rect(750, HEIGHT - 150, 20, 150)
init_game()

# メインループ
running = True
while running:
    window.fill(WHITE)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if state == START_SCREEN and event.key == pygame.K_RETURN:
                state = PLAYING
                init_game()
            elif (state == GAME_OVER or state == GAME_CLEAR) and event.key == pygame.K_RETURN:
                state = START_SCREEN

    if state == START_SCREEN:
        font = pygame.font.SysFont(None, 55)
        text = font.render("Press ENTER to Start", True, BLACK)
        window.blit(text, (WIDTH // 2 - 150, HEIGHT // 2))
    elif state == PLAYING:
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and mario.left > 0:
            mario.x -= 5
        if keys[pygame.K_RIGHT] and mario.right < WIDTH:
            mario.x += 5
        if keys[pygame.K_SPACE] and on_ground:
            mario_velocity_y = -15
            on_ground = False

        mario_velocity_y += 0.5
        mario.y += mario_velocity_y
        if mario.y >= HEIGHT - mario.height:
            mario.y = HEIGHT - mario.height
            on_ground = True
            mario_velocity_y = 0

        for obstacle in obstacles:
            pygame.draw.rect(window, BLACK, obstacle)
            if mario.colliderect(obstacle):
                if mario_velocity_y > 0:
                    mario.y = obstacle.top - mario.height
                    on_ground = True
                    mario_velocity_y = 0
                elif mario_velocity_y < 0:
                    mario.y = obstacle.bottom
                    mario_velocity_y = 0
                if mario.x < obstacle.left:
                    mario.x = obstacle.left - mario.width
                elif mario.x > obstacle.right:
                    mario.x = obstacle.right

        goomba.x += goomba_speed
        if goomba.x <= goomba_start_x or goomba.x >= goomba_end_x:
            goomba_speed = -goomba_speed

        if mario.colliderect(goomba):
            if mario_velocity_y > 0:
                goomba.x = -100
            else:
                state = GAME_OVER

        if mario.colliderect(goal):
            state = GAME_CLEAR

        pygame.draw.rect(window, RED, mario)
        pygame.draw.rect(window, BROWN, goomba)
        pygame.draw.rect(window, GRAY, goal)
    elif state == GAME_OVER:
        font = pygame.font.SysFont(None, 55)
        text = font.render("Game Over! Press ENTER", True, RED)
        window.blit(text, (WIDTH // 2 - 150, HEIGHT // 2))
    elif state == GAME_CLEAR:
        font = pygame.font.SysFont(None, 55)
        text = font.render("Stage Clear! Press ENTER", True, GREEN)
        window.blit(text, (WIDTH // 2 - 150, HEIGHT // 2))

    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()
sys.exit()

プレイ画面

以下のコマンドを実行して、実際に作ったゲームで遊んでみましょう。

python mario.py

ゲーム開始時の画面は以下の通り。

赤がマリオ、茶色がクリボー、黒が障害物、灰色の棒がゴールです。

クリボーをジャンプして踏むとやっつけられます。

クリボーに接触するとゲームオーバーになります

ゴールの棒まで辿り着くとゲームクリア!

プレイ動画

実際にプレイしてみた様子を動画に撮ってみました!ちゃんと動いていることがわかりますね。

まとめ

さて、このチュートリアルでは、pygameを使った横スクロール型の基本的なゲームを作成する方法を学びました。このコードを改良することで、さらに複雑なゲームに挑戦できます。

ところで、ここでここまで記事を読んでいただいた皆さんにお知らせしなければならないことがあります…

実は、このプログラム、ChatGPTに全て書いてもらっているのです。

ChatGPTを使えば、今までエンジニアが数時間掛けて書いていたコードを、ものの3分で作成してくれます。

これからエンジニアとして活躍したい方、文系からエンジニアを目指したい方は、ぜひChatGPTの活用方法を学んで、高度なIT人材になりましょう!

ChatGPTを使ってPythonでゲームを制作したい方は、こちらのAIスクールがおすすめです!

ChatGPT活用塾
「起業家として成功したい」「フリーランスで稼ぎたい」「副業で稼ぎたい」そんな方々向けのChatGPT講座。eラーニング+コーチングであなたの業務を効率化させます。

なお、当サイト限定の特典として、無料面談フォーム入力時に下記の招待コードを入力すると、受講料が20%OFFになります!!!

ChatGPT活用塾に入塾を検討されている方は、ぜひ、こちらの割引をご利用ください!!

招待コード:STAIT2025