Step9:その他の機能追加
- [追加機能1]:勝利確定時にInfoAreaをクリックすると最初からやり直す機能
- 現状では勝利確定時にWin!!と表示されるのみだが,表示されたあと,InfoAreaをクリックするとゲームがリセットされて,最初からやり直せるようにする
- [追加機能2]:Lionのトライ可能性チェック機能
- どうぶつしょうぎのルールにある下記記述にもとづき,ライオンが相手のエリア(陣地)に進む際に,ライオンが捕まってしまわないかをチェックし,捕まってしまう場合は進めないようにする機能
自分の「ライオン」が、相手のエリア(空か森)まで先にすすめたら勝ち!! ただし、すすめてもすぐに「ライオン」がつかまってしまう場合は負けです。
- [追加機能3]:持ちゴマエリアからの昇格禁止機能
- 下記ルールにもとづき,Hiyokoが持ちゴマにあるとき,敵の陣地にいきなり置いても昇格できないようにする機能
相手の「ニワトリ」をとっても、つかうときは「ひよこ」からスタートします。 持ち駒の「ひよこ」をつかうときは、相手のエリアに「ニワトリ」で置くことはできません。
全タスク一覧
[Task9-1]Doubutsu.pdeの更新(勝利確定時リセット機能)
[Task9-2]Lionクラスの更新(トライ可能性チェック機能)
[Task9-3]Hiyokoクラスの更新(持ちゴマエリアからの直接昇格禁止機能)
タスク間の依存関係
- どの順に実施しても構わない
担当者決定
担当者を決定する.開発担当とレビュー担当をTask毎に決定し,記述すること.なお,特定のTaskについて,開発者とレビュアーを同じ人がやってはいけない.また,複数のTaskを一人でまとめて実施しても構わないが,Step毎に最低2人は開発を担当すること.
Task 9-1 | Task 9-2 | Task 9-3 | |
---|---|---|---|
開発 | |||
レビュー |
[Task9-1]Doubutsu.pdeの更新(勝利確定時リセット機能)
実施内容
gs
,board
,komaList
の初期化処理をreset()
メソッドとしてくくりだし,setup()
メソッド及びmouseReleased()
メソッドから呼び出すようにする
mouseReleased()
メソッドではユーザのクリックしたマスと勝敗が決したかどうかで下記のように分岐するgs.win
の値が0以上(すなわち勝敗が決したら)になり,かつクリックした箇所がInfoArea内であった場合にreset()
メソッドを呼び出すgs.win
の値が0未満の場合はboard.select(x,y)
メソッドを呼び出す- それ以外の場合(すなわち
gs.win
の値が0以上でInfoArea以外をクリックした場合)は何も起きないようにする
- それ以外の場合(すなわち
Doubutsu.pde
final int SQUARESIZE = 100;
GameStatus gs;
Board board;
KomaList komaList;
void setup() {
reset();
surface.setSize(6*SQUARESIZE, 4*SQUARESIZE);
}
void draw() {
board.draw();
komaList.draw();
gs.checkWinner();
}
void mouseReleased() {
int x = mouseX/SQUARESIZE;
int y = mouseY/SQUARESIZE;
if (gs.win>=0 && board.iArea.isInThisArea(x,y)) this.reset();
else if (gs.win<0) board.select(x, y);
}
void reset() {
gs = new GameStatus();
board = new Board();
komaList = new KomaList();
}
レビュー項目
- 下図のように勝利が確定した後,InfoArea以外をクリックしても選択ができないことを確認する
- 同じくInfoAreaをクリックしたときにゲームがリセットされて初期状態に戻ることを確認する
[Task9-2]Lionクラスの更新(トライ可能性チェック機能)
実施内容
Lionが相手陣地に進入する(トライ)際に,そのLionが取得されるかどうかをチェックするisCapturedByEnemy()
メソッドを実装し,canMove()
メソッドを修正する.
isCapturedByEnemy()
メソッドはLionがトライするときに,そのLionを取ることが可能なコマが存在する場合に以下のアルゴリズムにもとづいてtrue
を返す.- Lionの移動先座標(toX,toY)の周囲8方向に存在する敵のコマ群のなかに,(toX,toY)に移動可能なコマが1つでもあった場合に
true
を返す.
- Lionの移動先座標(toX,toY)の周囲8方向に存在する敵のコマ群のなかに,(toX,toY)に移動可能なコマが1つでもあった場合に
canMove()
メソッドをLionが移動可能な方向をチェックする際に,同時にisCapturedByEnemy()
メソッドの結果がtrue
ではないかをチェックするように修正する.
Lionクラス
boolean canMove(int toX, int toY) {
if (!board.bArea.isInThisArea(toX,toY)) return false;
if (this.kStat.isCaptured())return true;
if ((abs(toX-this.x) <= 1 && abs(toY-this.y) <=1) && !this.isCapturedByEnemy(toX, toY)) return true;
return false;
}
boolean isCapturedByEnemy(int toX, int toY) {
if (this.team==0 && toX!=board.bArea.posX+board.bArea.yoko-1) return false;
if (this.team==1 && toX!=board.bArea.posX) return false;
ArrayList<AbstractKoma> enemies = new ArrayList<AbstractKoma>();
int[][] direction = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {0, -1}, {1, 0}, {1, 1}, {1, -1}};
for (int[] d : direction) {
AbstractKoma enemy = komaList.getKomaFromPlaceByTeam(toX+d[0], toY+d[1], (this.team+1)%2);
if (enemy!=null && !enemy.kStat.isCaptured()) enemies.add(enemy);
}
for (AbstractKoma k : enemies) {
if (k.canMove(toX, toY)) return true;
}
return false;
}
レビュー項目
- 下図のようにLionがトライを行う際に,移動すると敵のコマに取られるようなマス目にはLionが移動できないことをLeft/Right両方について確認する
[Task9-3]Hiyokoクラスの更新(持ちゴマエリアからの直接昇格禁止機能)
実施内容
HiyokoクラスのupdatePos()
メソッドを修正し,持ちゴマエリアにあるHiyokoを相手陣地に直接置いても昇格しないようにする
updatePos()
メソッドにおいて,Hiyokoのチームをif文で確認する際に,kStat.captured
の値がtrueでないかを確認する処理を追加する
Hiyokoクラス
void updatePos(int toX, int toY) {
if(this.team==0 && toX==board.bArea.posX+board.bArea.yoko-1 && !this.kStat.captured){
komaList.promote(this,toX,toY);
}else if(this.team==1 && toX==board.bArea.posX && !this.kStat.captured){
komaList.promote(this,toX,toY);
}
super.updatePos(toX,toY);
}
レビュー項目
- 下図のように持ちゴマエリアにあるHiyokoを相手陣地に直接置いても昇格しないことを確認する.