はじめに
マリオのような横スクロール型のゲームは、Pythonでゲームプログラミングを学ぶ初心者の方に最適です。このプロジェクトでは、pygame
ライブラリを使ってシンプルな横スクロール型のアクションゲームを作成し、基本的なプログラミングの概念である関数、ループ、条件分岐を活用していきます。プレイヤーはキャラクターを左右に移動させ、ジャンプして障害物や敵を避けながらゴールを目指します。
このゲームを通じて、Pythonの基礎をしっかりと身につけながら、実際のゲーム開発で必要なテクニックも学べるでしょう!
Pythonで制作できるゲーム一覧はこちらの記事で確認できます!
必要な機能
このプロジェクトでは、以下の機能を順番に実装します。
- ゲームウィンドウの設定
pygame
を使用して、ゲームが表示されるウィンドウを作成し、キャラクターの移動やゲーム進行ができるように設定します。
- キャラクターの移動とジャンプ
- プレイヤーがキーボードを使ってキャラクターを左右に動かしたり、ジャンプしたりする機能を作成します。
- 敵キャラクターの移動
- 敵キャラクター(クリボー)を設定し、一定の範囲で行ったり来たりする動きを実装します。
- 衝突と勝敗判定
- キャラクターが敵と衝突したり、ゴールに到達したりした際に、ゲームオーバーやクリアを判定する機能を実装します。
- 障害物と地形の配置
- 障害物を配置し、プレイヤーがジャンプして回避できるようにすることで、ゲームにアクション要素を追加します。
これから、各機能を順を追って構築し、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
(クリボー)は地面沿いに配置され、mario
やgoal
の位置も指定しています。goomba_start_x
とgoomba_end_x
は、クリボーが行ったり来たりする移動範囲を設定しています。
Pythonでのゲーム制作を学びたい人はこちらの書籍がおすすめです!
ステップ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のプログラムを簡単に生成したい方にオススメ!
ステップ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_over
をTrue
にしてゲームオーバーとします。
ステップ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 Over
やStage Clear
のメッセージを表示しています。
Pythonでのゲーム制作を学びたい人はこちらの書籍がおすすめです!
コード全体
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スクールがおすすめです!
なお、当サイト限定の特典として、無料面談フォーム入力時に下記の招待コードを入力すると、受講料が20%OFFになります!!!
ChatGPT活用塾に入塾を検討されている方は、ぜひ、こちらの割引をご利用ください!!
招待コード:STAIT2025