我們有個 Hero,職業是巫師,而這個職業有火球技能。火球技能的傷害算法是
火球等級 * 火球基礎傷害 * 職業加成倍率
那麼身為 Hero 的火球技能,必須知道 Hero 現在的職業加成倍率為何才對。如果 Hero 轉職了,職業加成倍率也就不同了。所以每當火球技能引發傷害時,都得動態問問看 Hero 現在的職業加成倍率。
在 Objective-C 裡面會這樣實作
Wizard.h
#import <Foundation/Foundation.h>
#import "FireBolt.h"
@interface Wizard : NSObject <MagicDamage> {
FireBolt* fireBolt;
int intelligence;
int level;
}
-(void) castFireBolt:(id) target;
@end
Wizard.m
#import "Wizard.h"
@implementation Wizard
- (Wizard*) init
{
self = [super init];
if (self) {
intelligence = 15;
level = 5;
FireBolt *tmpFireBolt = [[FireBolt alloc] init];
tmpFireBolt.delegate = self;
fireBolt = tmpFireBolt;
}
return self;
}
-(void) castFireBolt:(id) target
{
[fireBolt cast:target];
}
-(double) getRate
{
return intelligence * level;
}
@end
FireBolt.h
#import <Foundation/Foundation.h>
@protocol MagicDamage
-(double) getRate;
@end
@interface FireBolt : NSObject {
double baseDamage;
int level;
}
@property (nonatomic, strong) id <MagicDamage> delegate;
-(void) cast:(id) target;
@end
#import "FireBolt.h"
#import "Enemy.h"
@implementation FireBolt
@synthesize delegate;
- (FireBolt*) init
{
self = [super init];
if (self) {
level = 1;
baseDamage = 10;
}
return self;
}
-(void) cast:(Enemy*) target
{
double rate = [self.delegate getRate];
double damage = rate * baseDamage * level;
NSLog(@"%@ 被攻擊了!受到 %f 的傷害", target.Name, damage);
target.Life -= damage;
NSLog(@"%@ 的生命剩下 %d", target.Name, target.Life);
}
@end
Enemy.h
#import <Foundation/Foundation.h>
@interface Enemy : NSObject
@property (nonatomic) int Life;
@property (nonatomic, retain) NSString* Name;
- (Enemy*) initWithName:(NSString*) name;
@end
Enemy.m
#import "Enemy.h"
@implementation Enemy
@synthesize Life, Name;
- (Enemy*) initWithName:(NSString*) name
{
self = [super init];
if (self) {
self.Name = name;
self.Life = 5000;
}
return self;
}
@end
main.m
#import "Wizard.h"
#import "Enemy.h"
int main( int argc, const char *argv[] ) {
Enemy *dan = [[Enemy alloc] initWithName:@"Dan"];
Wizard *zephyr = [[Wizard alloc] init];
[zephyr castFireBolt:dan];
[zephyr castFireBolt:dan];
[zephyr castFireBolt:dan];
[zephyr castFireBolt:dan];
[zephyr castFireBolt:dan];
return 0;
}
Output
2011-11-05 17:31:53.595 test[886:f803] Dan 被攻擊了!受到 750.000000 的傷害
2011-11-05 17:31:53.596 test[886:f803] Dan 的生命剩下 4250
2011-11-05 17:31:53.597 test[886:f803] Dan 被攻擊了!受到 750.000000 的傷害
2011-11-05 17:31:53.597 test[886:f803] Dan 的生命剩下 3500
2011-11-05 17:31:53.598 test[886:f803] Dan 被攻擊了!受到 750.000000 的傷害
2011-11-05 17:31:53.598 test[886:f803] Dan 的生命剩下 2750
2011-11-05 17:31:53.599 test[886:f803] Dan 被攻擊了!受到 750.000000 的傷害
2011-11-05 17:31:53.599 test[886:f803] Dan 的生命剩下 2000
2011-11-05 17:31:53.600 test[886:f803] Dan 被攻擊了!受到 750.000000 的傷害
2011-11-05 17:31:53.600 test[886:f803] Dan 的生命剩下 1250
沒有留言:
張貼留言