プログラミング2021 グループ課題
グループ04
https://github.com/xyzyxJP/Prog2021-04/archive/refs/heads/main.zip
javafxc -classpath lib/json-20211205.jar: *.java
javafx -classpath lib/json-20211205.jar: MapGame
この資料ではグループ課題について説明します.みなさんには5名程度のグループで課題に取り組んでもらい,その成果を中間・最終発表会で披露してもらいます.ベースとなるプログラムは提供しますが,みなさんの力でそれを発展させ,オリジナルなゲームへと昇華させてください.グループメンバーは教員が適宜決めました.メンバー表は授業資料の中に入っていますので確認してください. グループ課題ですから,グループ内で意思疎通をすることが重要になります.特に,話し合いながら少しずつプログラムを読んだり,わからないところを確認したりするプロセスを経験していただくことが重要です.作品の完成だけを目指す進め方は評価されません.例えば,得意な人にすべてやってもらうのは論外です.もちろん,分業することや,わからないところを教え合うことはかまいませんが,どんな独自機能を作るか議論したり,それぞれの作業でできたものを組み合わせて動かしたり,組み合わせの際のバグを取り除いたりといった結合の部分が最も重要です.このため,課題自体も複数名で取り組んだ方がうまくいくように作成してあります. また,グループの独自性を出すために,他のグループがどのような作品を仕上げようとしているのかについてサーベイすることも有効です.公式なサーベイチャンスとしては,中間発表会が挙げられます. グループ課題の評価は,発表会での教員・TA・聴講者全員の投票結果が反映されます.プロダクトの完成度のみでなく,発表の質も求められます.発表は5分程度ですので,デモのための特別なモード (予め設定した初期値で動作するなど)を実装しておくことも有効です.どのように発表でアピールするかを検討することも,グループ課題に含みます. 課題では,ゴールに向けて白猫を動かすゲームを作ってもらいます.ゲームのひな型は提供されます.ひな型で用いているのは以前の課題で学んでいただいたJavaFX(FXMLを使用)です.できる限りMVCに則って実装されています.画面のイメージは以下です.白猫がいる部分の正方形を,以下では便宜的に「1マス」と呼びます.
下記にこのゲームの概要を示しました.ただし,あえて未実装の部分もあります.グループで下記を実装しつつ,上記にはない独自機能も実装して,他のグループとは異なるできるだけ面白いゲームを作ってください.
- キーボードのhjkl(←↓↑→)で猫が移動する ※別のキーに割り当ててもOK
- 猫は左上からスタートする
- 猫が特定のアイテムを取得していればゴールできる(ひな型ではアイテムが何もない,ゴールもない)
- 猫がゴールすると新しい地図が生成される(ひな型では新しい地図が生成されない)
- ユーザがfunc1~func4のキーを押すとゲーム上で何らかのスペシャルイベントが発生する(ひな型ではスペシャルイベントは発生しない)
課題には「与えられた仕様に沿って必須機能を実装する」部分と「独自機能の仕様を策定して実装する」部分とがあります. 5つの必須機能を実装すること,2つ以上の独自機能を考えて実装することが条件です.必須機能が適切に実現されていること,興味深い独自機能が多く実現されていること,発表会でのトーク・デモ・質疑応答がうまくできていることが,それぞれ高評価を得るためのポイントです.必要に応じて,JDB(Javaのデバッガ),Scene Builder(JavaFXのGUIを構築するためのGUI環境) などを使用してもかまいません.
課題では,実際のシステム開発の世界で行われている仕様書の作成・設計書の作成・実装・テストの実施という一連の仕事を体験していただきます.
システム開発の世界では,仕様書の作成・設計書の作成・実装(コーディング)・テストの実施,という作業を通じて,システムを完成させていきます.それぞれの用語の意味は以下の通りです.
- 仕様:ユーザが「こういう機能があったらいいな」という目線で語ったことを文章や図で表したもの
- 設計:どのようにして仕様で求められている機能を作るのかを決めること
- 実装:設計に沿ってプログラムを作ること
- テスト:プログラムが期待された通りに動くこと,期待された通りには動かないことを確認すること
仕様書の作成 → 設計書の作成 → 実装 → テストの実施
以下に,今回の課題で求められる仕様・設計・実装・テストの作業内容を示します.
- 仕様
- ゲームでできるようにしたい機能を文章や図などで表す.
- 設計
- どのような機能を作成するのかについて文章で表現する.いつ,どこへ,何を,どのようにするかが明らかになるように,数字を用いて記述するとよい.主語と述語の対応が取れているか確認すること.主語は,ユーザの操作なのか,キャラクターの動きなのか,プログラム内でのイベント発生なのかなど,多様になる可能性がある.1文を短くするほうが,主述の対応がとりやすくなる.文で表現することが難しい場合は図表を用いてもよい.
- 実装
- 作成したクラスやメソッドや機能はどのような機能を持っているのか,それらのクラスやメソッドや機能は他のどのクラスやメソッドとどのように関係しているのかをコメントに書く(コメントはできればjavadoc形式で作成する).
- テスト
- 設計で定められた入力とは異なるものが入力されても問題ないか,キャラクターに普通ではない動きをさせてもバグが生じないか等,イレギュラーなケースをできる限り多く想定し,それらを全て試す.テスト項目を考える際には,設計を読むことが有益に働く場合がある.
以下に,本課題の白猫が移動する機能の仕様・設計とテストの例を示します.実装についてはMapGameController.java(52~96行目付近), MoveChara.javaなどのソースコードを確認してください.
- 仕様
- 任意のキーを押すことによって,キャラクターが迷路上を上下左右に移動できるようにしてほしい.
- 設計
- 左へ進む機能
- ユーザがhキーを押したとき,白猫が現在いるマスよりも1マス左へ移動する.ただし,左隣のマスが壁の場合は,白猫は移動しない.
- 左へ移動しようとする際には,白猫が左を向いた画像に切り替える.また,pngディレクトリにある左向きの画像3枚を0.5秒おきに切り替えて,白猫が足踏みをしているように見せる.
- 右へ進む機能
- ユーザがlキーを押したとき,白猫が現在いるマスよりも1マス右へ移動する.ただし,右隣のマスが壁の場合は,白猫は移動しない.
- 右へ移動しようとする際には,白猫が右を向いた画像に切り替える.また,pngディレクトリにある右向きの画像3枚を0.5秒おきに切り替えて,白猫が足踏みをしているように見せる.
- 上へ進む機能
- ユーザがkキーを押したとき,白猫が現在いるマスよりも1マス上へ移動する.ただし,上隣のマスが壁の場合は,白猫は移動しない.
- 上へ移動しようとする際には,白猫が上を向いた画像に切り替える.また,pngディレクトリにある上向きの画像3枚を0.5秒おきに切り替えて,白猫が足踏みをしているように見せる.
- 下へ進む機能
- ユーザがjキーを押したとき,白猫が現在いるマスよりも1マス下へ移動する.ただし,下隣のマスが壁の場合は,白猫は移動しない.
- 下へ移動しようとする際には,白猫が下を向いた画像に切り替える.また,pngディレクトリにある下向きの画像3枚を0.5秒おきに切り替えて,白猫が足踏みをしているように見せる.
- 左へ進む機能
- テスト
- 左へ進む機能
- 白猫が現在いるマスの左隣のマスが空白のとき,ユーザがhキーを押したら,白猫が現在いるマスよりも1マス左へ移動することを確認する.
- 白猫が現在いるマスの左隣が壁のとき,ユーザがhキーを押しても白猫がどこへも移動しないことを確認する.
- 左へ移動しようとする際に,白猫が左を向いた画像が表示されていることを確認する.
- 左へ移動しようとする際に,白猫が左を向いた画像が0.5秒間隔で3枚を切り替えて表示されていることを確認する.
- 右へ進む機能
- 白猫が現在いるマスの右隣のマスが空白のとき,ユーザがlキーを押したら,白猫が現在いるマスよりも1マス右へ移動することを確認する.
- 白猫が現在いるマスの右隣が壁のとき,ユーザがlキーを押しても白猫がどこへも移動しないことを確認する.
- 右へ移動しようとする際に,白猫が右を向いた画像が表示されていることを確認する.
- 右へ移動しようとする際に,白猫が右を向いた画像が0.5秒間隔で3枚を切り替えて表示されていることを確認する.
- 上へ進む機能
- 白猫が現在いるマスの上隣のマスが空白のとき,ユーザがkキーを押したら,白猫が現在いるマスよりも1マス上へ移動することを確認する.
- 白猫が現在いるマスの上隣が壁のとき,ユーザがkキーを押しても白猫がどこへも移動しないことを確認する.
- 上へ移動しようとする際に,白猫が上を向いた画像が表示されていることを確認する.
- 上へ移動しようとする際に,白猫が上を向いた画像が0.5秒間隔で3枚を切り替えて表示されていることを確認する.
- 下へ進む機能
- 白猫が現在いるマスの下隣のマスが空白のとき,ユーザがjキーを押したら,白猫が現在いるマスよりも1マス下へ移動することを確認する.
- 白猫が現在いるマスの下隣が壁のとき,ユーザがjキーを押しても白猫がどこへも移動しないことを確認する.
- 下へ移動しようとする際に,白猫が下を向いた画像が表示されていることを確認する.
- 下へ移動しようとする際に,白猫が下を向いた画像が0.5秒間隔で3枚を切り替えて表示していることを確認する.
- 左へ進む機能
以下では,グループで実現してもらいたい5つの必須機能について,仕様を示します.仕様に示されたユーザの願いをくみ取って,設計を行い,設計を参考にして実装し,実装し終えたものをテストしてください.なお,必須機能間で情報交換をしなければうまく進められないところが数多くあります.必要な情報交換を行って機能間の整合性を取るところまでが担当者の仕事です.
https://github.com/xyzyxJP/Prog2021-04/issues
MS Teamsから以下のファイルをダウンロードしてください.すべて同じディレクトリ内に置いてください.
- MapGame.java
- MapData.java
- MoveChara.java
- MapGameController.java
- MapGame.fxml
コンパイル・実行して動作を確認してください(javafxのパスは,以前の授業資料を参考にして確認するなどしてください.第8回授業で案内があったように設定を変更してパスを指定せずに実行できるようにしている方は,普段のやり方で実行してください).
$ javac –-module-path (javafxのパス) –-add-modules javafx.controls,javafx.fxml *.java
$ java –-module-path (javafxのパス) –-add-modules javafx.controls,javafx.fxml MapGame
以下に本課題における今後のスケジュールを示します.ここに示したスケジュールは,最低限のスケジュールです.ここに書かれているよりも早く進めることをお勧めします.特に,個別のプログラムはうまく動いても,結合するとうまく動かなくなる,ということはシステム開発の世界で頻繁に起こることです.1月中旬までに全体を作り終えるような気持ちで進めてください.
今回は各グループで,互いの得意なこと,好きなこと,経験してきたことなどについて自己紹介を行いながら,1.準備から6.発表会後まで,5.の最終発表会を除いた計5回の課題提出担当者の分担表を作成し,代表者1名が提出してください.各回の代表者は提出業務の担当者ですので,必要に応じてグループメンバーに催促し,提出できる状態まで取りまとめを行ってください.以下の分担表例のように,本日も含めると今後計5回,グループで課題提出を行う機会があります.1人につき1回程度,グループ課題を提出していただく計算になります.
<提出担当者表>(コピーして使用してください)
通し番号 | スケジュール | グループ課題提出者(例) |
---|---|---|
1 | 1.準備 | Aさん |
2 | 2.中間発表会 | Bさん |
3 | 3. 必須機能のみのゲームの提出 | Cさん |
4 | 4. 独自機能の設計・テストの提出 | Dさん |
5 | 6. 発表会後 | Eさん |
また,各機能の仕様・設計・実装・テストを誰が担当するのかを決めて分担表に記入し,代表者が提出してください.本課題でグループメンバーは,1人1つ以上の機能を実装していただきます.実装以外にも,仕様策定・設計とテストという仕事があります.各機能における仕様策定・設計・実装・テストは,それぞれ別の人が担当しなければなりません.これは,1つの機能を完成させる過程に複数の人を関与させることで,1人では気付かなかった勘違いを取り除いたり,1人では気付かなかったより良い実現の方法に気付いたりするという,協調の利点を生かすためです.システム開発現場でもこのように,異なる人が異なる観点から同じ機能を確認することは多々あります.例えば以下のように分担する方法が考えられます.独自機能は,他のグループにない機能を最低2つ考えて実現していただきます.
<分担表>(コピーして使用してください)
機能名 | 仕様 | 設計 | 実装 | テスト |
---|---|---|---|---|
必須機能1 | Aさん | Eさん | Bさん | |
必須機能2 | Bさん | Aさん | Cさん | |
必須機能3 | Cさん | Bさん | Aさん | |
必須機能4 | Dさん | Cさん | Bさん | |
必須機能5 | Eさん | Dさん | Cさん | |
独自機能1 | Aさん | Cさん | Eさん | Dさん |
独自機能2 | Bさん | Dさん | Aさん | Eさん |
1/7までに,これまでに実装し終えた必須機能の紹介,今後製作予定の独自機能の仕様の紹介,現在悩んでいること・困っていることを紹介してもらいます.また,各必須機能の仕様・設計・テストについて日本語で記述したものも提出していただきます.
1/14までに,必須機能5つを結合してひとつのゲームとしておおむね動くようになったもの(プログラムとfxml)をグループで1セット提出してください.まだできていない部分がある場合は,何ができていないのかを報告してください.
1/21までに,2つ以上の独自機能の設計とテストを日本語で記述したものを,グループで1セット提出してください.なお,中間発表会を踏まえて方針を変更することも可能とします.まだできていない部分がある場合は,何ができていないのかを報告してください.
1/28の最終発表会は遠隔リアルタイム(8:40~11:50)で行う予定です.作成したゲームの特徴を紹介し,特徴が際立つようなデモを行ってください.また,工夫した点などを説明してください.発表者や発表順は当日発表しますので,授業開始時点から全員が参加していること,全員が発表できるように準備しておくことが重要です.また,発表の際に,画面共有の操作を手伝うといったことは,発表者以外の人が行ってかまいません.
発表会終了後は,発表会当日に得られた情報も踏まえて,個人およびグループでレポートを作成し,グループでとりまとめて提出してください.内容は本資料末尾を参考にしてください.
画像や音楽などの素材はどのようなものを使用してもかまいません.ただし,素材を提供している人が示している利用規約を遵守してください.たとえば「いらすとや」では,規約の範囲内であれば個人・法人,商用・非商用問わず無料で素材を使用することができますが,規約の範囲外であれば著作者に問い合わせをする必要があります.参考(いらすとや利用規約) https://www.irasutoya.com/p/terms.html 注意しなければならないのは,同じように無料で使用することができる素材であっても,利用範囲や利用目的は作者の意図によって異なる点です.場合によっては,著作物の出処情報を併記する必要があったり,特定の目的に限って使用しなければならなかったりします.無料で使用できる場合でも,使い方によっては使用者側の責任が問われる場合がありますので,必ず利用規約を確認してください. 本グループ課題で,誰かが作成してくれた何らかの著作物を使用する場合は,学校での教育目的で使用すること,特定された相手のみに閉じた状態で公開されること,私的・非商用利用であることがポイントになります.もし著作物の使用に関して,利用規約を読んでも迷うことがあれば,教員やTAへ連絡してください. なお,無料で提供されているアプリなどのプログラムについても,ライセンス事項が定められています.UbuntuやJDKにも定められています.このあたりの総論は授業動画にも示していますので確認してください.
以下は期末レポートの予告です.当然ですが,虚偽申告があった場合には相応の処分となります.
- グループの自分以外の各メンバーがグループ課題の完成に向けてどのようなことをしたのか,1人ひとりについて記しましょう.代表して先生に質問した,グループメンバー間のケンカを仲裁した,オンラインで話し合いをすることを提案した,などの調整に関わる部分でもかまいません.
- 他のグループの発表会を聴いて疑問に思ったこと,素晴らしいと思ったことについて,それぞれ最低1点ずつ記しましょう
- 自分達のグループの進め方を振り返り,どのような点を改善すると今後もっとよい進め方ができると考えられるかを記しましょう
以上について書いたものをグループの代表者へ提出してください.提出はグループの代表者1名に行っていただきます.
- 作品のプログラム(fxmlも含む)
- どのような独自機能を作成したかの説明
- 5つの必須機能と2つ以上の独自機能についての役割分担表 ※以下は例.12月時点から変更があれば,変更箇所がわかるように記載する.
機能名 | 仕様 | 設計 | 実装 | テスト |
---|---|---|---|---|
必須機能1 | Aさん | Eさん | Bさん | |
必須機能2 | Bさん | Aさん | Cさん | |
必須機能3 | Cさん | Bさん | Aさん | |
必須機能4 | Dさん | Cさん | Bさん | |
必須機能5 | Eさん | Dさん | Cさん | |
独自機能1 | Aさん | Cさん | Eさん | Dさん |
独自機能2 | Bさん | Dさん | Aさん | Eさん |
- 5つの必須機能と2つ以上の独自機能について作成した仕様の文章,プログラム処理の内容を説明したもの(クラスやメソッドを作った場合はその名前も明記する),テスト項目の文章
- 実行結果
- PNG形式の画像と,このゲームで遊ぼうとする人(大学生程度を想定)へのごく簡単な事前説明
- グループメンバーの個人レポート
- メンバー全員から集めた個人レポートをそのまま貼り付ける
- 参考文献
- 今回の課題を進めるに当たって参考にした書籍,webサイトのURL,人の発言などを列挙
- 謝辞
- グループ以外の人で,課題達成までに特に協力してくれた人や団体があれば明記