1

MatLAB でカード デッキ クラスを作成したいと考えています。MatLAB で OOP を体験するのはこれが初めてで、MatLAB はまったくの初心者です。私は2つのクラスを持つことを考えています:

  1. カード (プロパティ: タイプ [1-4]、値 [1-13])
  2. デッキ (デッキ内のカードのリスト/ベクターを含みます。後でこのクラスのメソッドを定義します。shuffle、drawCard など)

card.m:

classdef card
   properties
      type;    % number: 1-4
      value;   % number: 1-13
   end
   methods
      function obj = card(type, value)
         % some code to check [type, value] should be inserted here
         obj.type = type;
         obj.value = value;
      end
   end
end

これは私のクラスの生の構造であり、機能は後で提供されます。さて、デッキ クラスを定義するにはどうすればよいでしょうか。

また、デッキ クラスがカード インスタンスと通信できるようにしたいと考えています (正しいカードを確実に呼び出すため: [card(1,1), card(1,2), card(1,3), . .., card(4, 13)] などです。

助言がありますか?前もって感謝します!

4

2 に答える 2

1

デッキに直接アドレス指定する場合は、デッキ オブジェクトのインデックス作成を処理するsubsref関数を実装する必要があります。

d = deck();
d(33)

または、インデックス パラメータを使用して関数を追加します。

d = deck();
d.getCard(33)

最後のものはより適切で、実装も簡単です。

classdef deck
    properties
        cardstack=card;
    end
    methods(Static)
        function obj = deck()
            obj.cardstack(1:52) = card(); % array creation, will fail if card has no parameterless constructor
            for ii=1:4
                for jj=1:13
                    obj.cardstack((ii-1)*13+jj) = card(ii,jj);
                end
            end
        end
    end
    methods
        function crd = getCard(obj, idx)
            if idx>=1 && idx<=52
                crd = obj.cardstack(idx);
            else
                error('Deck:getCard','Index out of range');
            end
        end
    end
end

または単に使用します:

d.cardstack(33)

これは、明示的なエラー チェックなしで、まったく同じです。

また、パラメーターなしのコンストラクターを に追加して、配列cardを簡単に作成できるようにします。card

function obj = card(type, value)
    if nargin==0
        % eg:
        type=NaN;
        value=NaN;
    end
    % some code to check [type, value] should be inserted here
    obj.type = type;
    obj.value = value;
end
于 2012-11-17T00:41:29.883 に答える
0

Cardオブジェクトの配列を使用してほとんどの操作を実行できるため、デッキをクラスにする必要はないかもしれません。これが例です。

classdef Card < handle
   properties
      type    % number: 1-4
      value   % number: 1-13
   end
   methods
      function obj = Card(type, value)
         % some code to check [type, value] should be inserted here
         obj.type = type;
         obj.value = value;
      end
      function c = get_card(obj, t, v)
          c = obj([obj.type] == t & [obj.value] == v);
      end
      function c_arr = get_cards_array(obj, t, v)
          c_arr = obj(ismember([obj.type], t) & ismember([obj.value], v));
      end      
      function print(obj)
          for k = 1 : numel(obj)
              fprintf('Card type = %g; value = %g\n', obj(k).type, obj(k).value);
          end
      end
   end
end

そして使用法:

%% build array
deck = Card.empty();
for type = 1 : 4
    for value = 1 : 13
        deck(end + 1, 1) = Card(type, value);
    end
end
%% if needed, you can reshape it into 4x13
deck = reshape(deck, 4, 13);
%% you can also use Card's methods from array:
>> deck.print
Card type = 1; value = 1
Card type = 1; value = 2
Card type = 1; value = 3
...
%% get certain card
c = deck([deck.type] == 3 & [deck.value] == 10);
c.print
%% shuffle 
idx = randperm(numel(deck));
deck = deck(idx);

更新:カードのメソッドにget_card()を追加しました(実装を参照):

>> c = deck.get_card(3, 10)    
c = 

  Card handle

  Properties:
     type: 3
    value: 10

  Methods, Events, Superclasses

2つの意見:

1)これがMatLABのOOPを初めて使用する場合は、の意味を理解することが非常に役立つ場合がありclassdef Card < handleます。

2)オブジェクト配列の初期化に関する質問があります:クラスオブジェクトの均一な出力のためのMatlabのarrayfun

更新2: get_cards_array()メソッドを追加しました。使用法:

%% get array of cards
t = [1, 2];
v = [5, 6, 12];
c = deck.get_cards_array(t, v);
>> c.print
Card type = 1; value = 5
Card type = 1; value = 6
Card type = 1; value = 12
Card type = 2; value = 5
Card type = 2; value = 6
Card type = 2; value = 12
于 2012-11-17T01:06:39.393 に答える