2012-11-30 68 views
0

我正在嘗試創建一個具有方法洗牌和處理的類'Deck',但是,我不知道爲什麼我的函數'shuffle'isn'運行。我收到錯誤消息:對'cell'類型的輸入參數未定義函數或方法'shuffle'

對'cell'類型的輸入參數未定義函數或方法'shuffle'。

有人可以解釋爲什麼該功能沒有運行?非常感謝你。 我先前所創建classdef「卡」

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 
+0

aha oh ya,我想我忘了那個。謝謝。 –

+0

這條線做了什麼:obj {k} = obj(hf);如果這段代碼是一個matlab代碼,我認爲花括號不會出現在'='符號的左側。它們僅用於在左側分配值。還有什麼是順序排列函數:hf = shuff(k);? – Kishore

+0

我做了obj(k)= obj(hf)來擾亂索引的順序,從而洗牌。遐,我不知道大括號。我認爲使用它們是因爲甲板是一個單元格,但主要是爲了洗牌的順序。 –

回答

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 
+0

我使用該行來創建52個條目的向量。我剛剛嘗試將其刪除,但後來我只得到13個1x1結構的結構,每個結構包含鑽石,鏟子,球杆,心臟。這是我得到了=創建(甲板) A = 1x13結構陣列領域: 鑽石 鏟 心臟 俱樂部 A = 1x13結構陣列領域: 鑽石 鏟 心臟 俱樂部 EDU >>一(1) ANS = 金剛石:[1x1的卡] 鏟:[1x1的卡] 心臟:[1x1的卡] 俱樂部:[1x1 cards] –

+0

@larryquach在這種情況下,你需要你的屬性不是4個「形狀」,而是一個單元格,讓我們說'甲板',然後你必須相應地改變班級。 – Shai

+0

因此,嘗試了這一點,但我得到一個錯誤,說最大遞歸限制達到500。 這是我現在的代碼:classdef Deck

0

我想你想有一個屬性,它是Card對象的數組。請參閱MATLAB documentation for object arrays。這是我會怎麼解決這個問題:

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 
相關問題