乱反射の光跡 in hatenablog

なみへいのブログです。hatenablogヴァージョン。

制作ノート その13

NNCardDeck version0.4(2)


さて、内部のインスタンス変数と、メソッドを考えていきます。


と、思ったのですが、久し振りにファイルを開いてソースコードを眺めて見ると、あっちこっちに同じようなコードがいくつもあって、相変わらずの冗長度で自分でも「こりゃ、なんとくどいソースコードじゃないか」などと思ってしまい(笑)。
そういう部分をスマートに処理できればいいんですが、「あれとこれはひとつのメソッドにして、それぞれの場所から呼び出して」などと修正を始めたら、バグだらけになってしまい(笑)、途方に暮れながら修正中(笑)。
なので、ホームページでのソースコードの公開は、もう少しお待ちください(笑)。


修正の内容はまた書きますが、とりあえずはNNCardDeckの中身を、基本から。


まず、基本的な考え方として。

一連の「NNCard~~」というオブジェクトクラスにおいては、それぞれのカードの名前(NNCardのインスタンス変数「cardName」)を「スーツ名(半角一文字)」+半角ハイフン+「数字(半角一文字)」という形に固定します。スペードのエースなら「s-a」、ハートの8は「h-8」となる訳です。スーツ名は「d(ダイヤ)、h(ハート)、k(クラブ)、s{スペード)」とジョーカー用の「j」の5つ。数字の10〜13については、それぞれx, j, q, kという一文字を与えます。クラブのキングなら「k-k」となる訳です。……クラブが「c」でないのには、理由はありません(笑)。「クラブ」って、クローバー(clover)だよねえ。ありゃ、なんで「k」にしちゃったんだろう?(笑)
……まあ、いいかあ(笑)。


……ともかく(笑)、これによって全てのカードに固有の半角3文字の「cardName」がつけられます。ジョーカーは「j-0」とします。この名前を画像リソースの名前と一致させることで、「cardName」変数から画像を特定することができます。
この「カード名」は、ゲームが変わっても同様に利用できるものなので、「NNCardDeck」でデータを保持しておいても構わないものだと思います。なのでこれは実装ファイルの中でグローバル変数として保持し、NNCardオブジェクト生成時に引数として渡されます。これはcharの配列として用意し、NNCardの初期化メソッドに順番に割り当てていきます。NSStringオブジェクトであるNNCardの変数「cardName」はNNCard内で生成・保持することになります。


他に、ひとつのゲームではそれぞれのカードが持つ値は一定であると見て、NNCardDeckに、NNCardの初期化メソッドに与える引数を保持しておくことにします。これは最初の初期化時に生成し、プログラムの実行中は保持することになります。これらの変数は、コントローラから渡される配列の参照配列煮なります。


NNCardを初期化する時に必要なのは最大7つの引数。この引数を渡すために、7つのNSArrayオブジェクトをインスタンス変数として持ちます。他に何組のカードセットを使うか(deckValue)、ジョーカーを何枚混ぜるか(jokerValue)のふたつのunsigned変数、ランダムにカードを抜き出す際、そのカードの位置(index)を保持しておくunsigned変数、ということになります。
……もっとシンプルな複合サブクラスになると思ったんですが。これは、どうなのか(笑)。

@interface NNCardDeck : NSMutableArray {

   NSMutableArray *cardArray;
	
   unsigned randomPosition;
   unsigned deckValue;
   unsigned jokerValue;
	
   NSArray *stdValues;
   NSArray *altValues;
   NSArray *valueFlags;
   NSArray *boolFlags;
   NSArray *intFlags;
}


メソッドには数種類の初期化メソッドと同時に、NSArray, NSMutableArrayから継承されるプリミティブ・メソッドのオーバーライドが必要になります。これらのメソッドは、複合サブクラスであるNNCardDeckの、インスタンス変数であるNSMutableArray(変数cardArray)を操作することになります。

// オーバーライドされるNSArray, NSMutableArrayのプリミティヴ・メソッド

- (unsigned)count; 
- (id)objectAtIndex:(unsigned)index; 
- (void)addObject:(id)object; 
- (void)replaceObjectAtIndex:(unsigned)index withObject:(id)object; 
- (void)removeLastObject; 
- (void)insertObject:(id)object atIndex:(unsigned)index; 
- (void)removeObjectAtIndex:(unsigned)index; 


さらに、「ランダムにカードを抜き出す」メソッドを加えておきます。本当は、初期化メソッドの他にはこれしか使わないような気もするのですが(笑)。
何はともあれ、これらの変数とメソッドをヘッダーファイルに明示し、実装していくことになります。
で、そのメソッドは現在修正中(笑)。