オンラインカードゲームのサーバーサイドを作った②

[前回はこちら](https://qiita.com/Kakky/items/0d2509ebcae12e3376b6)

# 方針
前回の記事の最後で、簡単なUML図を示しました。
今後の記事では、図の下方から上方へ向かって実装していきたいと思います。

# カードクラスを作る

まず、最低限のカードクラスを作ってみます。
BlackPokerはトランプを用いたゲームなので、マーク・数字が必要になります。
マークは、♠・♦・♥・♣の4種類ですが、このゲームはジョーカーを利用するため、5種類のマークがあるとしておきます。
マークの型はintでも構わないのですが、不正な値はなるべく入らない方が望ましいため、列挙体を定義していきます。

```java
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|裏ならば防壁|

```java

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変数は怒られそうなので、ちゃんと書きます。

```java
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](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Cloneable.html)もついでに実装しておきます。

```java

public class Card implements Cloneable {
    // 略
    @Override
    public Card clone(){
        return new Card(number, attack, canAttack, mark, isCharge, isFront, job);
    }
}
```

次回は手札かデッキでも作っていきます。

[次回はこちら](https://qiita.com/Kakky/items/1f260b4061bde6e0a0b9)