java回合战斗_用AspectJ做的一个回合格斗小游戏

这个示例中有一个设计了一个战士Soldier类,这个类具有一些随机功能,包括发动攻击、治疗、躲避、移动等功能。另外有一个简单的主程序MainTest,里面的功能就是让两个战士回合制互相攻击。另外有一个切面,是用来观察并输入战斗的详细过程,直到一个被打倒下:

先看战士Soldier的代码:

package springroad.demo.chap5.aspectj;

public class Soldier {

private String name;

private int health=100;

private int damage=10;

private int x=10;

private int y=10;

public boolean attack(Soldier target){

boolean ret=false;

if(!target.dodge())

{

target.setHealth(target.getHealth()-this.damage);

ret=true;

}

move();

treat();

return ret;

}

public void move()

{

this.x+=getRandom(5);

this.y+=getRandom(5);

}

//躲避x及y随机变动,成功率为50%

public boolean dodge()

{

return getRandom(10)%2==0;

}

//治疗,具有一定成功的机会,可以提高生命值0-20点

public void treat()

{

if(canTreat())

this.health+=getRandom(20);

}

public boolean canTreat()

{

return getRandom(10)/2==0;

}

private int getRandom(int seed)

{

return RandomUtil.getRandomValue(seed);

}

//getter及setter方法

public int getHealth() {

return health;

}

public void setHealth(int health) {

this.health = health;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getX() {

return x;

}

public void setX(int x) {

this.x = x;

}

public int getY() {

return y;

}

public void setY(int y) {

this.y = y;

}

public int getDamage() {

return damage;

}

public void setDamage(int damage) {

this.damage = damage;

}

}

再看看MainTest.java中战场模拟的代码(即主程序):

package springroad.demo.chap5.aspectj;

public class MainTest {

public static void main(String[] args) {

Soldier p1=new Soldier();

p1.setName("角色1");

Soldier p2=new Soldier();

p2.setName("角色2");

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(p1.getName()+"战胜!");

else System.out.println(p2.getName()+"战胜!");

}

}

随机数生成器(概率产生)

package springroad.demo.chap5.aspectj;

public class RandomUtil {

private static java.util.Random random=new java.util.Random();

public static int getRandomValue(int seed)

{

return random.nextInt(seed);

}

}

这上面三个程序是完整的,可以直接用javac编译,然后执行MainTest,我们可以看到经过一小段时间战斗后分出胜负后,会显示出战斗的次数及胜负情况。

为了要能观察整个战斗的详细过程,这里在不改动上面的程序代码的情况下,使用AspectJ做了一个切面,主要用来输出攻击的情况。

切面RecordGame.aj的代码如下 :

package springroad.demo.chap5.aspectj;

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());

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());

}

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);

}

}

使用ajt编译上面的四个文件,在命令行输入如下所示命令(要求AspectJ正确安装及配置):

ajc springroad\demo\chap5\*.*j*

然后再使用java 命令执行MainTest即可以看到非常有趣的结果(多执行几次试试)。如下图所示:

1.jpg

另外,切面中还定义了一个超级角色,也即名称为“super”的战士,你把客户端某个战士的名称改成super,然后再运行试试,90%的情况都是super胜。

(本文作者:EasyJF开源团队  大峡 转载请保留作者声明,谢谢!)

posted on 2006-10-30 16:20 简易java框架 阅读(1360) 评论(1)  编辑  收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值