| ソフトエンジニアリングコース | クラスリンク |
|---|---|
| 課題要件 | 課題リンク |
| 課題目標 | Pythonで「羊了个羊」ゲームを開発する |
| 学籍番号 | 102201312 |
- 「球了个球」の概要 ==========
注:プロジェクトはGitHub上でオープンソースとして公開されています。GitHubリンクをご確認ください。
(1)ゲームの背景
大三に入って体育授業が廃止され、学業がますます忙しくなりました。そのため、運動を楽しむ時間を取りづらくなっています。つまり「1日に1時間運動すれば、健康に長く働け、幸せな人生を送れる」という考えに基づき、このゲームは運動への情熱を喚起することを目的としています。
(2)ゲームルール
-
ゲームには3つのレベルがあり、プレイヤーは画像を選択し、3つ同じ画像を揃えると消去されます。すべての画像を消すことができれば次のレベルに進むことができます。選択数が7つを超えるとゲームオーバーになります。
-
各レベルの難易度は指数関数的に増加し、スコアもそれに応じて上昇します。レベル1では3つ揃えると1ポイント、レベル2では2ポイント、レベル3では3ポイント獲得できます。
(3)実装機能
- メインメニュー、4つのボタンによるインタラクティブ操作。
- 3つの難易度モード、プレイヤーに多様な挑戦体験を提供。
- スコア獲得メカニズム、プレイヤーの励みになります。
- ランキングシステム、競争心を刺激します。
- マウスをタイル上に移動するとサウンド効果が再生されます。
- 実装プロセス ==========
開発環境:vscode
AIGCツール:Github Copilot + ChatGPT
AI画像生成:Copilot.Microsoft
無料商用アイコンソース:(icons8.com)
-
ゲーム画面と流れ =========
-
ゲームメイン画面
- ゲームの3つのレベル
難易度は指数関数的に上昇
- ゲームクリア画面
- ゲームオーバー画面
- ランキング画面
降順で並び替え
- ゲームに使用されたアイコン一覧
- ゲームテスト結果 ========
レベル1
レベル2
-
コアアルゴリズムと実装方法 =============
-
主なロジック
ゲームの状態をgame_stateで管理することで、メインメニューと他の画面間の切り替えがスムーズに行えました。
- 3つのレベルのアルゴリズム
①レベル1
Github Copilotに質問したところ、簡単なアルゴリズムが生成されました。以下はそのコードと解説です。
# レベル1:1層のみ、重ねがない
def initialize_tiles_level1():
global tiles
tiles = []
ts = list(range(1, 13)) * 3 # 必要数だけカードを減らす
random.shuffle(ts)
n = 0
rows = 6 # 行数
cols = 6 # 列数
# 1枚の平面にカードを配置
for i in range(rows):
for j in range(cols):
if n >= len(ts):
break
t = ts[n]
n += 1
tile_img = pygame.image.load(f'images/tile{t}.png')
tile = {
'image': tile_img,
'rect': tile_img.get_rect(), # 衝突判定用の位置
'tag': t, # カードの識別番号1〜12
'layer': 0, # 層なし
'status': 1 # 全てのカードがクリック可能
}
tile['rect'].topleft = (100 + j * tile_img.get_width(),
100 + i * tile_img.get_height() * 0.9)
tiles.append(tile)
②レベル2
# レベル2:ピラミッド構造
def initialize_tiles_level2():
global tiles
tiles = []
ts = list(range(1, 13)) * 12
random.shuffle(ts)
n = 0
for k in range(7): # 7段階
for i in range(7 - k): # 行
for j in range(7 - k): # 列
t = ts[n]
n += 1
tile_img = pygame.image.load(f'images/tile{t}.png')
tile = {
'image': tile_img,
'rect': tile_img.get_rect(), # 衝突判定用の位置
'tag': t, # カードの識別番号1〜12
'layer': k, # 層番号
'status': 1 if k == 6 else 0 # 最上層のみクリック可能
}
tile['rect'].topleft = (120 + (k * 0.5 + j) * tile_img.get_width(),
100 + (k * 0.5 + i) * tile_img.get_height() * 0.9)
tiles.append(tile)
# 残りの4枚を下に配置
for i in range(4):
t = ts[n]
n += 1
tile_img = pygame.image.load(f'images/tile{t}.png')
tile = {
'image': tile_img,
'rect': tile_img.get_rect(topleft=(210 + i * tile_img.get_width(), 516)),
'tag': t,
'layer': 0,
'status': 1
}
tiles.append(tile)
③レベル3
前2つの配置を元に、Github Copilotにより複雑なアルゴリズムを生成してもらいました。(自分でもクリアできないほど)
# レベル3:より複雑な配置と多くの層
def initialize_tiles_level3():
global tiles
tiles = []
# 必要なカード総数を計算
total_tiles_needed = sum((9 - k) ** 2 for k in range(9)) + 6 # 各層と下部の個別カード
ts = list(range(1, 13)) * ((total_tiles_needed // 12) + 1) # 必要数だけカードを繰り返す
random.shuffle(ts)
n = 0
layer_offsets = [0, 0.5, 1.0] # 各層のずれを調整して複雑な配置を作る
y_offset = -30 # 上に50ピクセル移動
x_offset = -80 # 左に30ピクセル移動
# 9層の複雑な配置、各層のカード数は異なる
for k in range(9): # 9層
offset = layer_offsets[k % len(layer_offsets)] # ずれを使用
rows = 9 - k # 行数は層によって減る
cols = 9 - k # 列数も層によって減る
for i in range(rows): # 行
for j in range(cols): # 列
if n >= total_tiles_needed:
break
t = ts[n]
n += 1
tile_img = pygame.image.load(f'images/tile{t}.png')
tile = {
'image': tile_img,
'rect': tile_img.get_rect(), # 衝突判定用の位置
'tag': t, # カードの識別番号1〜12
'layer': k, # 層番号
'status': 1 if k == 8 else 0 # 最上層のみクリック可能
}
# タイルのX/Y座標を左と上にずらす
tile['rect'].topleft = (120 + (offset + j) * tile_img.get_width() + x_offset,
50 + (offset + i) * tile_img.get_height() * 0.9 + y_offset)
tiles.append(tile)
# 下部にランダムな個別カードを配置
for i in range(6):
t = ts[n]
n += 1
tile_img = pygame.image.load(f'images/tile{t}.png')
tile = {
'image': tile_img,
'rect': tile_img.get_rect(topleft=(random.randint(100, 500) + x_offset, random.randint(500, 600) + y_offset)),
'tag': t,
'layer': 0,
'status': 1
}
tiles.append(tile)
- AIGCによる学習内容と体験談 ==================
AI補助
| サブタスク | AIGC技術 | 実現機能 | 効果 |
|---|---|---|---|
| インターフェース設計 | Copilot | コード参考、基本的な構造 | シンプルな基盤を提供し、後で改善しやすいが、小さなバグも見られる |
| ボタン設計 | Copilot | コード参考、基本的な構造 | pygameのボタン設計関数を提供し、調整することで動作可能 |
| 機能参考 | ChatGPT | コード参考、基本的な構造 | 画像の消去などに関する設計案を提供。高度なカスタマイズにはさらに調整が必要 |
| 素材参考 | icons8 | 無料画像素材提供 | いくつかのサイトを紹介し、参考になる |
| 画像生成 | Copilot | テキストから画像生成 | 一部は使用可能だが、調整が必要 |
AI生成テーブル
| 項目 | 内容 |
|---|---|
| 課題タイトル | 「羊了个羊」ゲームの開発 |
| 背景 | 学生たちの運動時間の減少、運動への情熱を呼び起こす必要性 |
| 主な収穫 | 1. Pygameでのゲームインターフェース設計の習得。 2. 画像の生成と消去ロジックの理解。 3. AIGCツールによるコード生成技術の習得。 |
| 課題 | 1. 画像の適切なマッチングと消去ロジックの実装。 2. タイマー機構と難易度調整。 3. コードの構造化と保守性の確保。 |
| 改善提案 | 1. 画像消去アルゴリズムの強化によりゲーム体験向上。2. クリック時のエフェクト追加。 3. インターフェースデザインの改善。 |
- PSPテーブル:タスク分割と時間管理 =================
| タスク | 説明 | 予想時間 (時間) | 実際時間 (時間) | 差分 (時間) | 備考 |
|---|---|---|---|---|---|
| 計画と要件分析 | プロジェクトの開発期間を推定し、全体計画を立てる | 1 | 2 | +1 | |
| ゲームインターフェース設計 | Pygameなどを用いて、メインメニュー、ゲーム画面、終了画面を設計 | 5 | 7 | +2 | インターフェースは簡潔で軽快だが、追加機能が望まれる |
| 画像の生成と配置 | 画像の生成と層ごとの配置ロジックを実装 | 3 | 2 | -1 | 画像生成は期待通りで適切 |
| 画像選択と消去ロジック | プレイヤーが画像を選択し消去するロジックを実装 | 4 | 2 | -2 | 消去ロジックは正常に実装され、機能が動作 |
| ランキング機能 | スコアとランキング機能を設定。ゲームオーバー時に上位10位に記録 | 2 | 1 | -1 | ランキング機能は比較的容易に実装 |
| 難易度設定 | 画像の配置順序をランダム化またはレベル分けで難易度を調整 | 3 | 2.5 | -0.5 | 難易度設定は良好だが、レベル設計は改善余地あり |
| AIGCツールによるコード生成 | OpenAIなどのツールを使って一部のコードを生成 | 2 | 3 | +1 | コード生成は正確でコメントも明確。しかし人間による修正が必要 |
| コードテストとデバッグ | ゲーム機能のテストとバグ修正 | 5 | 7 | +2 | テスト中にいくつかの予期せぬバグが見つかり、修正済み |
| ドキュメント作成とコメント | コードコメントとプロジェクト文書の作成 | 2 | 3 | +1 | 文書作成はスムーズに行われ、コメントも充実 |
| **合計時間** | **27** | **29.5** |
- プロジェクト総括 =======
今回のプロジェクトを通して、Pygameを活用してゲームをゼロから開発する方法を学びました。特に、インターフェースのレイアウト、サウンド効果、ロジック処理において大きな成長がありました。細部の設計(例えば、クリック時のフィードバックや音効果の適用)がゲーム体験に与える影響を深く理解しました。また、PSP表の管理を通じて、時間管理とプロジェクト構成能力も向上しました。
ただし、時間的制約によりいくつかの機能が未実装であり、今後の改善を期待しています。