LoginSignup
1
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-07

前回はこちら

Deckクラスを作る

はい、今回はやっとデッキを作っていきます。
前回、折角作った紙束インターフェースをしっかり使っていきましょう。

まずはClassを作る

public class Deck{
    private Stack<Card> deck = new Stack();
}

はい、デッキができました。

というのは流石に冗談ですが、カードをStackとして持つDeckクラスができました。
ちなみにJavaのStackはListのサブクラスです。

デッキは基本的にはトップから取り出す操作しか行わないため、配列や線形リストではなくスタックを利用しました。

CardSheafを実装する。

public class Deck implements CardSheaf {

    private Stack<Card> deck = new Stack<>();

    public Deck(List<Card> deck) {
        this.deck.addAll(deck);
    }

    public Deck(Card... deck) {
        this.deck.addAll(Arrays.asList(deck));
    }

    @Override
    public int indexOf(Card card) {
        return CardSheaf.indexOf(deck, card);
    }

    //CardSheafクラスではcardSizeの標準実装を提供していないため、実装した。
    //要素数を取り出すだけ。
    @Override
    public int cardSize() {
        return deck.size();
    }

    @Override
    public void addCard(Card card) {
        CardSheaf.addCard(deck, card);
    }

    @Override
    public void removeCard(Card card) {
        CardSheaf.removeCard(deck, card);
    }

    @Override
    public void removeCard(int index) {
        CardSheaf.removeCard(deck, index);
    }

    @Override
    public Card find(int number, Card.Mark mark) {
        return CardSheaf.find(deck, number, mark);
    }

    @Override
    public int indexOf(int number, Card.Mark mark) {
        return CardSheaf.indexOf(deck, number, mark);
    }

    @Override
    public Card getCard(int index) {
        return CardSheaf.getCard(deck, index);
    }

    @Override
    public Card takeCard(int index) {
        return CardSheaf.takeCard(deck, index).getValue();
    }
}

Deckクラスでは、カードをListで扱うため、CardSheafのstaticメソッドをそのまま利用した。

Deckに必要なメソッドを定義する

import java.util.*;

public class Deck implements CardSheaf {

    private Stack<Card> deck = new Stack<>();

    /**
     * リスト内のカードでデッキを初期化する。
     * @param deck 初めにデッキ内に置きたいカードすべてのリスト
     */
    public Deck(List<Card> deck) {
        this.deck.addAll(deck);
    }

    /**
     * 配列内のカードでデッキを初期化する。
     * @param deck 初めにデッキ内に置きたいカードすべての配列
     */
    public Deck(Card... deck) {
        this.deck.addAll(Arrays.asList(deck));
    }

    //略
    /**
     * デッキの一番上のカードを取り出す。
     */
    public Card take_top() {
        return deck.pop();
    }

    /**
     * ゲーム開始時の先攻判定に用いる。
     * @return デッキの一番上のカード
     */
    public Card first_step() {
        return this.take_top();
    }

    /**
     * カードをドローする。
     * @return デッキの一番上のカード
     */
    public Card draw() {
        return this.take_top();
    }

    /**
     * ダメージを受けたときに呼ばれる。
     * @return デッキの一番上のカード
     */
    public Card damage() {
        return this.take_top();
    }

    /**
     * デッキをシャッフルする。
     */
    public void shuffle() {
        Collections.shuffle(deck);
    }

    /**
     * デッキ内にカードが存在するかどうかを判定する。
     * @return デッキ内にカードがあるならtrue、ないならfalse
     */
    public boolean hasCard() {
        return cardSize() > 0;
    }
}

では、今回はここまで。

次回は手札を実装予定です。

次回はこちら

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