解答
演習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>
東京電機大学工学部情報通信工学科