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

今日の説明動画

本日の説明は,6本の動画に分かれています.それぞれ視聴して,理解ができたら次に進むようにして下さい.

動画の長さは次の通りです.自分のペースで進めながらも,1コマで終わるように頑張ってください.

  1.  計算機実習2/計算機基礎実習2-12回目ex12-1 - 06分46秒
  2.  計算機実習2/計算機基礎実習2-12回目ex12-2 - 05分17秒
  3.  計算機実習2/計算機基礎実習2-12回目ex12-3 - 03分53秒
  4.  計算機実習2/計算機基礎実習2-12回目ex12-4 - 05分05秒
  5.  計算機実習2/計算機基礎実習2-12回目ex12-5 - 02分11秒
  6.  計算機実習2/計算機基礎実習2-12回目ex12-6 - 06分18秒
  7. 計 29分28秒

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

前回のレポート採点結果は,こちらです.

気になったところのメモ

  1. 課題11-4:「どんな問題が起こるか」です.「ボタンを押すことができる」のは問題ではありません.「押すことができた結果何が起こってしまうのか」を考えて下さい.以前の「画面の外を動くことができる」のと同様で,見えないところでも主人公が動いています.ただし,「動いている」だけでは問題ではありません.それでイベントが発生してしまうと,「クリアしたのに,別のイベントの画面が表示される」という問題が生じます.

素材について

いらすとやさんをもとに作成した素材は, , です.名前をつけて保存して下さい.

オブジェクト指向とクラス

今日のポイント

同じ種類の変数を複数扱うには,配列変数を使いました.

同様に,プログラム(関数)やデータを1つの塊として,複数扱う方法として「オブジェクト」という概念があります.

今までに使ってきたtkinter というモジュールを使ったウインドウ作成は,オブジェクトを操作していました.

ウインドウというオブジェクトを用意し,その中の関数を利用したり変数を設定したりしていました.

オブジェクトの作成は,「オブジェクト変数 = クラス名()」 の形です.「root = tkinter.Tk()」がこれに該当します.

オブジェクトが持っている関数を呼び出すのは,「オブジェクト変数.関数名()」です.「root.title("計算機実習2")」がこの形式です.

オブジェクトが持つ変数も属性(Attribute)という呼び名で使うことができます.これは今までには出てきていない形式です.

関数を呼び出すときは引数を扱いますので「()」が必要です.一方変数を扱うときには不要です.


オブジェクトを作成するには,まず「クラス」を用意する必要があります.

そのクラスの関数を呼び出すと,その種類のオブジェクトが作られます.

課題 12-1
  1. 教科書pp.194-197を読み,chap7-class.pyを入力して実行しましょう.
  2. 教科書p.198を読み,chap7-class.py を更新して実行しましょう.
  3. 教科書p.198を読み,「def fight(self)」の部分を「def fight()」に書き換えて,「selfを書かなかった場合に表示されるエラー」を確認しましょう.そのエラーメッセージを報告して下さい.

コンストラクタ

python ではオブジェクト生成時に,__init__ という関数が呼び出されるようになっています.

そこにオブジェクトの初期設定を書くことができます.

この関数のことを「コンストラクタ」といいます.

一般には,変数の設定を行ったりします.

また,オブジェクトは生成時に名前が付くため,クラス内ではそのオブジェクト自身を指し示す名前を固定することができません.そのため,クラス内で自分自身(オブジェクト自身)を指し示すときには,「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
  1. 教科書pp.200-201を読み,chap7-class.pyを更新しましょう.
  2. オブジェクトを作るときに,「CharaTest("戦士")」として「"戦士"」の値を引き渡しています.
  3. この「"戦士"」の値がどのように使われてオブジェクトが作られているのかを説明して下さい.

クラスを設計する

RPGの戦闘部分を作りましょう.

戦闘時には,味方(複数?)と敵(複数?)が必要になります.

これらをオブジェクトとして用意することで,手軽に「キャラクター」の塊を扱うことができます.

教科書では,主人公としてBraveクラス,敵としてMonsterクラスを考えています.

課題 12-4
  1. 教科書pp.202-204を読み,chap7fight.pyのファイルを作りましょう.
  2. 教科書pp.204-205を読み,chap7fight.pyとchap7.pyを更新しましょう.2つのファイルを扱いますので,混在しないように気をつけましょう.
  3. 教科書p.205の最後に書いている指示に従い「chap7.py」を実行してみましょう.教科書p.206の図のような結果になりましたか?
  4. 教科書pp.206-208を読み,chap7fight.py を更新しましょう.
  5. 教科書では「勝った」「負けた」の2択ですが,「逃げた」のボタンをその間に設置して下さい.追加したコード(2行)を提出して下さい.

モンスターの配置

マップにモンスターを配置しましょう.モンスターとの遭遇の部分は次のステップです.

マップ上のモンスターの画像は1種類ですが,内部的には2種類用意します.

そのため,画像データは5番目にモンスターを用意し,地図データには5と6でモンスターを配置します.

課題 12-5
  1. 教科書pp.208-209を読み,chap7.pyを更新しましょう.
  2. マップにモンスターが表示されましたか?
  3. 教科書pp.209-211を読み,chap7.pyとchap7fight.pyを更新しましょう.2つのファイルを扱いますので,混在しないように気をつけましょう.
  4. モンスターと重なったら,画面が戦闘画面に変わりましたか?

クラスの中から,外の変数を扱う

戦闘に勝ったら,マップ上のモンスターを消す必要があります.

そのまま考えると,クラス内のプログラム(chap7flight.py)から呼び出し元(chap7.py)の変数を変更することになりますが,そのような構造を作ることはできません.

そのため,chap7.pyからクラス内の関数を呼び出すときに,変更したい変数も一緒に渡して,関数の中で変更してもらいます

ここで,関数に値を渡すときに変更できる場合とできない場合があることに気をつけて下さい.

教科書のp.216のコラムに書いてありますが,「数値や文字列をやりとりしたらコピーが渡され」「それ以外は共有した扱い」になります.

※C言語のポインタを勉強すると,言語側のメモリ管理が理解できるのですが,python ではその部分はプログラマから見えないようになっています.

課題 12-6
  • 教科書pp.212-215を読み,chap7.pyとchap7fight.pyを更新しましょう.
  • 戦闘の中身はまだ存在しません.「勝った」「負けた」のボタンは正しく動作していますか?
  • 課題12-4で追加した「逃げた」のボタンに対応するプログラム(関数)を作成しましょう.
    1. まず,どのような動作を実現したいか説明して下さい.
    2. 上記で説明した「逃げた」に対応する関数を作成し,その作成した関数を提出して下さい.

今日の課題

上記の課題12-1,12-2,12-3,12-4,12-5,12-6です.

提出が必要なのは,12-1,12-2,12-3,12-4,12-6の課題です.

課題はメールで提出して下さい.

件名はreport12,アドレスはcom02@elec.ryukoku.ac.jp です.

締切は,「翌週水曜日が終わるまで(今回は12月20日中の提出がセーフ)」です.