0

メソッド shuffle と deal を持つクラス「Deck」を作成しようとしていますが、「shuffle」の関数が実行されない理由がわかりません。エラーメッセージが表示されます:

タイプ 'cell' の入力引数の関数またはメソッド 'shuffle' が定義されていません。

関数が実行されていない理由を誰か説明してもらえますか? どうもありがとうございます。以前に作成した classdef 'Card' を呼び出しています

 classdef Deck < handle;
 properties;
     diamond;
     spade
     heart;
     club;


    end;
     methods;
       function obj=create(deck);
         for k=1:13;
             %Designate a number to each suit to create the deck
             obj(k).diamond=cards('D','R',k);
             obj(k).spade=cards('S','B',k);
             obj(k).heart=cards('H','R',k);
            obj(k).club=cards('C','B',k);
         end
         %Create a vector of each suit and number accordingly until we
         %have 52 cards. 13 of each suit.
         obj={obj.diamond obj.spade obj.heart obj.club};            

     end

     %%
     function obj=shuffle(obj);

             shuff=randperm(52);

         for k=1:52;  
             hf=shuff(k);
             obj(k)=obj(hf);


         end
         end

     end
   end
4

2 に答える 2

0

オブジェクトの配列であるプロパティが必要だと思いますCardオブジェクト配列については、MATLAB ドキュメンテーションを参照してください。この問題を解決する方法は次のとおりです。

classdef Deck < handle
    properties
        % This will be an object array of Card objects.
        CardArray
    end

    properties (Dependent)
        nCards
    end

    methods 
        function This = Deck()
            % preallocate arrays.
            % the constructor for Card should accept 0 arguments.
            Diamond(13) = Card('D', 'R', 13);
            Spade(13) = Card('S', 'B', 13);
            Heart(13) = Card('H', 'R', 13);
            Club(13) = Card('C', 'B', 13);

            % now fill in the rest of each suit
            for iVal = 1:12
                Diamond(iVal) = Card('D', 'R', iVal);
                Spade(iVal) = Card('S', 'B', iVal); 
                Heart(iVal) = Card('H', 'R', iVal); 
                Club(iVal) = Card('C', 'B', iVal);  
            end

            % finally concatenate them into a single array
            This.CardArray = [Diamond, Spade, Heart, Club];
        end

        function shuffle(This) 
            This.CardArray = This.CardArray(randperm(This.nCards)); 
        end

        function n = get.nCards(This)
            n = length(This.CardArray);
        end
    end
end

Cardコンストラクターがゼロ引数を受け入れることを確認する必要があります。たとえば、次のことができます。

classdef Card < handle

    properties
        symbol = 'D'
        color = 'R'
        value = 1;
    end

    methods
        function This = Card(varargin)
            if nargin >= 1
                This.symbol = varargin{1};
            end
            if nargin >= 2
                This.color = varargin{2};
            end
            if nargin >= 3
                This.value = varargin{3};
            end
        end

    end

end
于 2013-05-01T19:38:10.653 に答える
0

コンストラクターの最後の行は必要ありません。

obj = { obj.diamond obj.spade obj.heart obj.club }

この行は、オブジェクトをセル (?) に変換します。この行を削除してみてください。classdef代わりにこれを試してください

classdef Deck 
     properties 
          cards
     end
 methods
     function obj = Deck()
          % do your stuff here, but no obj. before diamond/spade/heart/club
          obj.cards = { diamond, spade, heart, club };
     end 
     function obj  =shuffle ( obj )
          obj.cards = obj.cards( randperm(52) );
     end
 end
于 2012-11-30T07:14:40.583 に答える