ryansobol
2004.11.10, 03:03 PM
I found a great website (http://nifty.stanford.edu/2004/EstellCardGame/) about creating a GUI-based card game using OO principals and Java. I'm personally making the leap into Objective-C / Cocoa and I thought it would be a great exercise to port the project.
Since I'm pretty new with Objective-C, I'd love to get some feedback from the community on my first class, Rank. Before looking over the code, it might be a good idea to read the author's write-up (http://nifty.stanford.edu/2004/EstellCardGame/assignments/cardgamepart1.html) for the game's foundation classes and the original Rank class in Java (http://nifty.stanford.edu/2004/EstellCardGame/appletdemos/Rank.java) .
Rank.h
#import <Cocoa/Cocoa.h>
@interface Rank : NSObject
{
NSString *name;
NSString *symbol;
}
+(void)initialize;
+(Rank *)ace;
+(Rank *)two;
+(Rank *)three;
+(Rank *)four;
+(Rank *)five;
+(Rank *)six;
+(Rank *)seven;
+(Rank *)eight;
+(Rank *)nine;
+(Rank *)ten;
+(Rank *)jack;
+(Rank *)queen;
+(Rank *)king;
-(Rank *)initWithName:(NSString *)aName Symbol:(NSString *)aSymbol;
-(NSString *)name;
-(NSString *)symbol;
-(void)setAceHigh;
-(void)setKingHigh;
-(int)compareTo:(Rank *)aRank;
-(NSString *)description;
@end
Rank.m
#import "Rank.h"
static BOOL aceHigh = NO;
static Rank *ACE = nil;
static Rank *TWO = nil;
static Rank *THREE = nil;
static Rank *FOUR = nil;
static Rank *FIVE = nil;
static Rank *SIX = nil;
static Rank *SEVEN = nil;
static Rank *EIGHT = nil;
static Rank *NINE = nil;
static Rank *TEN = nil;
static Rank *JACK = nil;
static Rank *QUEEN = nil;
static Rank *KING = nil;
static NSArray *VALUES_KING_HIGH = nil;
static NSArray *VALUES_ACE_HIGH = nil;
@implementation Rank
+(void)initialize
{
@synchronized(self)
{
if (ACE == nil)
{
ACE = [[Rank alloc] initWithName:@"Ace" Symbol:@"A"];
}
if (TWO == nil)
{
TWO = [[Rank alloc] initWithName:@"TWO" Symbol:@"2"];
}
if (THREE == nil)
{
THREE = [[Rank alloc] initWithName:@"Three" Symbol:@"3"];
}
if (FOUR == nil)
{
FOUR = [[Rank alloc] initWithName:@"Four" Symbol:@"4"];
}
if (FIVE == nil)
{
FIVE = [[Rank alloc] initWithName:@"Five" Symbol:@"5"];
}
if (SIX == nil)
{
SIX = [[Rank alloc] initWithName:@"Six" Symbol:@"6"];
}
if (SEVEN == nil)
{
SEVEN = [[Rank alloc] initWithName:@"Seven" Symbol:@"7"];
}
if (EIGHT == nil)
{
EIGHT = [[Rank alloc] initWithName:@"Eight" Symbol:@"8"];
}
if (NINE == nil)
{
NINE = [[Rank alloc] initWithName:@"Nine" Symbol:@"9"];
}
if (TEN == nil)
{
TEN = [[Rank alloc] initWithName:@"Ten" Symbol:@"10"];
}
if (JACK == nil)
{
JACK = [[Rank alloc] initWithName:@"Jack" Symbol:@"J"];
}
if (QUEEN == nil)
{
QUEEN = [[Rank alloc] initWithName:@"Queen" Symbol:@"Q"];
}
if (KING == nil)
{
KING = [[Rank alloc] initWithName:@"King" Symbol:@"K"];
}
if (VALUES_KING_HIGH == nil)
{
VALUES_KING_HIGH = [NSArray arrayWithObjects:
ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT
, NINE, TEN, JACK, QUEEN, KING, nil];
}
if (VALUES_ACE_HIGH == nil)
{
VALUES_ACE_HIGH = [NSArray arrayWithObjects:
TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT
, NINE, TEN, JACK, QUEEN, KING, ACE, nil];
}
}
}
+(Rank *)ace
{
if (ACE == nil)
{
[self initialize];
}
return ACE;
}
+(Rank *)two
{
if (TWO == nil)
{
[self initialize];
}
return TWO;
}
+(Rank *)three
{
if (THREE == nil)
{
[self initialize];
}
return THREE;
}
+(Rank *)four
{
if (FOUR == nil)
{
[self initialize];
}
return FOUR;
}
+(Rank *)five
{
if (FIVE == nil)
{
[self initialize];
}
return FIVE;
}
+(Rank *)six
{
if (SIX == nil)
{
[self initialize];
}
return SIX;
}
+(Rank *)seven
{
if (SEVEN == nil)
{
[self initialize];
}
return SEVEN;
}
+(Rank *)eight
{
if (EIGHT == nil)
{
[self initialize];
}
return EIGHT;
}
+(Rank *)nine
{
if (NINE == nil)
{
[self initialize];
}
return NINE;
}
+(Rank *)ten
{
if (TEN == nil)
{
[self initialize];
}
return TEN;
}
+(Rank *)jack
{
if (JACK == nil)
{
[self initialize];
}
return JACK;
}
+(Rank *)queen
{
if (QUEEN == nil)
{
[self initialize];
}
return QUEEN;
}
+(Rank *)king
{
if (KING == nil)
{
[self initialize];
}
return KING;
}
-(Rank *)initWithName:(NSString *)aName Symbol:(NSString *)aSymbol
{
self = [super init];
if (self != nil)
{
if (name != aName)
{
[name release];
name = [aName retain];
}
if (symbol != aSymbol)
{
[symbol release];
symbol = [aName retain];
}
}
return self;
}
-(NSString *)name
{
return name;
}
-(NSString *)symbol
{
return symbol;
}
-(void)setAceHigh
{
@synchronized(self)
{
aceHigh = YES;
}
}
-(void)setKingHigh
{
@synchronized(self)
{
aceHigh = NO;
}
}
-(int)compareTo:(Rank *)aRank
{
@synchronized(self)
{
if (aceHigh == YES)
return [VALUES_ACE_HIGH indexOfObject: self] - [VALUES_ACE_HIGH indexOfObject: aRank];
else
return [VALUES_KING_HIGH indexOfObject: self] - [VALUES_KING_HIGH indexOfObject: aRank];
}
}
-(NSString *)description
{
return [self name];
}
-(void)dealloc
{
[super dealloc];
[name release];
[symbol release];
}
// -------------- Singleton overrides --------------
// http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaObjects/Articles/CreateSingleton.html
+ (id)allocWithZone:(NSZone *)zone
{
return nil;
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (unsigned)retainCount
{
return UINT_MAX; //denotes an object that cannot be released
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
@end
Thanks for your help!
Since I'm pretty new with Objective-C, I'd love to get some feedback from the community on my first class, Rank. Before looking over the code, it might be a good idea to read the author's write-up (http://nifty.stanford.edu/2004/EstellCardGame/assignments/cardgamepart1.html) for the game's foundation classes and the original Rank class in Java (http://nifty.stanford.edu/2004/EstellCardGame/appletdemos/Rank.java) .
Rank.h
#import <Cocoa/Cocoa.h>
@interface Rank : NSObject
{
NSString *name;
NSString *symbol;
}
+(void)initialize;
+(Rank *)ace;
+(Rank *)two;
+(Rank *)three;
+(Rank *)four;
+(Rank *)five;
+(Rank *)six;
+(Rank *)seven;
+(Rank *)eight;
+(Rank *)nine;
+(Rank *)ten;
+(Rank *)jack;
+(Rank *)queen;
+(Rank *)king;
-(Rank *)initWithName:(NSString *)aName Symbol:(NSString *)aSymbol;
-(NSString *)name;
-(NSString *)symbol;
-(void)setAceHigh;
-(void)setKingHigh;
-(int)compareTo:(Rank *)aRank;
-(NSString *)description;
@end
Rank.m
#import "Rank.h"
static BOOL aceHigh = NO;
static Rank *ACE = nil;
static Rank *TWO = nil;
static Rank *THREE = nil;
static Rank *FOUR = nil;
static Rank *FIVE = nil;
static Rank *SIX = nil;
static Rank *SEVEN = nil;
static Rank *EIGHT = nil;
static Rank *NINE = nil;
static Rank *TEN = nil;
static Rank *JACK = nil;
static Rank *QUEEN = nil;
static Rank *KING = nil;
static NSArray *VALUES_KING_HIGH = nil;
static NSArray *VALUES_ACE_HIGH = nil;
@implementation Rank
+(void)initialize
{
@synchronized(self)
{
if (ACE == nil)
{
ACE = [[Rank alloc] initWithName:@"Ace" Symbol:@"A"];
}
if (TWO == nil)
{
TWO = [[Rank alloc] initWithName:@"TWO" Symbol:@"2"];
}
if (THREE == nil)
{
THREE = [[Rank alloc] initWithName:@"Three" Symbol:@"3"];
}
if (FOUR == nil)
{
FOUR = [[Rank alloc] initWithName:@"Four" Symbol:@"4"];
}
if (FIVE == nil)
{
FIVE = [[Rank alloc] initWithName:@"Five" Symbol:@"5"];
}
if (SIX == nil)
{
SIX = [[Rank alloc] initWithName:@"Six" Symbol:@"6"];
}
if (SEVEN == nil)
{
SEVEN = [[Rank alloc] initWithName:@"Seven" Symbol:@"7"];
}
if (EIGHT == nil)
{
EIGHT = [[Rank alloc] initWithName:@"Eight" Symbol:@"8"];
}
if (NINE == nil)
{
NINE = [[Rank alloc] initWithName:@"Nine" Symbol:@"9"];
}
if (TEN == nil)
{
TEN = [[Rank alloc] initWithName:@"Ten" Symbol:@"10"];
}
if (JACK == nil)
{
JACK = [[Rank alloc] initWithName:@"Jack" Symbol:@"J"];
}
if (QUEEN == nil)
{
QUEEN = [[Rank alloc] initWithName:@"Queen" Symbol:@"Q"];
}
if (KING == nil)
{
KING = [[Rank alloc] initWithName:@"King" Symbol:@"K"];
}
if (VALUES_KING_HIGH == nil)
{
VALUES_KING_HIGH = [NSArray arrayWithObjects:
ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT
, NINE, TEN, JACK, QUEEN, KING, nil];
}
if (VALUES_ACE_HIGH == nil)
{
VALUES_ACE_HIGH = [NSArray arrayWithObjects:
TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT
, NINE, TEN, JACK, QUEEN, KING, ACE, nil];
}
}
}
+(Rank *)ace
{
if (ACE == nil)
{
[self initialize];
}
return ACE;
}
+(Rank *)two
{
if (TWO == nil)
{
[self initialize];
}
return TWO;
}
+(Rank *)three
{
if (THREE == nil)
{
[self initialize];
}
return THREE;
}
+(Rank *)four
{
if (FOUR == nil)
{
[self initialize];
}
return FOUR;
}
+(Rank *)five
{
if (FIVE == nil)
{
[self initialize];
}
return FIVE;
}
+(Rank *)six
{
if (SIX == nil)
{
[self initialize];
}
return SIX;
}
+(Rank *)seven
{
if (SEVEN == nil)
{
[self initialize];
}
return SEVEN;
}
+(Rank *)eight
{
if (EIGHT == nil)
{
[self initialize];
}
return EIGHT;
}
+(Rank *)nine
{
if (NINE == nil)
{
[self initialize];
}
return NINE;
}
+(Rank *)ten
{
if (TEN == nil)
{
[self initialize];
}
return TEN;
}
+(Rank *)jack
{
if (JACK == nil)
{
[self initialize];
}
return JACK;
}
+(Rank *)queen
{
if (QUEEN == nil)
{
[self initialize];
}
return QUEEN;
}
+(Rank *)king
{
if (KING == nil)
{
[self initialize];
}
return KING;
}
-(Rank *)initWithName:(NSString *)aName Symbol:(NSString *)aSymbol
{
self = [super init];
if (self != nil)
{
if (name != aName)
{
[name release];
name = [aName retain];
}
if (symbol != aSymbol)
{
[symbol release];
symbol = [aName retain];
}
}
return self;
}
-(NSString *)name
{
return name;
}
-(NSString *)symbol
{
return symbol;
}
-(void)setAceHigh
{
@synchronized(self)
{
aceHigh = YES;
}
}
-(void)setKingHigh
{
@synchronized(self)
{
aceHigh = NO;
}
}
-(int)compareTo:(Rank *)aRank
{
@synchronized(self)
{
if (aceHigh == YES)
return [VALUES_ACE_HIGH indexOfObject: self] - [VALUES_ACE_HIGH indexOfObject: aRank];
else
return [VALUES_KING_HIGH indexOfObject: self] - [VALUES_KING_HIGH indexOfObject: aRank];
}
}
-(NSString *)description
{
return [self name];
}
-(void)dealloc
{
[super dealloc];
[name release];
[symbol release];
}
// -------------- Singleton overrides --------------
// http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaObjects/Articles/CreateSingleton.html
+ (id)allocWithZone:(NSZone *)zone
{
return nil;
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (unsigned)retainCount
{
return UINT_MAX; //denotes an object that cannot be released
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
@end
Thanks for your help!