2025年度 電子情報通信課程 計算機実習II講義に関して,ちょびっとコメント口頭でお伝えします. オブジェクト指向とクラス素材についていらすとやさんをもとに作成した素材は, です.名前をつけて保存して下さい. 一連の値を一つの名前の変数で扱うのに,配列変数( リスト )を使いましたね. 同様に,一連の処理( 関数 )やデータを一つの塊として扱う方法として 「オブジェクト」という概念があります. 実は,すでにモジュール "tkinter" を使って,オブジェクトを操作しています. ウインドウというオブジェクトを生成し,その中の関数を利用したり変数を設定したりしていました.
課題 12-1教科書§7-1,pp.194--198「クラスの作り方」までを読み, chap7-class.py を入力して実行しましょう. ★教科書p.198のソースコードで,「def fight( self )」を「def fight()」に書き換えると 「selfがない場合に表示されるエラー」が示されます. そのエラーメッセージをそのまま報告しなさい. python ではオブジェクト生成時に,"__init__()" という特殊な関数が呼び出されます. この関数のことを「コンストラクタ」といいます. コンストラクタは何もしなくても自動的に呼び出されます. しかし,あえてclassの定義中でコンストラクタを明示的に定義し, そこで変数に特定の値を代入しておけば,いわば「初期設定」となり, オブジェクト生成した直後からその変数等を利用できます. この変数を「属性:Attribute」と呼びます.
※注意※ オブジェクトは生成時に初めて名前が付けられます. したがってクラスの定義内ではそのオブジェクト自身を指し示す名前を固定することができません. クラス内で自分自身( オブジェクト自身 )を指し示すときには「self」を使います. これが先ほどの課題12-1に出てきた「self」です. 課題 12-2教科書pp.199--200「コンストラクタと属性を作ろう」を読み,chap7-class.py を更新しましょう. 「コンストラクタ」が理解できましたか?また,「self」の扱いが理解できましたか? ★教科書p.199のchap-class.py において名前を扱う変数( 属性 )として「self.name」と「chara1.name」が出てきます. それぞれ何を意味しているのか( どこに保管されている変数なのか )を説明しなさい. オブジェクト生成時に引数を指定すると,オブジェクトに情報を渡すことができます. すでに作成したプログラムで,ボタンを作るときに「Button( text = "ボタン名" )」 という書き方をしていました.この「text = "ボタン名"」の部分が引数です. 課題 12-3教科書pp.200--201「コンストラクタに引数を持たせる」を読み,chap7-class.py を更新しましょう. このプログラムではオブジェクトを作る際,「CharaTest( "戦士" )」として「"戦士"」の値を引き渡していますね. ★この「"戦士"」という値がどのように使われてオブジェクトとして作られているかを説明しなさい. RPGの戦闘部分を作りましょう. 戦闘時には,味方( 複数? )と敵( 複数? )が必要になります. これらをクラスとして定義し,オブジェクトとして生成すれば, 手軽に一定の初期設定( ステータス )を持つ「キャラクター」として扱うことができます. 教科書では,主人公としてBraveクラス,敵としてMonsterクラスが考えられています. 課題 12-4教科書§7-2,pp.202--204「ゲーム内容からクラス設計を考える」を読み,プログラム chap7.py を作りましょう. ※p.203「新しいソースコードのファイルを作る」はVS Codeを使った場合の説明です 教科書pp.204--205「FightManagerクラスと戦闘画面を作成する」を読み,chap7fight.py を作成し,chap7.py を更新しましょう. 2つのファイルを扱うので,混在しないように気をつけましょう. 教科書p.205の最後に書いている指示「端末パネルに~」に従い「chap7.py」を実行してみましょう. 教科書p.206の図のような結果になりましたか? 教科書pp.206-208( 続き )を読み,chap7fight.py を更新しましょう. ★教科書では「勝った」「負けた」の2択です.この間に「逃げた」のボタンを追加して設置して下さい. 追加したコード( 2行, )をコメント付きで提出しなさい. マップにモンスターを配置しましょう.モンスターとの遭遇の部分は次のステップです. マップ上のモンスターの画像は1種類ですが,内部的には2種類用意します. そのため,画像データは5番目にモンスターを用意し,地図データには5と6でモンスターを配置します. 課題 12-5教科書pp.208-209「マップにモンスターを配置する」を読み,chap7.py を更新しましょう. マップにモンスターが表示されましたか? 教科書pp.209-211( 続き )を読み,chap7.py とchap7fight.py を更新しましょう. モンスターと重なったら,画面が戦闘画面に変わりましたか? ※2つのファイルを扱うので,混同しないように気をつけましょう. 戦闘に勝ったら,マップ上のモンスターに消えてもらいましょう.どうすればいいでしょうか? ――クラス内のプログラム( chap7flight.py )から呼び出し元( chap7.py ) の変数を変更する?残念ながらそういう変更はできません. そこで,chap7.py からクラス内の関数を呼び出すときに,変更したい変数を一緒に渡して, 関数の中で変更してもらうことにします. ただし,関数に値を渡す際には,変更できる場合とできない場合があることに気をつけて下さい. 教科書のp.216のコラム「ミュータブル型についてもう少し詳しく」に書いてありますが, 「数値や文字列をやりとりしたらコピーが渡され」,「それ以外は共有した扱い」 になります.
※豆知識※ これにはプログラムのメモリアドレス管理方法が関わってきます. 例えばC言語だと「ポインタ」という概念があり,プログラム内のメモリの位置を意識することができます. C言語が高水準言語でありながら,アセンブラ等の低水準言語との相性がよいのはこのためです. しかし,python ではメモリ管理に関してはプログラマからは見えないため, 関数への値の伝達については逆にわかりにくいですね. 課題 12-6教科書pp.212--215「勝ったときと負けたときの画面を表示する」を読み, chap7.py とchap7fight.py を更新しましょう. 「勝った」「負けた」のボタンは正しく動作していますか? ※この段階では戦闘の中身はまだありません ★ここで,課題12-4で追加した「逃げた」イベントに対応する関数を作成しましょう.
提出が必要なのは,課題12-1,12-2,12-3,12-4,12-6 です. 課題12-5は実行のみです.が,必ずやってください.
※注意※◎しっかり課題文を読み,「何をどう答えるべきか」を把握して下さい. ◎manaba入力画面には時間制限があります.いったんPCのエディタでテキストファイルを作成してから,それをコピーするようにしてください.その際のファイル名は自由ですがわかりやすいものを.特にプログラムのソースファイルと混同しないように注意しましょう. ◎実行画面,ソースコード,エラーメッセージ等は"----"や"====="等の境界線を入れて「ここから」「ここまで」を明確にして下さい. ◎ひとまとまりの回答の前後には空行を入れて読みやすくして下さい.びっしり書かれているとチェック/評価の際の間違いの原因になります. ◎提出前にもう一度,冷静に読み直して下さい.細かい部分でも訂正があれば手をかけて下さい. |