2025年度 電子情報通信課程 計算機実習II

講義に関して,ちょびっとコメント

口頭で説明します.

クラスを利用する

今日のポイント

前回,クラスについて学習しました. いよいよ「ちゃんとしたゲーム」らしくなってきましたね.

クラスを活用すると,より複雑な表現・細かい調整をやりやすくなります. つまり「こんなことやりたい」というおおまかな発想から, それをよりリアルに緻密に実現する武器になるというわけです.

今日はその「クラス」を活用して,「主人公」や「モンスター」 といったキャラクターを作ります.

・キャラクターのオブジェクトには,どんなプロパティ( =変数 )が必要でしょうか.

・またどんなメソッド( =関数 )が必要でしょうか.

今回の課題は少ないですが中身は十分濃いので,しっかり味わって, 楽しみつつ理解して進めてほしいと思います.

課題 13-1

教科書§7-3,pp.217-220「キャラクターのクラスに必要なデータと機能を考える」 ~「親のCharacterクラスを作る」までを読み,chap7fight.py を更新しましょう. クラスの設計( オブジェクトの枠組み作り )は理解できましたか? また,クラスの「継承(inheritance)」は理解できましたか? 継承を平たく言えば,別のクラスをコピーして機能を追加する,というイメージです.

  • 13-1-1) randint()関数の使い方について.教科書のプログラムとは関係なく, ★サイコロの数字( 1-6の整数値 )を "dice" 変数に得るコードを答えなさい. ※import 文は不要.ソースコード1行だけ回答しなさい.
  • 13-1-2) ★教科書p.220の chap7fight.py において, 関数"get_atk()" と "get_dfs()" の戻り値の範囲をそれぞれ答えなさい.
  • 13-1-3) その下の関数定義 "def culc_hp(self, atk, dfs)"では, 戦った結果の体力値(hit point)を計算しています.

     ※注意※教科書の関数名"culc_hp"という名前は間違いだと思われます. 関数の意味からすると英語では "calculate hit points" となります. なので本来はcalc_hpのはずです. 皆さんのプログラムではどちらでも構いませんが, なるべくなら正しい方(calc_hp)を使いましょう. そして,このような恥ずかしい間違いのないように, 変数/関数名をつける際にはスペルを確認しましょう.

    ここに「会心の一撃( = 稀に生じる,通常よりも非常に強い攻撃 )」を追加しましょう.

    以下に「会心の一撃」の定義を示します.

    1. 4~6回に1回程度の割合( ランダム性あり )で発生させる方法

       ※「◯回やったら必ず1回発生」はゲームとして面白くないですよね

    2. 「会心の一撃」として相手の攻撃力をランダムに2~5倍( 整数 )にする方法
    3. 「会心の一撃」として自分の防御力をランダムに0.1~0.5倍( 実数 )にする方法

    ★ a.b.c.の方法をそれぞれ文章で説明しなさい. 必要ならソースコードを例示しても構いません.

  • 13-1-4) 上記a.b.c.を実装して試してみましょう.ただし,

    a.は必須.b.とc.はbだけ/cだけ/b+c両方の3通りを試します.

    ★試してみて,あなたが「一番会心の一撃らしい」と思うソースコード( コメント付 )を提出し, なぜそれが「会心の一撃」に近いと思うかを述べなさい.

子クラス

実際に親クラスを継承した子クラスを作ってみましょう.

子クラスには親クラスで設定した内容がそのまま引き継がれます. ただし,子クラスで親クラスと同じ名前の関数を用意すると,親クラス側は無視され, 子クラス側の関数が利用されます.

そのため,クラス作成時に呼び出される「__init__( self ):」を子クラスに作成すると, 親クラス側の「__init__( self ):」は呼び出されません. したがって親側で考慮した初期設定が無視されてしまいます.

子クラスから同じ名前の親クラスの関数を呼びだすには, 「__init__( self ):」ブロック中で,「super( )」オブジェクトを使って 親クラスの「__init__():」を呼び出します( 教科書p.224 ).

 例: super().__init__()

ただしこの書き方だと,全ての子クラスにこの一文が必要になります. これを書き忘れたらその子クラスは初期設定が反映されなくなるという, 見つけにくいバグにつながります.

これを回避する方法が「__new__()」関数です ( 教科書p.225「コンストラクタの特殊メソッドは2種類ある」 ).

この関数を使ってオブジェクトを作成すると,親クラスのオブジェクト作成時の関数( __init__ ) が自動的に呼び出されます.必然的に子クラスには__init__が必要なくなり, 上述の問題が生じなくなります( 教科書p.225 ).

課題 13-2

教科書pp.221-226「3つの子クラスを作る」~「コンストラクタの特殊メソッドは2種類ある」を読み, chap7fight.py を更新しましょう.「子クラス」が理解できましたか?

ゲームを仕上げる

ここまで作ってきたゲームの仕上げ段階です.

☆冬休み課題 13-3☆

【各自で実施】提出はありませんが,冬休み中に必ずやって下さい.

教科書§7-4,pp.227-242を読んで,RPGを仕上げて下さい. イベントドリブンデバッグ作業など,実用的な概念が出てきます. また,ゲームとして完成度を上げるために色々と細かな部分を触っていきます. これらは手間のかかる作業ですが,プログラムを完成させるというのはこういう作業が必須なのです. 頑張って進めましょう.

 ※このセクションでは,プログラミング知識としてはすでに学んだ項目を使っています. なので新たに解説することはしません. ただし「イベントドリブン」の概念は重要なのでぜひ理解しておきましょう.

次回の第8章は,このパートができていなくても取り組むことができます.

今日の課題

提出課題は13-1( 13-1-1~13-1-4 ) です.

課題13-2は実行のみです.が,必ずやってください.

課題13-3は冬休みの宿題とします.提出はありませんが必ずやって下さい

  • 課題をmanabaのレポート欄「第13回課題」に提出して下さい.
  • 直接書き込む「オンライン入力方式」です.
  • 冒頭には「誰へ」「学籍・氏名」「挨拶一言」「要約:どの課題に答えたか」を文章として書きます.
  • 実習時間内に終わらなかった場合,締切は「次週12/26 (金) 9:15 まで」です.

     ※年末なので期日注意

※注意※

◎しっかり課題文を読み,「何をどう答えるべきか」を把握して下さい.

◎manaba入力画面には時間制限があります.いったんPCのエディタでテキストファイルを作成してから,それをコピーするようにしてください.その際のファイル名は自由ですがわかりやすいものを.特にプログラムのソースファイルと混同しないように注意しましょう.

◎実行画面,ソースコード,エラーメッセージ等は"----"や"====="等の境界線を入れて「ここから」「ここまで」を明確にして下さい.

◎ひとまとまりの回答の前後には空行を入れて読みやすくして下さい. びっしり書かれていると読みにくく,チェック/評価の際の間違いの原因になります.

◎提出前にもう一度,冷静に読み直して下さい.第三者が読みやすいか?回答が伝わるか? などをもう一度確認してください.訂正点を見つけたら「少しくらいならいいや」ではなく 「あと一手間」を惜しまずに,手をかけて下さい.