1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-03

前回はこちら

方針

前回の記事の最後で、簡単な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);
    }
}

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

次回はこちら

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?