<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 115  文章 - 481  trackbacks - 0
    <2006年10月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    常用鏈接

    留言簿(19)

    隨筆檔案(115)

    文章檔案(4)

    新聞檔案(1)

    成員連接

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

     由于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即可以看到非常有趣的結果(多執行幾次試試)。如下圖所示:
    ?


      另外,切面中還定義了一個超級角色,也即名稱為“super”的戰士,你把客戶端某個戰士的名稱改成super,然后再運行試試,90%的情況都是super勝。

     (本文作者:EasyJF開源團隊??大峽 轉載請保留作者聲明,謝謝!)
    posted on 2006-10-30 16:20 簡易java框架 閱讀(1447) 評論(1)  編輯  收藏

    FeedBack:
    # re: 用AspectJ做的一個回合格斗小游戲 2006-11-04 01:29 wln
    真的是太無聊了。。。。  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 99久久免费观看| 东方aⅴ免费观看久久av| 国产va免费精品观看精品| 亚洲国产精品一区二区久久| 在线看片免费人成视频播| 亚洲乱码中文字幕久久孕妇黑人| 一级成人生活片免费看| 亚洲综合色自拍一区| 国产精品极品美女自在线观看免费| 久久亚洲中文字幕精品一区| 2022免费国产精品福利在线 | 2021国产精品成人免费视频| 亚洲天堂福利视频| 无限动漫网在线观看免费| 亚洲变态另类一区二区三区| 亚洲午夜爱爱香蕉片| 免费黄色电影在线观看| 亚洲国产电影在线观看| 日韩免费视频网站| 亚洲视频在线免费| 久久综合亚洲色HEZYO社区 | 少妇高潮太爽了在线观看免费| 亚洲精华国产精华精华液好用 | 亚洲?V乱码久久精品蜜桃| 成人a毛片免费视频观看| 亚洲成色WWW久久网站| 182tv免费观看在线视频| 亚洲乱码日产精品一二三| 亚洲伊人成无码综合网| 免费无码中文字幕A级毛片| 亚洲日韩看片无码电影| 亚洲精品国产美女久久久| 免费阿v网站在线观看g| 四虎影视在线看免费观看| 亚洲国产一区二区a毛片| 青青草国产免费久久久下载| 97在线视频免费公开视频| 亚洲小说图区综合在线| 亚洲午夜无码久久久久| 97热久久免费频精品99| GOGOGO高清免费看韩国|