LoginSignup
0

More than 3 years have passed since last update.

posted at

updated at

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

前回はこちら

お詫び

少し詐欺を働きました。。。
今回はデッキも手札も実装致しません。

代わりに、カードをまとめて保持するクラスたちをまとめた抽象クラスを作りたいと思います。

カードの束インターフェースを作る

デッキ・手札・墓地などはすべて複数枚のカードを何らかのデータ構造で保持します。
そこで、カードの束インターフェースを作成しました。


public interface CardSheaf {
    /**
     * 渡されたカードオブジェクトがデータ構造でどの位置にあるかを返す。
     * データ構造はリストか配列であることをお願いする。
     * @param card 番号を知りたいカードのオブジェクト
     * @return 引数オブジェクトの構造内での番号
     */
    int indexOf(Card card);

    /**
     * カードの枚数を返す。
     * @return カードの枚数
     */
    int cardSize();

    /**
     * データ構造にカードを追加する。
     */
    void addCard(Card card);

    /**
     * データ構造からカードを削除する。
     */
    void removeCard(Card card);

    /**
     * データ構造からカードを削除する。
     */
    void removeCard(int index);

    /**
     * 数字とマークが一致するカードを返す。
     */
    Card find(int number, Card.Mark mark);

    /**
     * 数字とマークが一致するカードの番号を返す。
     */
    int indexOf(int number, Card.Mark mark);

    /**
     * 指定された番号にあるカードを返す。
     * 要素の削除はおこなわない。
     * @param index 欲しいカードの番号
     */
    Card getCard(int index);

    /**
     * 指定された番号にあるカードを取り出す。
     * カードはデータ構造から削除される。
     * @param index 欲しいカードの番号
     */
    Card takeCard(int index);
}

また、データ構造は配列(Array)かリスト(List)になってほしいので、なるべくそうなるようにインターフェースを作りました。

また、取り出す・探すなどの関数は共通化できることが考えられるので、静的なメソッドで用意しておきます。
(別に必要はないんですが、後で何度も同じ処理を書くのは嫌なので)

あと静的なメソッドなので、引数では取り敢えずlistを貰って、変更がある場合はlistを返却するという形にしました。

ペアやタプルはjavaの標準にはないため、Map.Entryで代用しました。


import java.util.HashMap;
import java.util.List;
import java.util.Map;

public interface CardSheaf {

    //略

    static int indexOf(List<Card> list, Card card){
        int i;
        for (i = 0; i < list.size(); i++) {
            Card c = list.get(i);
            if(c == null) continue;
            if(c.equals(card)) break;
        }
        if(i == list.size()) return -1;
        return i;
    }

    static List<Card> addCard(List<Card> list, Card card){
        list.add(card);
        return list;
    }

    static List<Card> removeCard(List<Card> list, Card card){
        list.remove(card);
        return list;
    }

    static List<Card> removeCard(List<Card> list, int index){
        list.remove(index);
        return list;
    }

    static Card find(List<Card> list, int number, Card.Mark mark){
        for (Card card: list){
            if(card == null) continue;
            if(card.getMark() == mark && card.getNumber() == number) return card;
        }
        return null;
    }

    static int indexOf(List<Card> list, int number, Card.Mark mark){
        int i;
        for (i = 0; i < list.size(); i++){
            Card card = list.get(i);
            if(card == null) continue;
            if(card.getMark() == mark && card.getNumber() == number) break;
        }
        if(i == list.size()) return -1;
        return i;
    }

    static Card getCard(List<Card> list, int index){
        return list.get(index);
    }

    static Map.Entry<List<Card>, Card> takeCard(List<Card> list, int index){
        Card card = list.get(index);
        list.remove(card);
        return new HashMap.SimpleEntry<List<Card>, Card>(list, card);
    }

次回はこちら

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
What you can do with signing up
0