//
// AtomicAI.m
// Gridlock
//
// Created by Brian on Sat Feb 14 2004.
// Copyright (c) 2004 __MyCompanyName__. All rights reserved.
//
#import "AtomicAI.h"
#import "AtomicGame.h"
static NSArray* convertArrayValuesToNSNumbers(NSArray *array) {
NSMutableArray *result = [NSMutableArray array];
id obj;
NSEnumerator *e = [array objectEnumerator];
while (obj=[e nextObject]) {
if ([obj isKindOfClass:[NSArray class]]) {
[result addObject:convertArrayValuesToNSNumbers(obj)];
}
else if ([obj respondsToSelector:@selector(intValue)]) {
[result addObject:[NSNumber numberWithInt:[obj intValue]]];
}
else {
[result addObject:obj];
}
}
return result;
}
@implementation AtomicAI
-(void)dealloc {
[utilityArray release];
[super dealloc];
}
-(int)utilityForPlayer:(int)pnum inGame:(AtomicGame *)game {
NSEnumerator *pe = [[game grid] positionEnumerator];
id pos;
int utility = 0;
while (pos=[pe nextObject]) {
if ([game ownerOfPosition:pos]==pnum) {
int numPieces = abs([game valueAtPosition:pos]);
int maxStablePieces = [game maxStablePiecesForPosition:pos];
utility += (utilityArray==nil) ? 1 : [[[utilityArray objectAtIndex:maxStablePieces-1] objectAtIndex:numPieces-1] intValue];
}
}
return utility;
}
-(int)relativeUtilityForGame:(Game *)game player:(int)pnum {
return [self utilityForPlayer:pnum inGame:game] - [self utilityForPlayer:[game playerNumberMovingAfterPlayer:pnum] inGame:game];
}
/* utilityArray values come in as strings. The setter converts them to NSNumbers to avoid
repeated string conversions in utilityForPlayer:inGame:
*/
-(void)setUtilityArray:(NSArray *)array {
[utilityArray autorelease];
utilityArray = [convertArrayValuesToNSNumbers(array) retain];
}
@end