diff --git a/courseC/DescriptionAlgolike.html b/courseC/DescriptionAlgolike.html new file mode 100644 index 0000000..08d5a02 --- /dev/null +++ b/courseC/DescriptionAlgolike.html @@ -0,0 +1,66 @@ + + + +Argolike説明 + + + + +

Algolike の概要説明

+

「Algolike」は,カードゲーム「algo」を基にしたゲームプログラムです.

+

Algolikeでは,「0」から「11」までの数字が書かれた計12枚のカードを用いて,プレイヤーとCPUが対戦します.

+ + +

ゲーム開始時,12枚のカードを裏向けにして山札を作り,これを「デッキ」とします.
+ そして,各プレイヤーにデッキからカードを2枚配り.それを各プレイヤーの最初の「手札」とします.
+ なお,各プレイヤーは自分から見て左側から数字が小さい順になるように,相手にわからないよう手札のカードを裏向けにして並べなければなりません.
+ 画面では,裏向きになっているカードは黒色で表示されます.(自分の手札は下側に表示されます)
+ +

ゲームはプレイヤーが交互に「アタック」という行動を繰り返して進行していきます.
+ アタックとは,相手の裏のカードを選んで,その数字を当てていくことをいいます.
+ 以下では,行動しているプレイヤーを「自分」,自分からみた相手プレイヤーを「相手」とします.

+ +

デッキにカードが存在する場合

+ + +

デッキにカードが存在しない場合

+ + +

この時,相手は選ばれたカードと宣言された数字が一致しているかどうかを「Yes」か「No」で答えます.
+ もし「No」だった場合,アタックは失敗となり,アタックに使用した自分のカードを表にして数字順になるように自分の手札に加えます.
+ 画面では,表になったカードは白色で表示されます. +

+ もし「Yes」だった場合,アタックは成功となり,相手は当てられたカードを表にします. + アタックに使用した自分のカードは裏向きのまま,数字順になるように自分の手札に加えます.

+ + +

そして,ターンを相手に渡します.

+ +

これを交互に繰り返します。

+ +

プレイヤーの手札のカードが全て表になったとき、そのプレイヤーはゲームに敗北します。

+ + + +

プレイヤーの手札のカードが全て表になったとき、そのプレイヤーはゲームに敗北します。

+

+次へ +

+ + diff --git a/courseC/EnvironmentAlgolike.html b/courseC/EnvironmentAlgolike.html new file mode 100644 index 0000000..df08bde --- /dev/null +++ b/courseC/EnvironmentAlgolike.html @@ -0,0 +1,46 @@ + + + + Argolike の環境構築とテスト + + + + + +

Algolike の環境構築とテスト

+

Algolike の Github のリポジトリはこちらです.クローンしてお手元の開発環境でビルドをし,動作確認を行ってください.

+ +

Algolike は Gradle プロジェクトとして作成しています.
+

+ プログラムを実行する際は,Gradle タスクの中から「application/run」を実行してください.
+ +

+

Algolike のテストコードは /src/test/java/MainTest.java にあります.JUnitでテストすることができます.

+

Algolike のテストシナリオ

+

MainTest.java では Algolike における以下の一連の動作をテストしています. +

    +
  1. 自分はカードを1枚引き,自分から見て右から1番目にあるCPUのカードに対して「1」を宣言する.
  2. +
  3. 自分のアタックは失敗する.
  4. +
  5. CPUはカードを1枚引き,自分の手札の左から3番目のカードに対して「2」を宣言する.
  6. +
  7. CPUのアタックは失敗する.
  8. +
  9. 自分はカードを1枚引き,右から2番目にあるCPUのカードに対して「3」を宣言する.
  10. +
  11. 自分のアタックは成功する.
  12. +
  13. CPUはカードを1枚引き,自分の手札の左から1番目のカードに対して「2」を宣言する.
  14. +
  15. CPUのアタックは失敗する.
  16. +
  17. 自分は左から1番目のカードをアタックに使用し,CPUの右から1番目のカードに対して「1」を宣言する.
  18. +
  19. 自分のアタックは成功する.
  20. +
  21. CPUの手札が全て表になったので,CPUは敗北する.
  22. +
+

+ +

+次へ +

+ + diff --git a/courseC/ProblemC1.html b/courseC/ProblemC1.html new file mode 100644 index 0000000..a09cac9 --- /dev/null +++ b/courseC/ProblemC1.html @@ -0,0 +1,102 @@ + + + + 課題C1 + + + + + +

課題C1

+ +
+ +

課題の概要

+ +

