Step7:移動ルール制約の追加
すべてのコマは移動可能なマス目がルールによって定められている(例:ひよこは自分の正面に1マスしか進めない).本Stepでは,すべてのコマについてそのルールを実装し,ルールで定められた箇所以外には進めないようにする.
全タスク一覧
[Task7-1]AbstractAreaクラスの更新
[Task7-2]KomaStatusクラスの更新
[Task7-3-a]Hiyokoクラスの更新
[Task7-3-b]Kirinクラスの更新
[Task7-3-c]Lionクラスの更新
[Task7-3-d]Zouクラスの更新
[Task7-3-e]Niwatoriクラスの更新
[Task7-4]AbstractKomaクラスの更新
タスク間の依存関係
- Task7-1,7-2,7-3-*,7-4はこの順に実施すること.ただしTask7-3-a~eはTask7-1,7-2が終わっていればどの順に実施しても構わない.Task7-4はTask7-3-a~eすべてが完了後に実施すること.
- コマの制約が正常に動作するかはTask7-4終了時に確認できる
担当者決定
担当者を決定する.開発担当とレビュー担当をTask毎に決定し,記述すること.なお,特定のTaskについて,開発者とレビュアーを同じ人がやってはいけない.また,複数のTaskを一人でまとめて実施しても構わないが,Step毎に最低2人は開発を担当すること.
Task 7-1 | Task 7-2 | Task 7-3-a | Task 7-3-b | Task 7-3-c | Task 7-3-d | Task 7-3-e | Task 7-4 | |
---|---|---|---|---|---|---|---|---|
開発 | ||||||||
レビュー |
[Task7-1]AbstractAreaクラスの更新
実施内容
AbstractAreaクラスに指定した座標がそのエリア内であるかをtrue/falseで返すisInThisArea()
メソッドを追加する
isInThisArea()
メソッドは,そのエリアのposX
,posY
,tate
,yoko
の値を用いて,指定した座標(x,y)がそのエリア内にいるかどうかをtrue/falseで返す.
AbstractAreaクラス
boolean isInThisArea(int x, int y) {
if (x>=this.posX && x<this.posX+this.yoko && y>=this.posY && y<this.posY+this.tate) return true;
else return false;
}
レビュー項目
- 正常に実行することが可能で,AbstractAreaクラスの
isInThisArea()
メソッドが↑と同じ処理であるかを確認する
[Task7-2]KomaStatusクラスの更新
実施内容
KomaStatusクラスにそのコマが取られたコマであるかどうかを示すisCaptured()
を追加する
isCaptured()
メソッドは,activeとcapturedの両方がtrueのときに,返り値としてtrueを返す.つまり,盤面に存在しており(active=true),持ちゴマエリアにいる(captured=true)場合にtrueを返す
KomaStatus
boolean isCaptured() {
return this.active && this.captured;
}
レビュー項目
- 正常に実行することが可能で,KomaStatusクラスの
isCaptured()
メソッドが↑と同じ処理であるかを確認する
[Task7-3-a]Hiyokoクラスの更新
実施内容
Hiyokoクラスに,指定したマスにそのHiyokoが移動可能であるかをtrue/falseで返すcanMove()
メソッドを追加する.
canMove()
メソッドでは下記の条件をチェックし,true/falseを返す- 移動先の座標(toX, toY)がBaseArea内でなければfalseを返す
- Hiyokoは前方1マスにのみ移動できるため,Left側/Right側それぞれの場合において,移動先が現在のコマの場所の1コマ先である場合のみtrueを返す
- 上記の条件をどれも満たさない場合はfalseを返す
Hiyokoクラス
boolean canMove(int toX, int toY) {
if (!board.bArea.isInThisArea(toX,toY)) return false;
if (this.team == 0 && toX-this.x==1 && toY-this.y==0) return true;
else if (this.team == 1 && this.x-toX==1 && toY-this.y==0) return true;
return false;
}
レビュー項目
- 正常に実行が可能であり,Hiyokoクラスの
canMove()
メソッドが↑と同一の処理であることを確認する.
[Task7-3-b]Kirinクラスの更新
実施内容
Kirinクラスに,指定したマスにそのKirinが移動可能であるかをtrue/falseで返すcanMove()
メソッドを追加する.
canMove()
メソッドでは下記の条件をチェックし,true/falseを返す- 移動先の座標(toX, toY)がBaseArea内でなければfalseを返す
- Kirinは前後左右に1マス移動できるため,現在の場所と移動先の関係が前後左右いずれかの方向に1マスのみ移動している場合にtrueを返す
- 上記の条件をどれも満たさない場合はfalseを返す
Kirinクラス
boolean canMove(int toX, int toY) {
if (!board.bArea.isInThisArea(toX,toY)) return false;
if (abs(toX-this.x)+abs(toY-this.y) ==1) return true;
return false;
}
レビュー項目
- 正常に実行が可能であり,Kirinクラスの
canMove()
メソッドが↑と同一の処理であることを確認する.
[Task7-3-c]Lionクラスの更新
実施内容
Lionクラスに,指定したマスにそのLionが移動可能であるかをtrue/falseで返すcanMove()
メソッドを追加する.
canMove()
メソッドでは下記の条件をチェックし,true/falseを返す- 移動先の座標(toX, toY)がBaseArea内でなければfalseを返す
- Lionは前後左右斜めに1マス移動できるため,現在の場所と移動先の関係が前後左右斜めいずれかの方向に1マスのみ移動している場合にtrueを返す
- 上記の条件をどれも満たさない場合はfalseを返す
Lionクラス
boolean canMove(int toX, int toY) {
if (!board.bArea.isInThisArea(toX,toY)) return false;
if (abs(toX-this.x) <= 1 && abs(toY-this.y) <=1) return true;
return false;
}
レビュー項目
- 正常に実行が可能であり,Lionクラスの
canMove()
メソッドが↑と同一の処理であることを確認する.レビュー項目
[Task7-3-d]Zouクラスの更新
実施内容
Zouクラスに,指定したマスにそのZouが移動可能であるかをtrue/falseで返すcanMove()
メソッドを追加する.
canMove()
メソッドでは下記の条件をチェックし,true/falseを返す- 移動先の座標(toX, toY)がBaseArea内でなければfalseを返す
- Zouは斜め方向に1マス移動できるため,現在の場所と移動先の関係がいずれかの斜め方向に1マスのみ移動している場合にtrueを返す
- 上記の条件をどれも満たさない場合はfalseを返す
Zouクラス
boolean canMove(int toX, int toY) {
if (!board.bArea.isInThisArea(toX,toY)) return false;
if (abs(toX-this.x) ==1 && abs(toY-this.y) ==1) return true;
return false;
}
レビュー項目
- 正常に実行が可能であり,Zouクラスの
canMove()
メソッドが↑と同一の処理であることを確認する.
[Task7-3-e]Niwatoriクラスの更新
実施内容
Niwatoriクラスに,指定したマスにそのNiwatoriが移動可能であるかをtrue/falseで返すcanMove()
メソッドを追加する.
canMove()
メソッドでは下記の条件をチェックし,true/falseを返す- 移動先の座標(toX, toY)がBaseArea内でなければfalseを返す
- Niwatoriは斜め後ろ以外のすべての方向に1マス移動できるため,現在の場所と移動先の関係が斜め後ろでない場合にtrueを返す
- 上記の条件をどれも満たさない場合はfalseを返す
Niwatoriクラス
boolean canMove(int toX, int toY) {
if (!board.bArea.isInThisArea(toX,toY)) return false;
if (this.team==0 && abs(toX-this.x)<=1 && abs(toY-this.y)<=1 && (this.x-toX+abs(this.y-toY))<2) return true;
if (this.team==1 && abs(toX-this.x)<=1 && abs(toY-this.y)<=1 && (toX-this.x+abs(this.y-toY))<2) return true;
return false;
}
レビュー項目
- 正常に実行が可能であり,Niwatoriクラスの
canMove()
メソッドが↑と同一の処理であることを確認する.
[Task7-4]AbstractKomaクラスの更新
実施内容
AbstractKomaクラスに抽象メソッドcanMove()
を追加し,move()
メソッドをcanMove()
メソッドを利用するように変更する
- 抽象(abstract)メソッド
canMove()
を追加する- 抽象メソッドを追加することで,AbstractKomaクラスを継承するすべてのクラスで,このメソッドが実装されることを保証できる.
move()
メソッドでは以下の処理を実装する- 取られたコマは任意のマス(コマが配置されていないマスに限る)にコマを置くことができる.
- BaseAreaにあるコマは
canMove()
メソッドからtrueが返ってきた場合に限り,相手のコマの取得及び移動を行うことができる
AbstractKomaクラス
abstract boolean canMove(int toX, int toY);
void move(int toX, int toY) {
AbstractKoma koma = komaList.getKomaFromPlace(toX, toY);
if (this.kStat.isCaptured() && koma==null) {
this.updatePos(toX, toY);
} else if((koma==null || koma.team != gs.turn) && this.canMove(toX, toY)) {
this.moveAndCapture(koma, toX, toY);
}
}
レビュー項目
- 正常に実行できるか確認する
- Hiyokoがルールに則ったマスにのみ移動できるか確認する
- Kirinがルールに則ったマスにのみ移動できるか確認する
- Lionがルールに則ったマスにのみ移動できるか確認する
- Zouがルールに則ったマスにのみ移動できるか確認する
- 上記すべてのコマについて,持ちゴマエリアにあるコマがコマの置いていないBaseArea内の任意のマスに移動でき,BaseArea外に移動できないことを確認する
- 上記すべてのコマがBaseArea外に移動できないことを確認する
実行例(見え方はこれまでのStepと同じ.コマが移動可能とルールで定められているマス以外には移動できないように実装されていることを確認すること)