【pygame|Extra4】ナインゲームを作ろう

ながみえ

【Pygame入門編】
Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
Chapter3:簡単なアクションゲームを作ろう

【Pygame実践編】
Extra1:ブロック崩しを作ろう
Extra2:シューティングゲームを作ろう
Extra3:オセロ(リバーシ)を作ろう
Extra4:ナインゲームを作ろう ◁今回はここ
Extra5:横スクロールのアクションゲームを作ろう

本記事では、ナインゲームのサンプルコードを公開します。

これまでのチャプターで学んだpygameの知識を活かし、本格的なゲーム制作に挑戦できる内容です。

なお、ゲームコードの詳しいコードの解説は、記事内では行いません。

コード内に各処理のポイントをコメントとして詳しく記載していますので、そちらを参考に読み進めてください。

あなたの手でさらに拡張していける内容となっていますので、サンプルを気に入った方はぜひフルバージョンのご購入もご検討ください!

<<前のページ

pygameの記事一覧

Pythonのゲームライブラリ pygame を使ってゲームアプリを制作するページのアイキャッチ画像

次のページ>>

ナインゲームの概要

ナインゲームは、シンプルながら駆け引きが光る対戦型カードゲームです。

プレイヤーとコンピュータがそれぞれ 1〜9の牌(数牌)を1枚ずつ出し合い、数字の大きい方がそのラウンドの勝者となり、出した牌の数だけ得点を獲得していくゲームです。

全9ラウンドを戦い、合計点が高い方が最終勝者です。同じ数字を出した場合は引き分けとなり、得点は入りません。

ゲームの進行は非常に直感的で、プレイヤーは自分の牌をクリックするだけ。選んだ牌は灰色で表示され、再び使うことはできません。

ラウンド終了後には勝敗メッセージが表示され、9戦目が終わると結果画面に移行します。

ナインゲームは、運と読み合いが交錯する軽快な心理戦。

短時間でサクッと楽しめる構成ながら、思わず何度もプレイしたくなる、リプレイ性の高さが魅力です。

ナインゲームのファイル構成

ナインゲームのファイル構成は以下のようになっています。

NineGame/
├── main.py                  # ゲーム全体の起動・制御(メインループ)
│
├── nekolib/				 # NineGame用ライブラリ群
│   ├── __init__.py         # パッケージの初期化用 空ファイル
│   ├── config.py           # 各種定数・画像読み込みなどの設定
│   ├── draw.py				# 牌や文字の描画関数
│   ├── logic.py            # ゲームの進行ロジック(勝敗判定など)
│   ├── player.py           # プレイヤー/コンピュータの管理
│   ├── utils.py            # 汎用関数(パス管理など)
│
└── image/                   # 各種画像素材(png等)格納ディレクトリ

各チャプターの学習記事では全てを1つのコード内に書いてきましたが、こちらはPythonのオブジェクト指向を活用し、役割毎に分けています。

こうすることにより各コードの内容が分かりやすくなり、また修正する際にもポイントを探しやすくなっています。

この中の一つ、「draw.py」のコードを先に公開します。

正規版の各コードにどのような解説コメントが書かれているかをご確認下さい。

Q
サンプルコード:draw.py

draw.pyは、NineGame内で使われる画像や文字を表示する関数まとめたファイルです。

# ==============================================
# draw.py
# ----------------------------------------------
# 画面上の「描画」に関する関数をまとめたファイル。
# テキストや牌(画像・数字)を画面に表示する処理を担当します。
# 
# このファイルの関数を使うことで、main.py から
# 簡単に文字や牌を描画できるようになります。
# ==============================================

import pygame
import nine_lib.config as config

# === テキストを横方向に中央寄せして表示する関数 ===
def draw_text_center(screen, text, center_x, y, color=None, font_obj=None):
    if color is None:       # 色が指定されていない場合
        color = config.WHITE
    if font_obj is None:    # フォントが指定されていない場合
        font_obj = config.font or pygame.font.SysFont(None, 40)

    t = font_obj.render(text, True, color)  # テキストを画像として描画可能なSurfaceに変換
    rect = t.get_rect(center=(center_x, y)) # テキストの中央が(center_x, y)になるように位置を計算
    screen.blit(t, rect)                    # 計算した位置にテキストを画面へ貼り付け(表示)

