解答

演習1

問1-1

問1-2

Hand.h


#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
@class Hand;
@protocol Hand 
- (int) wins: (Hand *) h;
- (int) getType;
- (NSString*)toString;
@end
@interface Hand1 : NSObject<Hand>
{
  int type;
  NSString* name;
}
- (int)getType;
- (id)initWithType:(int)t;
- (int)wins:(id)hand;
- (NSString*)toString;
@end
@interface Hand0 : NSObject<Hand>
{
  NSString* gu;
}
- (int) wins: (Hand *) h;
- (int) getType;
- (NSString*)toString;
@end

Hand1.m


#import <Foundation/NSString.h>
#import "Hand.h"

@implementation Hand1
- (id)initWithType:(int)t{
  [super init];
  type=t;
  if(type==0){
    name = [[NSString alloc] initWithString: @"gu"];
  }else if(type==1){
    name = [[NSString alloc] initWithString: @"choki"];
  }else{
    name = [[NSString alloc] initWithString: @"pa"]; 
  }
  return self;
}
- (int)getType{
  return type;
}
- (int)wins:(id)hand{
  int t2=[hand getType];
  if(type==t2) return 0;
  if(((t2==0)&&(type==2))
     ||((t2==1)&&(type==0))
     ||((t2==2)&&(type==1))) return 1;
  return -1;
}
- (NSString*)toString{
  return name;
}


-(void)dealloc {
  [name release];
  [super dealloc];
}
@end;

問1-3

Tactics.h


#import <Foundation/NSObject.h>
/*
#import "Hand.h"
*/
#import "HandBuilder.h"
@class Hand;
@interface Tactics : NSObject
{
  id handBuilder;
}
- (void)setHandBuilder: (id) hb;
- (Hand*)newHand;
@end
@interface Tactics0 : Tactics
{
}
- (Hand*)newHand;
@end
@interface Tactics1 : Tactics
{
}
- (Hand*)newHand;
@end
@interface Tactics2 : Tactics
{
  int i;
}
- (Hand*)newHand;
@end

Tactics.m


#import "Tactics.h"
@implementation Tactics
- (void)setHandBuilder:(id) hb
{
  if(handBuilder != hb){
    [handBuilder release];
    handBuilder = [hb retain];
  }
}
-(void)dealloc {
  [handBuilder release];
  [super dealloc];
}
@end

Tactics1.m


#include <stdlib.h>
#include <time.h>
#import "Tactics.h"
@implementation Tactics1 
- (id) init
{
  if((self = [super init])!=nil){
    srand(time(NULL));
  }
  return self;
}
- (Hand*)newHand
{
  int r = (int)((double)rand()*3/RAND_MAX);
  Hand* hand = [handBuilder newHand: r];
  return hand;
}
-(void)dealloc
{
  [super dealloc];
}
@end

Tactics2.m


#include <stdlib.h>
#import "Tactics.h"
@implementation Tactics2
- (id) init
{
  if((self = [super init])!=nil){
    i=2;
  }
  return self;
}
- (Hand*)newHand
{
  i= (i+1)%3;
  return [handBuilder newHand: i];
}
-(void)dealloc
{
  [super dealloc];
}
@end

問1-4

Player.h


#import <Foundation/NSObject.h>
@class Tactics;
@class Hand;
@interface Player:NSObject
{
  NSString* name;
  Tactics* tactics;
  int win,lose,draw;
  NSString* resultString;
}
- (id) initWithString:(NSString*) n;
- (void) setTactics:(Tactics*) t;
- (Hand*) newHand;
- (void) win;
- (void) lose;
- (void) draw;
- (NSString*) result;
@end

Player.m


#import <Foundation/NSObject.h>
#import "Hand.h"
#import "Player.h"
@implementation Player
- (id) initWithString:(NSString*) n
{
  if((self=[super init])!=nil){
    name=[n retain];
    win=0;
    lose=0;
    draw=0;
  }
  return self;
}
- (void) setTactics:(Tactics*) t
{
  if(tactics != t){
    [tactics release];
    tactics = [t retain];
  }
}
- (Hand*) newHand
{
  return [tactics newHand];
}
- (void) win 
{
  win++;
}
- (void) lose 
{
  lose++;
}
- (void) draw
{
  draw++;
}
- (NSString*) result
{
  [resultString release];
  resultString = [[NSString alloc] 
		   initWithFormat: @"%@: %d win(s), %d lose(s), %d draw(s)"
		   ,name
		   ,win
		   ,lose
		   ,draw];
  return resultString;
}

-(void) dealloc
{
  [name release];
  [tactics release];
  [resultString release];
  [super dealloc];
}
@end

問1-5

HandBuilder.h


#import <Foundation/NSObject.h>
#import <Foundation/NSArray.h>
/*#import "Hand.h"*/
@class Hand;
@protocol HandBuilder
- (Hand*)newHand:(int)hand;
- (void)release;
@end
@interface HandBuilder0 : NSObject<HandBuilder>
- (Hand*)newHand:(int)hand;
@end
@interface HandBuilder1 : NSObject<HandBuilder>
- (Hand*)newHand:(int)hand;
@end
@interface HandBuilder2 : NSObject<HandBuilder>
{
  NSMutableArray* handArray;
}
- (Hand*)newHand:(int)hand;
@end

HandBuilder2.m


#import <Foundation/NSObject.h>
#import <Foundation/NSArray.h>
#import "Hand.h"
#import "HandBuilder.h"
@implementation HandBuilder2
- (id) init
{
  int i;
  if((self=[super init])!=nil){
    handArray = [[NSMutableArray alloc] init];
    for(i=0; i<3; i++){
      Hand* hand = [[Hand1 alloc] initWithType: i];
      [handArray addObject: hand];
      [hand release];
    }
  }
  return self;
}
-(Hand*)newHand:(int)hand{
  if(hand <0 || hand>2 ) return nil;
  Hand* h = [handArray objectAtIndex: hand];
  [h retain];
  return h;
}
-(void) dealloc
{
  [handArray release];
  [super dealloc];
}
@end

坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科