+ 課題C1では,Algolike の HandsA から LoseA へのデータ転送について見ていきます. + HandsA は,プレイヤーのすべての手札を管理しているクラスで,LoseAは各ターンでプレイヤーがゲームに負けたか否かを表すクラスです.
+ この課題では, + +

+ 「HandsA の情報が更新されたときにその情報を LoseA にPUSH型で転送しているプログラムを,PULL型で転送するようにリファクタリングすること」 +
+ + を目的とします.
+ リファクタリングの詳しい作業手順は以下で説明します. +

+ +
+ +

リファクタリング作業

+ +

+ 以下では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.
+ 時間計測にあたって,急いで作業していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください.
+ この課題で作業していただく内容は, +

+ 「HandsA の情報が更新されたときにその情報を LoseA にPUSH型で転送しているプログラムを,PULL型で転送するようにリファクタリングすること」 +
+ です.
+ 開発環境を立ち上げてソースコードの確認をしていただいて構いませんが,ソースコードの変更は時間計測の準備ができるまで行わないで下さい.
+ リファクタリングの作業手順を以下に説明します. +

+

+ まず,現時点での HandsA から LoseA へのデータ転送に関するクラス図とシーケンス図を以下に示します.
+ +
+ 現時点ではPUSH型のデータ転送で実装されているため,HandsA クラスの updateResultBy...() メソッドから LoseA クラスの updateHandsA() メソッドを呼び出すために HandsA クラスが LoseA クラスを参照していています.
+ ここで Algo クラスは,初期化時に HandsA クラスや LoseA クラスのインスタンスを生成し,それらのインスタンスを関連付ける役割を担っています.
+ また,HandsA クラスや LoseA クラスにアクセスするための入口(Facade)としての役割も担っています.
+ Algo,HandsA,LoseA クラスのいずれも resources パッケージの中に入っています.
+

+

+ これを,以下のクラス図とシーケンス図に示すようなPULL型のデータ転送になるよう,手作業でリファクタリングを行っていただきます.
+ +
+ 今度はPULL型のデータ転送であるため,LoseA クラスの getValue() メソッドから HandsA クラスの getValue() メソッドを呼び出すために LoseA クラスが HandsA クラスを参照していることに注意してください.
+

+

+ リファクタリングの作業手順の詳細を以下に示します.
+

    +
  1. テストプログラムを実行して正しく動作することを確認する.
  2. +
  3. LoseA クラスに,handsA クラスのインスタンスを参照するフィールド HandsA handsA を追加する.
  4. +
  5. LoseA クラスのコンストラクタを,HandsA クラスのインスタンスを引数に取るように書き換える.
  6. +
  7. HandsA クラスのコンストラクタを,LoseA クラスのインスタンスを引数に取らないように書き換える.
  8. +
  9. HandsA クラスのフィールド loseA を削除する.
  10. +
  11. Algo クラスのコンストラクタ内で,LoseA クラスのインスタンスが HandsA クラスのインスタンスを参照するよう,インスタンスの生成順や生成方法を変更する.
  12. +
  13. LoseA クラスのプレイヤーの勝敗結果を保存するためのフィールド boolean value を削除する.
  14. +
  15. HandsA クラスの updateResultBy...() メソッド(4つある)の最後の LoseA クラスの updateHandsA() メソッドの呼び出し文を削除する.
  16. +
  17. LoseA クラスの getValue() メソッドを HandsA クラスの getValue() メソッドを呼び出すように書き換える.
  18. +
  19. LoseA クラスの updateHandsA() メソッド内で行っていた,プレイヤーの手札の情報をもとに勝敗判定を行う処理を,getValue() メソッドに移動し,判定結果を getValue() メソッドの戻り値として返すようにする.
  20. +
  21. LoseA クラスの void updateHandsA(List<Card> handsA) メソッドを削除する.
  22. +
  23. テストプログラムを実行して正しく動作することを確認する.
  24. +
+

+

+ 作業に着手する前に,メッセージでお伝えした自分専用のブランチ(user??)を切って,一度プッシュを行ってください.
+ プッシュを行った後,開発環境の準備ができれば,時間計測を開始してください. 時間計測はできる限り,1分以内の単位での計測をお願いします.
+ テストプログラムが正しく動作するまでは作業完了とは見なされないので注意してください. +

+ +

+ リファクタリングの作業が完了したら作業時間を記録し,その後,作業結果を自分専用のブランチにコミット&プッシュしてください.
+ ただし,main ブランチには決してマージをしないように,また自分専用のブランチを決して削除しないように注意してください.
+ プッシュ後に,以下のアンケートにお答えください. +

+ +
+ アンケート回答 +
+ +
+ +

