(97.2.7.作成)
「たまごっち」の異常な人気に驚かされますが、本教室では実習として「めだかっち」の作成に取り組むことになりました。
メールでの議論がどんどん進みますので、整理が大変です。(^_^;;
以下に皆さんの議論を整理してみました。
まず、めだかっちを作成するにあたっての要件をまとめてみます。
水槽 ・大きさ:150×200 ・中には水草、メダカが最初から入っている ・水草は水槽底辺右から1/3の位置にある ・メダカは最初は(100, 100)の位置にある ・水槽の上部には、ボタンが付いていて、飼い主がそのボタンを押すと 餌が水槽内に落ちるようになっている ・もう一つボタンが付いていて、それを押すと水槽内のメダカの糞が 始末出来る仕組みになっている 水草 ・水槽内に存在している。 ・ユラユラ揺れているかもしれない、あるいは、ただそこにあるだけ。 餌 ・飼い主が水槽に付いているボタンを押すと水槽内に落ちるようになっている ・一回に落ちる量は5グラム メダカ ・メダカは水槽内に一匹、最初から入っている <行動について> ・朝9時に起きる ・昼間は常に泳いでいる ・餌が水槽内に入ると必ず食べる ・餌を食べて一定時間経つと糞をする ・夜は9時に寝る ---- 寝ている間は静止している ・餌を与えられずにある一定時間経つと元気が無くなる ・糞の始末をしないである一定時間経つと元気が無くなる(死ぬこともある) <泳ぎ方> ・水槽の端に来ると方向を変える ・メダカの元気が無くなる = 泳ぐ速度が遅くなる(かな?) <生死について> ・餌が一定時間以上与えられないと死ぬ ・メダカの糞の始末をしないで一定時間経つと死ぬ <メダカの目について>(西野さんの目クラスをコピーしました) 目のクラスでは、 見える距離の属性 メソッドは 右を見る 左を見る 上を見る 下を見る 認識する(餌か水草か・・) <姿について> ・餌を食べすぎるとブタ顔のメダカに変身する (ただ太るだけではおもしろくないかなと思ったので(^_^;) ・ある一定時間以上餌を与えられないと痩せる (骨だけのメダカ姿になってもいいかも?) 糞 ・一回の糞の量は5グラム(餌と同じ量でいいのかな?) ・飼い主によって水槽上部のボタンを押されると始末される 飼い主 ・飼い主は餌を与えるためのボタンと、フンを始末するためのボタンを 押すことが出来る
この要件を満たすようなプログラムを作成するために、次のような方針で臨みます。
クラス〜インスタンスを使うオブジェクト指向プログラミング言語では、 性格やそれに応じた行動などの動作および属性はクラスに定義して、 各インスタンス毎に持つのは属性値だけにしたい。 「よく笑うめだか」を作るには通常は、 「よく笑う」属性の属性値を「真」にするか、 「笑いやすさ」属性の属性値を「大」にするか、 などの設計法があります。 めだかオブジェクトはこれらの属性値を参考にして、 ある条件の時に笑うかどうかを決定します。 一方、「笑う」を全く考慮してない「めだかクラス」から、 「よく笑うめだかインスタンス」を作ることはできないと思います。 少なくとも今のJavaではできないです。 # 【上級向け】「めだかクラス」のサブクラス「笑うめだかクラス」から作っ # た「よく笑うめだかオブジェクト」は、「めだかクラス」のインスタンス # として扱えるけど、「めだかクラス」から作るわけではないです。 めだかごとにいろいろな個性を持たそうとするとどうすればいいでしょうか? そのためには性格に関する属性をめだかクラスに作って、 性格に応じてめだかの行動を決めれば良いです。 行動だけでなく、ある閾値を過ぎたら表示も変えれば、楽しい。 # たまごっちはそうなんですよね。 例えば、 決まった間隔で餌が与えられれば、真面目になって、眼鏡をするとか… 空腹になる前に餌が与えられれば、甘えた性格になって、太るとか… 餌の間隔がバラバラなら、情緒不安定になって、はげるとか…
実際のプログラムを作成する手順については。。。。。
最初は 餌を与えると(画面は変更なし)、 水槽の外にあるめだかの状態モニターの満腹度の値が変わるだけ。 次はたまごっちのように、 餌を与えると餌は定位置に現れ、 めだかは定位置に瞬間移動して、 めだかが餌を食べるのを表示。 さらに 餌を水槽に入れると餌はユラユラ落ちていき、 めだかはそれに向かって体が水平なまま泳ぎ、食べる。 さらに めだかは斜めになって泳ぐこともできて、餌に向かって泳ぐ。 水底の餌は口を下にして立って泳いで食べる。 お腹が空くと水底の小石を口に入れてみたりする。 と、段階を踏んでいくのが良いと思います。
めだかっちの要件をもとに、メソッドの概要を検討します。
めだかは: [水槽の中のどこかにいることを知っている] [泳ぐ方向をもっている(止まっていることも泳ぐ方向に含まれるものとする)] [おなかいっぱい度数をもっている] [自分の形と大きさをもっている] [めだか体内時計をもっている] ← こだわるか普通(笑) 「・・・させられる・される」はめだかの本能によって、とでも言おうか・・・。 ・「めだか」は、「エサ」を「エサによって」「知らされる」。 (「エサ」は「エサの存在情報と位置情報」を「めだか」に知らせる) *めだかが自由に方向をかえられない条件* ・めだかは、「エサが落ちているとき」かつ 「おなかいっぱい度数が満腹だった場合でなければ」、 「エサに向かって」方向を「かえさせられる」。 ・めだかは、「めだか体内時計がある時間に達していなければ」、 「泳ぐ方向をかえたいと思わない」。 (ある確率でかえたくなるくらいがよいかも) ・めだかは、「落ちているえさの下に追いついたら」、 「止まっている方向を持たされる」 ・めだかは、「水槽など、障害物に触ったら」、 「方向を逆方向に変えさせられる」 ・めだかは、「おなかいっぱい度数が0になると」、 「地面につくまで」「沈む方向にさせられる」 (逆さになって浮くかなあ。変にリアルか!?) *めだかが自由に方向をかえる条件* 「上記の条件に当てはまらない場合、かつ めだか体内時計がある時間に達した場合」、 「適当に向きを変える」(「止まって泳いでいるとき」もありうる)。
次にクラス階層を考えてみます。
Object--+--水槽 … 内容物を入れるもの。内容物を管理する。 +--内容物 …水槽内の位置/大きさ/姿を持つもの : --+--静物 …移動しないもの | --+--壁 …水槽の壁/水面 | +--海草 | +--岩 | : +--動物 …移動するもの --+--生物 …成長するもの | --+--めだか | +--金魚 | : +--餌 +--糞 +--泡 : もちろん、例によって段階があって、この辺りから始める。 Object--+--内容物 …水槽内の位置/大きさ/姿を持つもの --+--静物 = 壁 +--動物 = 生物 = めだか 以上のアイデアを参考にして、初心者らしくシンプルな構成を考えてみます。
継承関係は...
java.applet.Applet ----- Medakacchi(水槽を準備、表示するアプレット) java.awt.Canvas ----- Tank(水槽クラス) java.awt.Panel ----- TankCare(給餌ボタンなどを備えたパネル) TankObject(水槽の中身) --+-- Medaka(めだかクラス) | +-- Feed(餌クラス) このほかにも水草や糞のクラスも必要です。
Tankクラスについては、このように考えることができます。
・Tankは入れ物だけでなくそれを満たす水も含めた「水槽」である ・よって水槽の中身は水を通して見ることになる ・めだかが餌を見るときも同様に水を通して見ることになる。 そこでTankクラスの役目は ・水槽の中身を水槽の外にいる人間に見せる ・水槽の中身がお互いの位置を知る手段を提供する。 ・水の状態(汚れなど)を保持する などになるかな、と。
設計段階では手間を惜しまぬ切り分けがとても重要だけれど、実装段階では手 間を惜しんで小さく作るというのを心がけると、「ああ、良いプログラムになっ たな」と思えること請け合いです。
教員に対するご意見はこちらへ:(Mail to : cbu-staff@psn.or.jp)
用務員:臼井義美 (Mail
to : usui@kcn.or.jp)