# === テキストを影付き(シャドウ効果あり)で表示する関数 ===
def draw_shadow_text(screen, text, x, y, color, shadow_color=(0, 0, 0), offset=2, font_obj=None):
    if font_obj is None:# フォントが指定されていない場合は、configで定義された標準フォントを使用
        font_obj = config.font

    shadow = font_obj.render(text, True, shadow_color)  # まず影(黒など)で文字を描画(まだ画面には出さない)
    main = font_obj.render(text, True, color)           # 次に本体の文字を描画(メインカラー)
    rect = main.get_rect(center=(x, y))                 # メイン文字の位置(中央揃え)を計算
    shadow_rect = rect.copy()                           # 同じ位置情報をコピーして、影用に少しずらす
    shadow_rect.x += offset                             # 横方向に影をずらす(右にずらす)
    shadow_rect.y += offset                             # 縦方向に影をずらす(下にずらす)
    screen.blit(shadow, shadow_rect)                    # まず影を先に描画(背景層)
    screen.blit(main, rect)                             # その上に本体の文字を重ねて描画(前面層)

# === 牌を指定された位置に描画する関数 ===
def draw_tiles(screen, tiles, y, tile_type, selectable=True):
    start_x = 160                       # 1枚目の牌を表示する横位置(左端の起点)
    spacing = 70                        # 牌と牌の間の間隔(ピクセル単位)
    tile_images = config.tile_images    # 現在読み込まれている牌の画像データを取得

    # --- ここから牌を一枚ずつ描写 ---
    for i, tile in enumerate(tiles):        # 手札の牌を1枚ずつ取り出して順に処理
        x = start_x + i * spacing           # 横位置を計算して並べる(左から順に少しずつ右へ)
        rect = pygame.Rect(x, y, 60, 80)    # 各牌の位置とサイズを矩形(Rect)で定義

        # 使用済み牌を灰色のブロックで描画
        if tile == -1:                                          # -1 は「使用済みの牌」を表す特別な値
            surf = pygame.Surface((60, 80), pygame.SRCALPHA)    # 透明度を扱えるSurfaceを作成
            surf.fill((50, 50, 50, 150))                        # 灰色+少し透けるように塗る
            screen.blit(surf, rect.topleft)                     # 指定位置に貼り付け
            continue                                            # 残りの処理はスキップして次の牌へ

        # 牌を描写
        img = tile_images.get(tile_type, {}).get(tile)  # 指定された種類(萬子 or 筒子)の画像を取得
        screen.blit(img, rect.topleft)                  # その画像を画面に描画

# === ボタンを描画する関 ===
def draw_button(screen, rect, text, color, font_obj=None, text_color=None, border_radius=12):
    if font_obj is None:
        font_obj = config.small_font    # フォントが指定されていない場合は小フォントを使用
    if text_color is None:
        text_color = config.BLACK       # デフォルトの文字色
    # ボタンの本体を描画
    pygame.draw.rect(screen, color, rect, border_radius=border_radius)
    # ボタン中央にテキストを描画
    draw_text_center(screen, text, rect.centerx, rect.centery, text_color, font_obj)

ゲームコードのダウンロードはこちら

こちらから、ナインゲームの全コードをダウンロードできます。

ダウンロードファイルにはソースコード一式と画像一式、そして詳しい解説コメントが含まれています。

ここからは有料記事です。どこよりも安いこの教材を、是非ご利用下さい^^

PDF等でダウンロードする場合は こちら から購入(会員登録不要)。
このサイト内で読み進める場合は↓↓から会員登録してください。

ここから先は限定公開です

すでに購入済みの方はこちら

購読には会員登録が必要です

「半角英数字」と「大文字1個以上」を含む、8文字以上

会員登録には 利用規約/特定商取引法に基づく表記 への同意が必要です。

すでに会員の方はこちら

ログインして記事を読む

メールアドレス
パスワード
パスワードを忘れた方
新規会員登録はこちら

パスワード再設定

パスワードを再設定します。入力したメールアドレスに再設定用のURLをお送りしますので、パスワードの再設定を行なってください。
キャンセル
記事URLをコピーしました