+次へ + diff --git a/courseD/DescriptionAlgolike.html b/courseD/DescriptionAlgolike.html new file mode 100644 index 0000000..08d5a02 --- /dev/null +++ b/courseD/DescriptionAlgolike.html @@ -0,0 +1,66 @@ + + + +Argolike説明 + + + + +

Algolike の概要説明

+

「Algolike」は,カードゲーム「algo」を基にしたゲームプログラムです.

+

Algolikeでは,「0」から「11」までの数字が書かれた計12枚のカードを用いて,プレイヤーとCPUが対戦します.

+ + +

ゲーム開始時,12枚のカードを裏向けにして山札を作り,これを「デッキ」とします.
+ そして,各プレイヤーにデッキからカードを2枚配り.それを各プレイヤーの最初の「手札」とします.
+ なお,各プレイヤーは自分から見て左側から数字が小さい順になるように,相手にわからないよう手札のカードを裏向けにして並べなければなりません.
+ 画面では,裏向きになっているカードは黒色で表示されます.(自分の手札は下側に表示されます)
+ +

ゲームはプレイヤーが交互に「アタック」という行動を繰り返して進行していきます.
+ アタックとは,相手の裏のカードを選んで,その数字を当てていくことをいいます.
+ 以下では,行動しているプレイヤーを「自分」,自分からみた相手プレイヤーを「相手」とします.

+ +

デッキにカードが存在する場合

+ + +

デッキにカードが存在しない場合

+ + +

この時,相手は選ばれたカードと宣言された数字が一致しているかどうかを「Yes」か「No」で答えます.
+ もし「No」だった場合,アタックは失敗となり,アタックに使用した自分のカードを表にして数字順になるように自分の手札に加えます.
+ 画面では,表になったカードは白色で表示されます. +

+ もし「Yes」だった場合,アタックは成功となり,相手は当てられたカードを表にします. + アタックに使用した自分のカードは裏向きのまま,数字順になるように自分の手札に加えます.

+ + +

そして,ターンを相手に渡します.

+ +

これを交互に繰り返します。

+ +

プレイヤーの手札のカードが全て表になったとき、そのプレイヤーはゲームに敗北します。

+ + + +

プレイヤーの手札のカードが全て表になったとき、そのプレイヤーはゲームに敗北します。

+

+次へ +

+ + diff --git a/courseD/EnvironmentAlgolike.html b/courseD/EnvironmentAlgolike.html new file mode 100644 index 0000000..19d8836 --- /dev/null +++ b/courseD/EnvironmentAlgolike.html @@ -0,0 +1,46 @@ + + + + Argolike の環境構築とテスト + + + + + +

Algolike の環境構築とテスト

+

Algolike の Github のリポジトリはこちらです.クローンしてお手元の開発環境でビルドをし,動作確認を行ってください.

+ +

Algolike は Gradle プロジェクトとして作成しています.
+

+ プログラムを実行する際は,Gradle タスクの中から「application/run」を実行してください.
+ +

+

Algolike のテストコードは /src/test/java/MainTest.java にあります.JUnitでテストすることができます.

+

Algolike のテストシナリオ

+

MainTest.java では Algolike における以下の一連の動作をテストしています. +

    +
  1. 自分はカードを1枚引き,自分から見て右から1番目にあるCPUのカードに対して「1」を宣言する.
  2. +
  3. 自分のアタックは失敗する.
  4. +
  5. CPUはカードを1枚引き,自分の手札の左から3番目のカードに対して「2」を宣言する.
  6. +
  7. CPUのアタックは失敗する.
  8. +
  9. 自分はカードを1枚引き,右から2番目にあるCPUのカードに対して「3」を宣言する.
  10. +
  11. 自分のアタックは成功する.
  12. +
  13. CPUはカードを1枚引き,自分の手札の左から1番目のカードに対して「2」を宣言する.
  14. +
  15. CPUのアタックは失敗する.
  16. +
  17. 自分は左から1番目のカードをアタックに使用し,CPUの右から1番目のカードに対して「1」を宣言する.
  18. +
  19. 自分のアタックは成功する.
  20. +
  21. CPUの手札が全て表になったので,CPUは敗北する.
  22. +
+

+ +

+次へ +

+ + diff --git a/courseD/ProblemD1.html b/courseD/ProblemD1.html new file mode 100644 index 0000000..ee2084e --- /dev/null +++ b/courseD/ProblemD1.html @@ -0,0 +1,102 @@ + + + + 課題D1 + + + + + +

課題D1

+ +
+ +

課題の概要

+ +

+ 課題D1では,Algolike の HandsA から LoseA へのデータ転送について見ていきます. + HandsA は,プレイヤーのすべての手札を管理しているクラスで,LoseAは各ターンでプレイヤーがゲームに負けたか否かを表すクラスです.
+ この課題では, + +

