↓ メインコンテンツへスキップ
  1. 第11講 PyGame を用いたソフトウェア開発(1/3)/

第11講 週次課題

課題11-1 指定された正方形に収まるように画像をスケールする
#

難易度 ⭐

fit_to_square 関数を作成してください。第1引数に画像(img)を受け取り、第2引数に長さ(len)を整数型で受け取ってください。 長さは与えられなければ、100が与えられたものとしてください。

関数の中では、img を len×lenの正方形に内接しつつ、縦横比を維持した画像に変換して返してください。 そして、スケール前後の画像を両方とも画面に表示してください。 ファイル名は fit_to_square.py としてください。

画像はコマンドライン引数の1つ目で、長さはコマンドライン引数の2つ目で指定してください。

import pygame as pg
import sys

def fit_to_square(...):
    (w, h) = # 元の画像の大きさを取得する。
    if w == 0 or h == 0 or length <= 0:
        return img
    scale =    # 倍率を求める。
    new_size = # 倍率をもとに変換後の画像サイズを求める。
    return pg.transform.scale(img, new_size)

# 1. ゲームの準備をする。
pg.init()
screen = pg.display.set_mode((800, 600))
orig = pg.image.load(sys.argv[1]) # 画像をロードする。
length = 100                      # スケール後の画像の大きさ
if len(sys.argv) == 3:            # 大きさがコマンドライン引数で指定されていれば
    length = int(sys.argv[2])     # その大きさを用いる。
img = fit_to_square(orig, length) # 指定の大きさにスケールした画像を得る。

# 2. メインループ
while True:
    # 2-1 画面を初期化する。
    screen.fill(pg.Color("WHITE"))

    # 2-3. 絵を描いたり、判定したりする。
    screen.blit(orig, (10, 10))  # 元の画像を描画する。
    screen.blit(img, (10 + orig.get_width() + 10, 10)) # 元の画像の横に変換後の画像を描画する。

    # 2-4. 画面を表示する。
    pg.display.update()

    # 2-5. 閉じるボタンが押されたら終了する。
    for event in pg.event.get():  # イベント一覧を取得して、各イベントを調べる。
        if event.type == pg.QUIT: # もし、閉じるボタンが押されたら。
            pg.quit()             # PyGame を終了する。これだけではウィンドウは閉じない。
            sys.exit()            # ウィンドウを閉じて、プログラムを終了する。

課題11-2 指定された長方形に収まるように画像をスケールする
#

難易度 ⭐⭐

fit_to_rect 関数を作成してください。第1引数に画像(img)を受け取り、第2引数に長方形の大きさをタプル(size)で受け取ってください。 長方形の大きさは与えられなければ、(100, 100) が与えられたものとしてください。

関数の中では、img を size の長方形に内接しつつ、縦横比を維持した画像に変換して返してください。 そして、スケール前後の画像を両方とも画面に表示してください。 ファイル名は fit_to_rect.py としてください。

画像はコマンドライン引数の1つ目で、長方形の幅、高さはコマンドライン引数の2つ目、3つ目で指定してください。

import pygame as pg
import sys

def fit_to_rect(...):
    (w, h) =                    # 元の画像の大きさを取得する。
    (size_width, size_height) = # 指定のスケールの大きさを取得する。
    if w == 0 or h == 0 or size_width <= 0 or size_height <= 0:
        return img
    scale =    # 倍率を求める。
    new_size = # 倍率をもとに変換後の画像サイズを求める。
    return pg.transform.scale(img, new_size)

# 1. ゲームの準備をする。
pg.init()
screen = pg.display.set_mode((800, 600))
orig = pg.image.load(sys.argv[1]) # 画像をロードする。
want_size = (100, 100)               # スケール後の画像の大きさ
if len(sys.argv) == 4:               # 大きさがコマンドライン引数で指定されていれば
    want_size = (int(sys.argv[2]), int(sys.argv[3])) # その大きさを用いる。
img = fit_to_rect(orig, want_size) # 指定の大きさにスケールした画像を得る。

# 2. メインループ
while True:
    # 2-1 画面を初期化する。
    screen.fill(pg.Color("WHITE"))

    # 2-3. 絵を描いたり、判定したりする。
    screen.blit(orig, (10, 10))  # 元の画像を描画する。
    screen.blit(img, (10 + orig.get_width() + 10, 10)) # 元の画像の横に変換後の画像を描画する。

    # 2-4. 画面を表示する。
    pg.display.update()

    # 2-5. 閉じるボタンが押されたら終了する。
    for event in pg.event.get():  # イベント一覧を取得して、各イベントを調べる。
        if event.type == pg.QUIT: # もし、閉じるボタンが押されたら。
            pg.quit()             # PyGame を終了する。これだけではウィンドウは閉じない。
            sys.exit()            # ウィンドウを閉じて、プログラムを終了する。

課題11-3 例題7の改良
#

難易度 ⭐⭐

例題7. キャラクタを動かすに対して、以下の改良を加えましょう。

  • h, j, k, l でも左、下、上、右に動かせるようにしよう。
  • シフトキーを押すと、早く動くようにしよう(5倍)。
  • 右マウスクリックした位置に即座に移動(ワープ)できるようにしよう。
発展課題 別のキャラクタを1人導入し、ランダムに動かしてみましょう。 ただし、導入したキャラクタと操作キャラクタは互いに重ならないようにしましょう。 加えて、導入したキャラクタも画面外に移動しないようにしましょう。