Python による簡単なアドベンチャーゲーム(変数,式,if,while,関数,print,time.sleep,def,global を使用)
本プログラムは,Python によるテキストベースのアドベンチャーゲームである.変数,式,条件分岐(if 文),繰り返し(while 文),関数定義(def 文),標準出力(print 関数),待機処理(time.sleep 関数),グローバル変数の参照と変更(global 文)をゲームプログラムの中で習得することを目的とする.
プレイヤーは名前,HP(体力),MP(魔力)を持つキャラクターを操作し,ダンジョン,魔王城,冒険者ギルドの 3 か所でイベントを体験する.プログラムは単一の .py ファイルで完結しており,Python 標準ライブラリのみを使用するため,追加パッケージのインストールは不要である.
【目次】
Python 基礎
| 要素 | プログラム内での用途 |
|---|---|
| 変数 | hp,mp,place,name によるゲーム状態の保持 |
| 式 | hp = hp - 50,mp = mp - 10 における右辺の式によるパラメータ更新値の計算 |
| if 文 | プレイヤーの選択および MP 残量に応じた処理の分岐 |
| while 文 | メインループ(無限ループ)の実現 |
| def 文 | dungeon(),castle(),guild() の関数定義 |
| print 関数 | ナレーションおよびステータスの出力 |
| input 関数 | プレイヤーの名前および選択肢の入力受付 |
| time.sleep 関数 | テキスト表示間の待機 |
| global 文 | 関数内からグローバル変数(hp,mp,place)の値を変更 |
Python の実行環境を整える
本章では、Python のプログラムを作成して実行する環境を整える。扱う環境は、Windows 搭載パソコンまたは Google Colab(Google が提供する、Web ブラウザ上で Python を実行できる環境。以下、Colab)のいずれかである。どちらを使用するかは、各自で判断する。
Windows では、実行環境として、まず、Python のインストールが必要である。金子研究室では、Python 3.12.10 を推奨する。Windows では、Visual Studio Code(プログラムを編集するソフトウェア。以下、VS Code)を推奨する。Colab は、実行環境が整っており、そのための特別な操作は必要ない。Web ブラウザから利用でき、Google アカウントがあれば使用できる。
[Windows で実行環境を整える手順を見るには、ここをクリック]
Windows での Python 3.12 のインストール
以下のいずれかの方法で Python 3.12 をインストールする.Python がインストール済みの場合,この手順は不要である.
方法 1:winget によるインストール
【インストールコマンドの実行方法】
管理者権限でコマンドプロンプトを起動する(手順:Windows キーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして,コマンド全体をコマンドプロンプトにコピー&ペーストする。
--scope machine を指定することで,システム全体(全ユーザー向け)にインストールされる.このオプションの実行には管理者権限が必要である.インストール完了後,コマンドプロンプトを再起動すると PATH が自動的に設定される.
REM Python 3.12 をシステム領域にインストール
winget install --id Python.Python.3.12 -e --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
REM Python と Scripts を PATH 先頭に追加
powershell -NoProfile -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; $c=[Environment]::GetEnvironmentVariable('Path','Machine'); if((Test-Path $p) -and (';'+$c+';' -notlike \"*;$p;*\") -and (';'+$c+';' -notlike \"*;$s;*\")){[Environment]::SetEnvironmentVariable('Path',\"$p;$s;$c\",'Machine')}"
方法 2:インストーラーによるインストール
- Python 公式サイト(https://www.python.org/downloads/)にアクセスし,「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする.
- ダウンロードしたインストーラーを実行する.
- 初期画面の下部に表示される「Add python.exe to PATH」に必ずチェックを入れてから「Customize installation」を選択する.このチェックを入れ忘れると,コマンドプロンプトから
pythonコマンドを実行できない. - 「Install Python 3.xx for all users」にチェックを入れ,「Install」をクリックする.
インストールの確認
コマンドプロンプトで以下を実行する.
python --version
バージョン番号(例:Python 3.12.x)が表示されればインストール成功である.「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は,インストールが正常に完了していない.
Windows での Visual Studio Code のインストール、設定
1. VS Code と拡張機能のインストール
以下のコマンドにより,既存の VS Code を削除し,全ユーザー共有の設定で再インストールしたうえで,拡張機能(VS Code に機能を追加するソフトウェア)をまとめて導入する.
【インストールコマンドの実行方法】
管理者権限でコマンドプロンプトを起動する(手順:Windows キーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして,コマンド全体をコマンドプロンプトにコピー&ペーストする。
インストールコマンド
REM ============================================================
REM Microsoft Visual Studio Code
REM ============================================================
winget uninstall -e --id Microsoft.VisualStudioCode --silent --disable-interactivity --accept-source-agreements
rmdir /s /q C:\ProgramData\vscode-extensions 2>nul
rmdir /s /q "%APPDATA%\Code" 2>nul
rmdir /s /q "%USERPROFILE%\.vscode" 2>nul
rmdir /s /q "%LOCALAPPDATA%\Microsoft\vscode-update" 2>nul
REM VS Code をシステム領域に新規インストール
winget install --scope machine --id Microsoft.VisualStudioCode -e --silent --accept-source-agreements --accept-package-agreements
REM 全ユーザー共有の拡張機能フォルダ
mkdir C:\ProgramData\vscode-extensions 2>nul
icacls "C:\ProgramData\vscode-extensions" /grant "Everyone:(OI)(CI)M" /T
REM スタートメニューのショートカットを --extensions-dir 付きで再作成
rmdir /s /q "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code" 2>nul
del "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk" 2>nul
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); $lnk.TargetPath='C:\Program Files\Microsoft VS Code\Code.exe'; $lnk.Arguments='--extensions-dir \"C:\ProgramData\vscode-extensions\"'; $lnk.Save()"
REM ショートカットの検証
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); Write-Host 'TargetPath:' $lnk.TargetPath; Write-Host 'Arguments:' $lnk.Arguments"
REM ファイル / フォルダ右クリックの「Code で開く」を登録
reg add "HKLM\SOFTWARE\Classes\*\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\Background\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%V\"" /f
REM --extensions-dir 付きで起動する code.cmd ラッパを作成
REM (%* を echo で書くと対話的 cmd で失われるため、PowerShell で [char]37+'*' を書き出す)
powershell -NoProfile -Command "$pct=[char]37; $q=[char]34; $c='@echo off'+[char]13+[char]10+$q+'C:\Program Files\Microsoft VS Code\bin\code.cmd'+$q+' --extensions-dir '+$q+'C:\ProgramData\vscode-extensions'+$q+' '+$pct+'*'+[char]13+[char]10; [IO.File]::WriteAllText('C:\ProgramData\vscode-extensions\vscode.cmd',$c,[Text.Encoding]::ASCII)"
REM 拡張機能のインストール
set "CODE=C:\Program Files\Microsoft VS Code\bin\code.cmd"
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot-chat
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.python
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.vscode-pylance
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.debugpy
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension MS-CEINTL.vscode-language-pack-ja
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension saoudrizwan.claude-dev
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension rust-lang.rust-analyzer
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension tamasfe.even-better-toml
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension anthropic.claude-code
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension almenon.arepl
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --list-extensions --show-versions
echo === セットアップ完了 ===
2. Python インタプリタの選択
同一マシンに複数の Python がインストールされている場合,VS Code で使用する Python 本体(インタプリタ:Python プログラムを解釈・実行するソフトウェア)を選択する必要がある.
- コマンドパレット(コマンド名で機能を呼び出す VS Code の入力欄)を開く(
Ctrl+Shift+P) Python: Select Interpreterと入力する
- 表示される一覧から,使用する Python(例:
C:\Program Files\Python312\python.exe)を選択する.
以降の章では、必要に応じて題材に応じた必要なソフトウェアを追加する。
プログラム実行手順
[Windows、Colab でのプログラム実行手順を見るには、ここをクリック]
Windows での実行手順(Visual Studio Code)
本節では,Python プログラムを Visual Studio Code で実行する手順を示す.Colab で実行する場合は本節を読み飛ばし,次節「Colab での実行手順」に進む.
プログラムファイルの作成と保存
- 左サイドバーの「エクスプローラー」アイコン(
Ctrl+Shift+E)をクリックする
- 「NO FOLDER OPENED」(作業対象フォルダが未選択の状態)と表示される場合は,「Open Folder」をクリックし,プログラムを保存するフォルダを選択する
続いて「フォルダを信用するか」を確認する画面(フォルダ内のコードを実行してよいか確認する VS Code の仕組み)が表示されるので,チェックして Yes を選択する
- フォルダ名の右側に表示される「新しいファイル」アイコンをクリックする
- ファイル名(例:
aitask.py.ファイル名は何でも良い)を入力しEnterを押す.拡張子は.py(Python ファイルを示す拡張子)とする
- 実行したいコードを選択し,
Ctrl+Cでコピーする.VS Code のエディタ領域にCtrl+Vで貼り付ける Ctrl+Sで保存する
プログラムの実行
- エディタ右上の三角形「▷」アイコン(Run Python File:現在開いている Python ファイルを実行するボタン)をクリックする.または,エディタ上で右クリックし「ターミナルで Python ファイルを実行」を選択する
- VS Code 下部のターミナル(コマンドの入出力を表示する画面)に,実行結果(
print関数の出力等)が表示される
- tkinter(Python 標準の GUI ライブラリ)のファイル選択ダイアログを使うプログラムを実行した場合は,ダイアログが開くので対象画像を選択する
- VS Code 下部のターミナルで実行結果を確認する.OpenCV ウィンドウ(OpenCV が画像を表示するために開く専用ウィンドウ)が開いた場合はそちらも確認する.OpenCV ウィンドウは,マウスクリックでウィンドウをアクティブ(操作対象の状態)にしてからキーを押すと終了する
Colab での実行手順
本節では,各タスクのプログラムを Colab で実行する手順を示す.Colab は,ブラウザ上で Python を実行できる Google のサービスである.
Colab でのプログラム実行
- 新しいセルを追加し,本資料の該当タスクのコードを貼り付けて実行する
- 実行中にファイルアップロードを促すボタンが表示された場合は,処理対象の画像・音声ファイルをローカルマシンから選択してアップロードする
- 結果はセルの直下に表示される(画像はインライン表示,テキスト出力は
print関数の出力としてセル出力欄に表示される)
Python プログラムの構造
本教材の位置付けと簡略化について
本プログラムは,Python の基本構文の例示を優先しており,以下の簡略化を行っている.
- 魔王城・冒険者ギルドには戦闘などのイベントは用意されておらず,短いメッセージ表示後に場所選択画面に戻る.
- 火炎トカゲを倒した後でも,再度ダンジョンに入れば同じ火炎トカゲと再遭遇する.
- HP が 0 以下になってもゲームオーバーにはならず,プログラムは継続する.
- プレイヤー名
nameは入力のみ行い,メッセージ中には表示しない(input関数の使用例として残してある). - HP の初期値は 100,MP の初期値は 30 であり,回復処理は用意していない.
これらは「演習」節での拡張課題として残している.
使い方
プログラムを実行すると,導入メッセージ(魔法世界にワープしたこと,および 3 つの扉の説明)が表示され,名前の入力が求められる.名前を入力すると,現在の HP・MP が表示され,3 つの場所(ダンジョン,魔王城,冒険者ギルド)から行き先を数字(1,2,3)で選択する.各場所の内容は次のとおりである.
ダンジョン:火炎トカゲと遭遇し,物理攻撃,魔法攻撃(MP 10 消費),逃げるの 3 択が提示される.物理攻撃を選択した場合(火炎トカゲには物理攻撃が効かず,反撃を受けて),および魔法攻撃を選択したが MP が不足している場合は,HP が 50 減少する.魔法攻撃に成功した場合は火炎トカゲを倒す.逃げるを選択した場合のみ場所の選択に戻り,それ以外の選択肢ではダンジョンのイベントが繰り返される.
魔王城:「しかし,魔王城には何もなかった.」というメッセージが表示され,場所の選択に戻る.
冒険者ギルド:「しかし,冒険者ギルドには何もなかった.」というメッセージが表示され,場所の選択に戻る.
イベント終了後,現在の HP・MP が表示され,再び場所の選択(または同じ場所のイベント)に進む.
変数,式,if,while,関数,print,time.sleep,def,global との関連
HP・MP・場所などの状態は変数(hp,mp,place)で保持し,減算式(hp - 50)で更新する.while でゲーム全体を繰り返し,if で選択肢ごとに分岐する.各場所の処理は def による関数に分割し,関数内から外側の変数を変更するため global を宣言する.print でメッセージを表示し,time.sleep で表示間に待機を入れる.
プログラムの実行時の留意事項
実行上の注意
プログラムの終了方法:メインループは無限ループ(while True:)として実装されているため,通常の操作では終了しない.Windows のコマンドプロンプト(またはターミナル)で実行している場合は Ctrl + C を入力して中断する.Colab で実行している場合は,セル左の停止ボタン(四角アイコン)でセルの実行を中断する.Ctrl + C を入力すると,Python は KeyboardInterrupt という例外(プログラム実行中に発生する特別な事象)を発生させてプログラムを中断する.
HP がゼロ以下になった場合の動作:ゲームオーバー処理は実装されていない.HP が負の値になってもプログラムは継続する.
入力値の検証:場所の選択,およびダンジョン内の選択において,選択肢以外の文字列を入力した場合,「無効な選択肢です.再度選択してください.」と表示された後,メインループの先頭に戻り,HP・MP が再表示される.このとき place の値は変化しないため,ダンジョン内で無効な入力をした場合は再びダンジョンのイベントから始まる.
文字コード:ソースファイルの文字コードを UTF-8 以外に設定すると,日本語が正常に表示されない場合がある.
動作確認チェックリスト
| 確認項目 | 期待される結果 |
|---|---|
| プログラム起動時 | 導入メッセージが表示された後,名前の入力が求められる |
| 名前入力後 | HP・MP が表示され,場所の選択肢が提示される |
| 場所選択で 1〜3 を入力 | 対応する場所のイベントが開始される |
| 場所選択で無効な入力 | 「無効な選択肢です.再度選択してください.」と表示され,HP・MP の再表示後に場所の選択肢が再提示される |
| ダンジョンで「3(逃げる)」を入力 | 場所の選択に戻る |
| ダンジョンで「1(物理攻撃)」を入力 | HP が 50 減少し,再びダンジョンのイベントから始まる |
| ダンジョンで「2(魔法攻撃)」を入力(MP 10 以上) | MP が 10 減少し,火炎トカゲを倒したメッセージが表示された後,再びダンジョンのイベントから始まる |
| ダンジョンで「2(魔法攻撃)」を入力(MP 10 未満) | HP が 50 減少し,再びダンジョンのイベントから始まる |
| ダンジョンで無効な入力 | 「無効な選択肢です.再度選択してください.」と表示され,再びダンジョンのイベントから始まる |
Python プログラム
import time
# 始まり
print("あなたは、魔法世界にワープした。いま、あなたの目の前には、3つの扉がある。")
time.sleep(1)
print("1つ目の扉には、「ダンジョン」と書かれている。")
time.sleep(1)
print("2つ目の扉には、「魔王城」と書かれている。")
time.sleep(1)
print("3つ目の扉には、「冒険者ギルド」と書かれている。")
time.sleep(1)
# ダンジョン
def dungeon():
global place, hp, mp
print("ダンジョンの暗い洞窟を、手探りで進んでいく。")
time.sleep(1)
print("明かりが見えてきた。")
time.sleep(1)
print("火炎トカゲだ。火炎トカゲが火を吹いている。")
time.sleep(1)
print("どうしますか?")
time.sleep(1)
print("1. 物理攻撃する。")
time.sleep(1)
print("2. 魔法攻撃する。")
time.sleep(1)
print("3. 逃げる。")
time.sleep(1)
choice = input("選択肢を入力してください:")
if choice == "1":
print("あなたは物理攻撃する。")
time.sleep(1)
print("火炎トカゲはあなたの物理攻撃を回避した。火炎トカゲには物理攻撃が効かないのだ。")
time.sleep(1)
print("火炎トカゲが再び火を吹いてくる。")
time.sleep(1)
print("あなたは50のダメージを受けた。")
hp = hp - 50
elif choice == "2":
print("あなたは魔法攻撃する。")
time.sleep(1)
if mp >= 10:
mp = mp - 10
print("MPを10消費して、魔法攻撃した。")
time.sleep(1)
print("おめでとう。火炎トカゲを倒すことができた。")
time.sleep(1)
else:
print("しかし、MP が足りなくて、魔法攻撃できない。")
time.sleep(1)
print("火炎トカゲが再び火を吹いてくる。")
time.sleep(1)
print("あなたは50のダメージを受けた。")
hp = hp - 50
elif choice == "3":
print("あなたは逃げることに成功した。")
place = 0
else:
print("無効な選択肢です。再度選択してください。")
# 魔王城
def castle():
global place, hp, mp
print("しかし、魔王城には何もなかった。")
time.sleep(1)
print("あなたは、魔王城から出ることにした。")
time.sleep(1)
place = 0
# 冒険者ギルド
def guild():
global place, hp, mp
print("しかし、冒険者ギルドには何もなかった。")
time.sleep(1)
print("あなたは、冒険者ギルドから出ることにした。")
time.sleep(1)
place = 0
# プレイヤーの名前
name = input("あなたの名前を教えてください:")
# プレイヤーのHP
hp = 100
# プレイヤーのMP
mp = 30
# メインループの状態(0:場所選択画面、1:ダンジョン、2:魔王城、3:冒険者ギルド)
place = 0
while True:
print("あなたの今の HP は", hp, "だ。そして MP は", mp, "だ。")
time.sleep(1)
# 場所移動
if place == 0:
print("どうしますか?")
time.sleep(1)
print("1. ダンジョンに入る。")
time.sleep(1)
print("2. 魔王城に入る。")
time.sleep(1)
print("3. 冒険者ギルドに入る。")
time.sleep(1)
choice = input("選択肢を入力してください:")
if choice == "1":
place = 1
print("あなたは、ダンジョンに入った。")
time.sleep(1)
elif choice == "2":
place = 2
print("あなたは、魔王城に入った。")
time.sleep(1)
elif choice == "3":
place = 3
print("あなたは、冒険者ギルドに入った。")
time.sleep(1)
else:
print("無効な選択肢です。再度選択してください。")
# ダンジョン、魔王城、冒険者ギルド
elif place == 1:
dungeon()
elif place == 2:
castle()
elif place == 3:
guild()
動作画面
使用する Python の概念
1. 変数
変数とは,データを記憶するための名前付きの領域である.= で値を代入し,プログラムの実行中に値を変更できる.
hp = 100
hp = hp - 50 # hp は 50 になる
2. 式
式とは,値を計算するための記述である.代入文 hp = hp - 50 では,右辺の式 hp - 50 を評価した結果が左辺の変数 hp に代入される.
hp = 100
hp = hp - 50 # 右辺の式 hp - 50 が評価され、結果 50 が hp に代入される
3. 条件分岐(if 文)
条件の真偽に応じて実行する処理を切り替える.elif は前段の条件が偽の場合に評価される追加の条件,else はいずれの条件にも該当しない場合の処理を記述する.
if choice == "1":
print("物理攻撃する。")
elif choice == "2":
print("魔法攻撃する。")
else:
print("無効な選択肢です。")
4. 繰り返し(while 文)
条件が真である間,ブロック内の処理を繰り返す.while True: は条件が常に真であるため,break 文または例外による中断がない限り繰り返す.
while True:
print("どうしますか?")
5. 関数定義(def 文)
処理をひとまとまりにして名前を付ける構文である.定義した関数は,関数名に () を付けて呼び出す.
def dungeon():
print("ダンジョンに入った。")
dungeon() # 関数を呼び出す
6. グローバル変数(global 文)
関数の外側で定義された変数をグローバル変数と呼ぶ.関数内でグローバル変数の値を読み取るだけであれば global 文は不要であるが,関数内で同名の変数に代入を行うと,既定では同名のローカル変数(関数内のみで有効な変数)が新たに作成される.関数内からグローバル変数の値を変更するには global 文で宣言する.
hp = 100
def dungeon():
global hp
hp = hp - 50 # 関数の外の hp が変更される
7. 入力受付(input 関数)
input() は,引数で指定したメッセージ(プロンプト)を画面に表示し,ユーザーがキーボードから入力して Enter キーを押すまで処理を待ち,入力された内容を文字列として返す関数である.
name = input("あなたの名前を教えてください:")
choice = input("選択肢を入力してください:")
8. 標準出力(print 関数)
print() は,引数で指定した値を画面に表示する関数である.カンマで区切って複数の値を渡すと,半角スペースで区切って表示される.
print("あなたの今の HP は", hp, "だ。")
9. 待機処理(time.sleep 関数)
time.sleep(秒数) は,引数で指定した秒数だけ処理を停止する関数である.使用するには,プログラムの先頭で import time を記述する必要がある.
import time
print("ダンジョンに入った。")
time.sleep(1) # 1 秒待つ
print("明かりが見えてきた。")
演習
演習 1.プログラムの実行と動作確認
《手順》
- テキストエディタにソースコードを貼り付け,文字コード UTF-8 で
adventure.pyとして保存する. - コマンドプロンプトで保存先ディレクトリに移動する(
cdコマンドを用いる). python adventure.pyを実行する.- 名前を入力し,3 つの場所をそれぞれ選択して動作を確認する.
- 無効な入力(例:
9,abc)を与えた場合の動作を確認する. - 終了するときは
Ctrl + Cを入力する.
《ヒント》
- 動作確認チェックリスト(「プログラムの実行時の留意事項」節)と照合する.
- 日本語が文字化けする場合は,ソースファイルの文字コードが UTF-8 になっているか確認する.
《考察ポイント》
- 動作確認チェックリストの各項目について,期待される結果が得られたか.
- 場所選択画面とダンジョン内のそれぞれで無効な入力を与えた場合,処理がどこに戻るか.
演習 2.変数と式の追跡
《手順》
- ダンジョンで物理攻撃(
1)を選択した場合のhpおよびmpの値の変化を記録する. - ダンジョンで魔法攻撃(
2)を MP 10 以上の状態で選択した場合のhpおよびmpの値の変化を記録する. - ダンジョンで魔法攻撃(
2)を MP 10 未満の状態で選択した場合のhpおよびmpの値の変化を記録する.
《ヒント》
- イベント終了後にメインループ先頭で表示される HP・MP の値を記録する.
dungeon()関数内のif文の構造と,hp = hp - 50,mp = mp - 10の実行位置を対応付ける.
《考察ポイント》
- 物理攻撃と魔法攻撃で減少するパラメータの違い.
- MP 不足時に魔法攻撃を選択した場合,
hpとmpがどのように変化するか,およびそれがdungeon()関数内のどの分岐に対応するか.
演習 3.if 文による分岐の確認
《手順》
- 場所の選択(
1,2,3,それ以外)に対応する分岐をソースコード上で特定する. - ダンジョン内の選択(
1,2,3,それ以外)に対応する分岐をソースコード上で特定する. - 各分岐で実行される処理を整理する.
《ヒント》
- 分岐は
if,elif,elseの順に評価される. - 魔法攻撃の処理には,さらに MP 残量による
if-elseの入れ子がある.
《考察ポイント》
- 魔法攻撃の処理において,MP 残量に応じた分岐がどのように実装されているか.
- 「無効な選択肢です.再度選択してください.」が表示される条件.
演習 4.while 文によるメインループの確認
《手順》
- メインループ(
while True:)の開始位置と終了位置をソースコード上で特定する. - 各イベントの終了後に処理がメインループのどこに戻るかを確認する.
- プログラム実行中に
Ctrl + Cを入力し,挙動を確認する.
《ヒント》
Ctrl + CはKeyboardInterrupt例外を発生させる.
《考察ポイント》
- HP が 0 以下になってもループが継続することを実行結果から確認し,その理由をソースコード上で説明する.
- メインループを正常に終了させる条件分岐を追加する場合,どの位置に記述するか.
演習 5.関数定義(def 文)と関数呼び出しの確認
《手順》
dungeon(),castle(),guild()の定義位置をソースコード上で特定する.- 各関数がメインループのどの分岐から呼び出されるかを確認する.
- 関数呼び出しから処理が呼び出し元に戻る位置を確認する.
《ヒント》
- 関数の処理が終わると,呼び出した位置の次の行に処理が戻る.
《考察ポイント》
- 関数を用いることで,メインループの記述がどのように整理されているか.
castle()およびguild()の関数本体に処理を追加する場合,どの位置に記述するか.
演習 6.global 文の確認
《手順》
dungeon()関数内のglobal文で宣言されている変数を特定する.dungeon()関数の先頭にあるglobal place, hp, mpの行を削除(またはコメントアウト)し,再度実行してダンジョン(1)を選択する.UnboundLocalError(ローカル変数として参照される前に値が設定されていない,という趣旨のエラー)が発生することを確認する.- 確認後は
global文を元に戻し,正常に動作することを確認する.
《ヒント》
- 関数内で変数に代入を行うと,
global文で宣言されていない限り,同名のローカル変数が新たに作成される. - グローバル変数の値を読み取るだけであれば
global文は不要である.
《考察ポイント》
global文がない状態でhp = hp - 50を実行すると,右辺のhpがローカル変数として扱われ,かつ値が未設定となるためエラーが発生する.この挙動を実行結果から確認する.- 関数内でグローバル変数の値を変更する場合に
global文が必要となる理由.