+ 「HandsA の情報が更新されたときにその情報を LoseA にPULL型で転送しているプログラムを,PUSH型で転送するようにリファクタリングすること」 +
+ + を目的とします.
+ リファクタリングの詳しい作業手順は以下で説明します. +

+ +
+ +

リファクタリング作業

+ +

+ 以下では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.
+ 時間計測にあたって,急いで作業していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください.
+ この課題で作業していただく内容は, +

+ 「HandsA の情報が更新されたときにその情報を LoseA にPULL型で転送しているプログラムを,PUSH型で転送するようにリファクタリングすること」 +
+ です.
+ 開発環境を立ち上げてソースコードの確認をしていただいて構いませんが,ソースコードの変更は時間計測の準備ができるまで行わないで下さい.
+ Algo,HandsA,LoseA クラスのいずれも resources パッケージの中に入っています.
+ リファクタリングの作業手順を以下に説明します. +

+

+ まず,現時点での HandsA から LoseA へのデータ転送に関するクラス図とシーケンス図を以下に示します.
+ +
+ 現時点ではPULL型のデータ転送で実装されているため,LoseA クラスの getValue() メソッドから HandsA クラスの getValue() メソッドを呼び出すために LoseA クラスが HandsA クラスを参照しています.
+ ここで Algo クラスは,初期化時に HandsA クラスや LoseA クラスのインスタンスを生成し,それらのインスタンスを関連付ける役割を担っています.
+ また,HandsA クラスや LoseA クラスにアクセスするための入口(Facade)としての役割も担っています.
+

+

+ これを,以下のクラス図とシーケンス図に示すようなPUSH型のデータ転送になるよう,手作業でリファクタリングを行っていただきます.
+ +
+ 今度はPUSH型のデータ転送であるため,HandsA クラスの updateResultBy...() メソッドから LoseA クラスの updateHandsA() メソッドを呼び出すために HandsA クラスが LoseA クラスを参照していることに注意してください.
+

+

+ リファクタリングの作業手順の詳細を以下に示します.
+

    +
  1. テストプログラムを実行して正しく動作することを確認する.
  2. +
  3. HandsA クラスに,LoseA クラスのインスタンスを参照するフィールド LoseA loseA を追加する.
  4. +
  5. HandsA クラスのコンストラクタを,LoseA クラスのインスタンスを引数に取るように書き換える.
  6. +
  7. LoseA クラスのコンストラクタを,HandsA クラスのインスタンスを引数に取らないように書き換える.
  8. +
  9. LoseA クラスのフィールド handsA を削除する.
  10. +
  11. Algo クラスのコンストラクタ内で,HandsA クラスのインスタンスが LoseA クラスのインスタンスを参照するよう,インスタンスの生成順や生成方法を変更する.
  12. +
  13. LoseA クラスにプレイヤーの勝敗結果を保存するためのフィールド boolean value を追加する.
  14. +
  15. LoseA クラスに void updateHandsA(List<Card> handsA) メソッドを追加する.
  16. +
  17. HandsA クラスの updateResultBy...() メソッド(4つある)を,最後に LoseA クラスの updateHandsA() メソッドをフィールド value を引数として呼び出すように書き換える.
  18. +
  19. LoseA クラスの getValue() メソッド内で行っていた,プレイヤーの手札の情報をもとに勝敗判定を行う処理を,updateHandsA() メソッドに移動し,判定結果を value フィールドに保存するようにする.
  20. +
  21. LoseA クラスの getValue() メソッドを value フィールドの値を返すように書き換える.
  22. +
  23. テストプログラムを実行して正しく動作することを確認する.
  24. +
+

+

+ 作業に着手する前に,メッセージでお伝えした自分専用のブランチ(user??)を切って,一度プッシュを行ってください.
+ プッシュを行った後,開発環境の準備ができれば,時間計測を開始してください. 時間計測はできる限り,1分以内の単位での計測をお願いします.
+ テストプログラムが正しく動作するまでは作業完了とは見なされないので注意してください. +

+ +

+ リファクタリングの作業が完了したら作業時間を記録し,その後,作業結果を自分専用のブランチにコミット&プッシュしてください.
+ ただし,main ブランチには決してマージをしないように,また自分専用のブランチを決して削除しないように注意してください.
+ プッシュ後に,以下のアンケートにお答えください. +

+ +
+ アンケート回答 +
+ +
+ +

+次へ + diff --git a/images/algo_seq_pull.jpg b/images/algo_seq_pull.jpg new file mode 100644 index 0000000..e9334cb --- /dev/null +++ b/images/algo_seq_pull.jpg Binary files differ