方針
前回の記事の最後で、簡単なUML図を示しました。
今後の記事では、図の下方から上方へ向かって実装していきたいと思います。
カードクラスを作る
まず、最低限のカードクラスを作ってみます。
BlackPokerはトランプを用いたゲームなので、マーク・数字が必要になります。
マークは、♠・♦・♥・♣の4種類ですが、このゲームはジョーカーを利用するため、5種類のマークがあるとしておきます。
マークの型はintでも構わないのですが、不正な値はなるべく入らない方が望ましいため、列挙体を定義していきます。
public class Card {
public int number;
public Mark mark;
public Card(int number, Mark mark){
this.number = number;
this.mark = mark;
}
public enum Mark {
SPADE, DIAMOND, HEART, CLOVER, JOKER;
}
}
まだ完成ではありませんよ?
カードクラスでは、トランプのカードの持つ情報の他に、ゲーム内で仮想的に持つデータも保持する必要があります。
それぞれのカードは防壁・兵士など、置かれている場面で必要なパラメータは変化します。
今回は実装を簡単にするために、すべての場面に於けるパラメータを持っていてもらいます。
というのも、防壁はカード番号以外のパラメータが必要ないため、Cardクラスの持つパラメータは、精々兵士の分だけとなるからです。
今回は、以下のデータを保持してもらうことにします。
パラメータ | 型 | 補足 |
---|---|---|
攻撃力 | int | 今後スペル実装時に変動することが考えられる |
職業 | 列挙体 | 毎回番号比較するよりも効率が良い |
攻撃可能か | boolean | |
チャージされているか | boolean | 防壁・兵士問わず利用する |
カードの向き | boolean | 裏ならば防壁 |
import static blackpoker.Card.Job.*;
public class Card {
public int number;
public int attack;
public boolean canAttack;
public Mark mark;
public boolean isCharge;
public boolean isFront;
public Job job;
public Card(int number, Mark mark) {
this.number = number;
this.attack = this.number;
this.canAttack = false;
this.mark = mark;
this.isCharge = true;
this.isFront = false;
this.job = null;
if (this.number >= 2 && this.number <= 10) {
this.job = SOLDIER;
} else if (this.number >= 11 && this.number <= 13) {
this.job = HERO;
} else if (this.number == 1) {
this.job = ACE;
this.canAttack = true;
} else if (this.number == 0) {
this.job = MAGICIAN;
this.canAttack = true;
}
}
enum Mark {
SPADE, DIAMOND, HEART, CLOVER, JOKER;
}
enum Job {
SOLDIER, HERO, ACE, MAGICIAN;
}
}
追記
やっぱりpublic変数は怒られそうなので、ちゃんと書きます。
import static blackpoker.Card.Job.*;
public class Card {
private int number;
private int attack;
private boolean canAttack;
private Mark mark;
private boolean isCharge;
private boolean isFront;
private Job job;
//略
public int getNumber() {
return number;
}
private void setNumber(int number) {
this.number = number;
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
public boolean isCanAttack() {
return canAttack;
}
public void setCanAttack(boolean canAttack) {
this.canAttack = canAttack;
}
public Mark getMark() {
return mark;
}
private void setMark(Mark mark) {
this.mark = mark;
}
public boolean isCharge() {
return isCharge;
}
public void setCharge(boolean charge) {
isCharge = charge;
}
public boolean isFront() {
return isFront;
}
public void setFront(boolean front) {
isFront = front;
}
public Job getJob() {
return job;
}
private void setJob(Job job) {
this.job = job;
}
}
あと、Clonableもついでに実装しておきます。
public class Card implements Cloneable {
// 略
@Override
public Card clone(){
return new Card(number, attack, canAttack, mark, isCharge, isFront, job);
}
}
次回は手札かデッキでも作っていきます。