由于Spring2的AOP部分作了比较大的调整,很多地方的使用引入了AspectJ中的内容,为了完成《深入Spring 2:轻量级J2EE开发框架原理与实践》中Spring AOP应用一章的写作,因此这两天把AspectJ研究了一下,重读了一次《AspectJ in action》,受益不少。这里是今天做的一个回合格斗戏示例:
这个示例中有一个设计了一个战士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即可以看到非常有趣的结果。如下图所示:

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1347028

用AspectJ做的一个回合格斗小游戏相关推荐

  1. 用原生javascript做的一个打地鼠的小游戏

    学习javascript也有一段时间了,一直以来分享的都是一些概念型的知识,今天有空做了一个打地鼠的小游戏,来跟大家分享一下,大家也可以下载来增加一些生活的乐趣,下面P出代码:首先是HTML部分代码: ...

  2. 用html5做了一个打气球小游戏

    最近初试html5,用canvas和audio做了一个打气球小游戏. demo放在SAE,网址是:[url]http://auzll.sinaapp.com/balloon/[/url] 效果如下: ...

  3. 用JS做了一个贪吃蛇小游戏,求顶贴..

    这个周JS课程也快结束了,昨天下午琢磨着做一个小游戏,于是,这个小东东就这么诞生了,目前还存在两个小BUG,欢迎各位高手指正.... 实现的效果有: W,A,S,D,经及小键盘方向键控制方向; 头碰到 ...

  4. c语言 回合制小游戏,一个回合制小游戏的设计笔记

    发在这的目的: 1.做个记录 2.与人交流讨论 场景:二维方格组成的场景,一个格子里只能有一个单位,每个单位都会占据自己的格子. 行为:每个回合里,每个单位都有一定的行为点数,单位的任何行为都需要消耗 ...

  5. js做的一个猜数字小游戏

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  6. 用 typescript 做一个贪吃蛇小游戏

    typescript 做一个贪吃蛇小游戏 搭建环境 创建 tscofig.json 文件 配置如下 {"compilerOptions": {"target": ...

  7. 利用pgzero做一个接球的小游戏

    利用pgzero做一个接球的小游戏 说明 pgzero为python的一个用于游戏制作的库,它基于pygame模块 可用如下命令去安装 pip install pygame pip install p ...

  8. html做的小游戏,用Html做一个“快乐鸟”小游戏

    入门学习前端的时候做了这么一个简单的小游戏,为了将自己所学到的知识运用起来. 这里可以看出还是有BUG的,死亡动画不是在死亡的瞬间触发 做这个小游戏用到了: html css jQuery 然后这个小 ...

  9. 奶气萌娃的声音怎么做?一个简单的小方法,奶娃配音轻松拿捏

    奶气萌娃的声音怎么做?一个简单的小方法,奶娃配音轻松拿捏 平时在刷短视频的时候,经常会看到可可爱爱的短视频,配音则是奶气萌娃的声音,着实可爱,萌化人心.那么,如果我们自己也想要做这种可爱的奶气萌娃的声 ...

最新文章

  1. Django 状态保持3.5
  2. Matlab与数据结构 -- 对向量的排序
  3. 85. Maximal Rectangel
  4. c语言 proteus 延迟2秒_周周练 | 专升本C语言
  5. java中多态_Java中多态的理解
  6. Sublime 插件安装、卸载、更新
  7. 请注意调整好自己的心态
  8. c++开发工具下载地址
  9. 3499元被吐槽太贵!A15加持:新iPhone SE正式发布 还有“苍蝇绿”iPhone 13
  10. 【kafka】 Error when handling request Name: FetchRequest cannot compare its segment info since it only
  11. excel2003和excel2007文件的创建和读取
  12. django 已登陆用户的权限问题
  13. python中else与for_在Python中使用else条件语句和for循环
  14. Install Cockpit on Fedora/CentOS/RHEL
  15. 机器学习实战应用案例100篇(十二)-樽海鞘算法从原理到实战应用案例
  16. Opencv 关于Kmeans算法
  17. 2021-2027全球与中国陶瓷基板白板市场现状及未来发展趋势
  18. 微信头像添加圣诞帽源码
  19. 同账号不同服务器幻化T2,魔兽世界TBC怀旧服预热采访—不会开放幻化,直升58每个账号只有一次机会...
  20. Jupyter notebook常用快捷键

热门文章

  1. Byte and Bit Order Dissection
  2. 计算器也是一种计算机游戏,脑洞大开 一款名曰计算器的游戏评测
  3. nutch tutorial0.8
  4. 头条显示服务器升级中,今日头条宣布生态升级:多元手段服务优质创作者
  5. vue中时间戳转换为时间
  6. STC8051学习笔记
  7. 高中数学选择题压轴题
  8. 涉密信息系统集成资质申请条件和费用
  9. 用户旅程方法论_3种有效准备数字旅程中流程改进的方法
  10. 什么是“ABC数据”