昨天看大峡写的AOP切面的格斗游戏,挺有趣,顺手给他更加细致化一下,增加几个切入点,增加一个无敌英雄easyjf,使得观察战斗更加细致,RecordGame.aj代码如下:
public aspect RecordGame {
private static java.text.SimpleDateFormat df = new java.text.SimpleDateFormat(
"yyyy-MM-dd H:m:s");
pointcut doRecord():execution(boolean Soldier.attack(Soldier));
pointcut supperRole(Soldier s): target(s)&&execution(boolean Soldier.canTreat());
pointcut doDodge():execution(boolean Soldier.dodge());
pointcut doMove():call(void Soldier.move());
pointcut supperAdmin(Soldier s):target(s)&&execution(boolean Soldier.dodge());
after() returning(boolean value) :doRecord()
{
Soldier s = (Soldier) thisJoinPoint.getTarget();
Soldier t = (Soldier) thisJoinPoint.getArgs()[0];
System.out.println(df.format(new java.util.Date()) + ":" + s.getName()
+ " 向 " + t.getName() + " 发动了一次攻击!--结果:"
+ (value ? "成功" : "失败"));
System.out.println(s.getName() + "生命值:" + s.getHealth() + ";"
+ t.getName() + "生命值:" + t.getHealth());
System.out.println(s.getName() + "的位置是:X:" + s.getX() + ",Y:"
+ s.getY());
System.out.println(t.getName() + "的位置是:X:" + t.getX() + ",Y:"
+ s.getY());
}
after() returning(boolean value):doDodge(){
Soldier s = (Soldier) thisJoinPoint.getTarget();
if (value) {
System.out.println(s.getName() + "躲闪成功");
} else {
System.out.println(s.getName() + "躲闪失败");
}
}
after():doMove(){
Soldier s = (Soldier) thisJoinPoint.getTarget();
System.out.println(s.getName() + "开始移动");
System.out.println(s.getName() + "新的位置是:x:" + s.getX() + "y:"+ s.getY());
}
after(Soldier s)returning(boolean value):target(s)&&call(boolean Soldier.canTreat())
{
if (value)
System.out.println(s.getName() + "得到治疗!");
}
boolean around(Soldier s): supperRole(s)
{
if ("super".equals(s.getName()))
return true;
else
return proceed(s);
}
boolean around(Soldier s):supperAdmin(s){
if("easyjf".equals(s.getName())){
return true;
}else{
return proceed(s);
}
}
},
测试一下:
public static void main(String[] args) {
// TODO Auto-generated method stub
Soldier p1=new Soldier();
p1.setName("死亡使者");
Soldier p2=new Soldier();
p2.setName("月精灵");
int i=0;
while(p1.getHealth()>0 && p2.getHealth()>0)
{
p2.attack(p1);
p1.attack(p2);
i+=2;
}
System.out.println("战斗次数:"+i);
if(p1.getHealth()>0)System.out.println("死亡使者战胜!");
else System.out.println("月精灵战胜!");
},
运行一下(我是使用eclipse来建aspect的):
2006-12-05 9:49:37:月精灵 向 死亡使者 发动了一次攻击!--结果:失败
月精灵生命值:144;死亡使者生命值:153
月精灵的位置是:X:261,Y:279
死亡使者的位置是:X:287,Y:279
月精灵躲闪成功
死亡使者开始移动
死亡使者新的位置是:x:289y:272
死亡使者得到治疗!
2006-12-05 9:49:37:死亡使者 向 月精灵 发动了一次攻击!--结果:失败
死亡使者生命值:170;月精灵生命值:144
死亡使者的位置是:X:289,Y:272
月精灵的位置是:X:261,Y:272
死亡使者躲闪成功
月精灵开始移动
月精灵新的位置是:x:262y:279
月精灵得到治疗!
... ... ... ...
2006-12-05 9:49:37:死亡使者 向 月精灵 发动了一次攻击!--结果:成功
死亡使者生命值:-7;月精灵生命值:184
死亡使者的位置是:X:834,Y:800
月精灵的位置是:X:812,Y:800
战斗次数:806
月精灵战胜!
,换个无敌英雄“easyjf”看看,肯定任何人没有任何机会打败他,不信你可以试一试哈!