Java究竟怎么玩?http://blog.csdn.net/cping1982

菩提本无树,明镜亦非台,本来无一物,何处惹尘埃

用户操作
[即时聊天] [发私信] [加为好友]
鹏凌三千(cping1982)
鹏凌三千(cping1982)的公告
本博评论删除规则如下:

1、辱骂性发言,无视其辱骂对象,一律删。

2、登录发表的评论,不违背第一条者一律不删。非登录发表的评论,过激者删。

3、若发生例外情况,则为CSDN博客系统自动删除。

声援SOFF|声援珊瑚虫:如果你是珊瑚虫用户,请坚决力挺声援珊瑚虫!

平生进退如飙风,一睨人才天下空。独向苍天横冷剑,何必生我惭英雄。

本人有效BLOG:

cping1982

ceponline

音乐:

风姿花传

ドラグ.スレイブ

ヒカルの碁

Believe

世界で一番ヤバイ恋

あんなに一緒だった

精忠报国

谁是大英雄

随遇而安

明天会吹什么风

逍遥游

爱江山更爱美人

最近评论
qingtianzhu:你好,我想购买你的软件,但是一直联系不上你,请告知联系方式,谢谢!
yao_ju_xian:看着挺好的啊,我现在也在学Java,不过我是学oracle那块的,我觉得你做的相当好了,能不能教教我啊?谢谢,我的邮箱是yaojuxian1988@yahoo.com.cn,非常感谢你能赐教!
.net:啥也不说支持楼主B/S小白
原理都不懂就在这里叽叽呀呀的
多回去看几年书吧
真像是在看笑话“呵呵”
如果易语言真有那么“好”没有中国人不支持的
可是(*^__^*) 嘻嘻……
明白的都明白
不明白的自己琢磨去吧
kiki820819:asdasd
kiki820819:asdasd
文章分类
收藏
    相册
    Java的PC游戏开发
    Java中的A*(A star)寻径实现
    Java仿雷电及其源代码
    Java制作的类祖码游戏-数字祖码
    Java实现窗体中角色逐渐风化效果
    Java版吃豆游戏
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[2]——踏破红尘
    Java[伪]寻径追踪实现
    JAVA中[人工无脑]系统(chatbot)的实现
    Java中2.5D游戏(斜45度角)的设计与实现(1)
    Java中2.5D游戏(斜45度角)的设计与实现(2)
    Java仿太阁立志传5
    JAVA图形操作中FPS的计算(附带随机生成乱数球体用例)
    JAVA实现拼图游戏
    Java来做马里奥[0]—让精灵再次舞动
    Java来做马里奥[1]—木叶传承
    Java来做马里奥[2]—食不厌精
    Java来做马里奥[3]—杂兵登场
    Java模拟桌球打击处理及绘制
    Java汉诺塔测试
    Java炸弹人实现及源码
    人生如梦游戏间,JAVA游戏开源开发讲座[番外篇]之AVG开发——皮影
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[0]——月晕础润
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[1]——风云初现
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[3]——邯郸学步
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[4]——一步莲华
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[5]——一树双花
    人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[6]——走马观花
    史上最扯Java图形绘制(J2SE)之一JAVA动画效果
    沉寂的国人开源项目
    bo-blog(blog系统,php项目)
    DockPanel Suite [Microsoft .NET Framework Winform UI]
    Hocate web framework[web框架]
    Loonframework-DAO[持久层框架]
    Loonframework-GAME[游戏框架,尚未发布]
    Loonframework-WEB[web框架,尚未发布]
    Luntbuild(软件管理工具)
    magike(php博客)
    myseelite(p2p流媒体系统,c++项目)
    newxy(新坐标)[web框架]
    opencrx(crm系统)
    redlion(web框架)
    x2blog(asp.net博客系统)
    YOYOPlayer(音乐播放器)
    袋鼠egg(服务器)
    经典Blog
    # gzfqh的专栏 →底层代码研究(病毒及汇编)(RSS)
    # java 3D 游戏编程(RSS)
    ApoGames(德国某人的Java游戏作品展示)
    Struts框架应用
    Struts框架应用~
    千里冰封[JAVA 浓香四溢]
    网络安全圈子
    经典站点
    Google
    IBM中国站
    JavaGame开发论坛
    JAVA开源大全
    Java爱好者
    Struts标签文档
    SUN 中国社区
    中国IT实验室
    数据库专区
    偶的其它应用实例
    C#将图像文件压缩为AVI文件播放
    Java&.Net虚拟机精简(GreenJVM&GreenDotNet发布)
    Java图形程序水纹倒映效果
    Java输出竖排古典文字
    .NET在线漫画下载程序
    C#转换AVI文件为BMP文件
    ClassLoader调用外部jar包
    ExtJS2.0开发与实践笔记[0]——初识ExtJS
    ExtJS2.0开发与实践笔记[1]——ExtJS中的Dialog与Form
    ExtJS2.0开发与实践笔记[2]——Ext中的Layout
    ExtJS2.0开发与实践笔记[3]——Ext中的Menu
    ExtJS2.0开发与实践笔记[4]——Ext中的动画处理
    JavaFx实现(1)-渐变效果
    JavaFx实现(2)-随机图形绘制
    Java中DAO的实现
    Java中Image翻转操作
    Java中将byte[]转为Blob对象
    Java中的A*(A star)寻径实现
    Java制作绿色软件(GreenJVM_0.1.0发布)
    JAVA图形操作类
    Java图形程序中的对话逐字显示实现
    Java实现任意文件在bmp中的隐藏与导出
    JAVA实现可设置背景的MDI窗口
    Java实现嵌入式数据库(文本数据库)代码实例
    Java实现类Windows导航栏
    Java正则表达式入门
    JAVA版JAVA IDE环境(源码)
    JAVA线程池的简单实现及优先级设置
    Java自定义JSlider UI
    Java获得系统环境变量
    Java音乐播放类
    ResultSet转为实体对象
    SWT行,AWT/Swing也行系列(1)-实现半透明及不规则窗体
    在JTable中加载进度条及进行操作
    在Swing中使用Html标签
    在SWT中使用ChartDirector
    浅谈java.util.concurrent包的并发处理
    浅谈Java集合中Array(数组)的应用
    精简JRE体积
    通过exe启动class
    偶的文章
    《三国以后有几国》
    中国本土化编程(汉语编程)之我见
    从珊瑚虫事件,看为什么中国出不了比尔.盖茨
    佛与专家
    叹今人无气节而作歌
    国产开源项目的七宗罪
    对Hibernate使用之愚见
    对Java(J2SE PC)开发之怪现象之我见
    浅谈命名规范[纯属强辩]
    灭了珊瑚虫,下一个是谁?
    率性而作无题歌一首
    百度对“十进制网络”的官方态度
    耻民
    论番茄花园的倒掉
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Java中的A*(A star)寻径实现收藏

    新一篇: 国产开源项目的七宗罪 | 旧一篇: Java来做马里奥[1]—木叶传承

    据我个人所知,目前流行的寻径方法大体有两种,即A* 和Dijkstra(SP算法)

    Dijkstra算法:

       
      
        由Edsger Wybe Dijkstra先生发明(已故)
        Dijkstra算法是典型的最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法是一种逐步搜索算法,通过为每个顶点n保留目前为止所找到的从m到n的最短路径来工作的。

        搜索过程:
       假如在第m步搜索到一个最短路径,而该路径上有n个距离源节点最近的节点,则将他们认为是一个节点集合N;在第m+1步,搜索不属于N的距离源节点最近的节点,并搜索到的节点加入到N中;继续搜索,直至到达目的节点,N中的节点集合便是从源节点到目的节点的最短路径。

        算法描述:

        Dijkstra算法是通过为每个顶点v保留目前为止所找到的从s到v的最短路径来工作的。初始时,源点s的路径长度值被赋为0(d[s]=0), 同时把所有其他顶点的路径长度设为无穷大,即表示我们不知道任何通向这些顶点的路径(对于V中所有顶点v除s外d[v]= ∞)。当算法结束时,d[v]中储存的便是从s到v的最短路径,或者如果路径不存在的话是无穷大。 Dijstra算法的基础操作是边的拓展:如果存在一条从u到v的边,那么从s到u的最短路径可以通过将边(u,v)添加到尾部来拓展一条从s到v的路径。这条路径的长度是d[u]+w(u,v)。如果这个值比目前已知的d[v]的值要小,我们可以用新值来替代当前d[v]中的值。拓展边的操作一直执行到所有的d[v]都代表从s到v最短路径的花费。这个算法经过组织因而当d[u]达到它最终的值的时候没条边(u,v)都只被拓展一次。算法维护两个顶点集S和Q。集合S保留了我们已知的所有d[v]的值已经是最短路径的值顶点,而集合Q则保留其他所有顶点。集合S 初始状态为空,而后每一步都有一个顶点从Q移动到S。这个被选择的顶点是Q中拥有最小的d[u]值的顶点。当一个顶点u从Q中转移到了S中,算法对每条外接边(u,v)进行拓展。

    A*(A Star)算法:

      

        A*(A-Star)算法是一种静态路网中求解最短路最有效的方法。
        公式表示为:f(n)=g(n)+h(n), 其中f(n) 是节点n从初始点到目标点的估价函数,g(n) 是在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。

         搜索过程:
        
         创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。遍历当前节点的各个节点,将n节点放入CLOSE中,取n节点的子节点X,->算X的估价值.

            While(OPEN!=NULL)
            {
            从OPEN表中取估价值f最小的节点n;
            if(n节点==目标节点) break;
            else
            {
            if(X in OPEN) 比较两个X的估价值f //注意是同一个节点的两个不同路径的估价值
            if( X的估价值小于OPEN表的估价值 )
               更新OPEN表中的估价值; //取最小路径的估价值
            if(X in CLOSE) 比较两个X的估价值 //注意是同一个节点的两个不同路径的估价值
            if( X的估价值小于CLOSE表的估价值 )
               更新CLOSE表中的估价值; 把X节点放入OPEN //取最小路径的估价值
            if(X not in both)
            求X的估价值;
               并将X插入OPEN表中; //还没有排序
            }
            将n节点插入CLOSE表中;
            按照估价值将OPEN表中的节点排序; //实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。
            }


    就实际应用而言,A*算法和Dijistra算法的最大区别就在于有无估价值,本质上Dijistra算法相当于A*算法中估价值为0的情况。所以此次我选取A*算法进行Java实现。

    抛开理论性的数学概念,通常的A*算法,其实只有两个步骤,一是路径评估,以保证移动的下一个位置离目标最近,评估的结果越精确则寻径的效率也将越高。二是路径查询,也即将评估结果进行反应,而后从新位置再次进行评估指导无路可走为止,以此遍历出可行的路径。

    在A*算法的程序实现中,本质上我们只需要关心三点,即起点、终点和地图信息,有了这三项基本数据,我们就可以构建任何情况下的A*实现。

    下面我现在提供的是一个A*的Java静态寻径算法实现,逻辑见代码注释。

     运行效果如下图(1,1 to 10,13):


    (1,1 to 7,9 小房子门口中间)


    (1,1 to 6,7 小房子内部)



    Node.java
    package org.test.astar;

    import java.awt.Point;
    import java.util.LinkedList;

    /**
     * <p>
     * Title: LoonFramework
     * </p>
     * <p>
     * Description:描述路径节点用类
     * </p>
     * <p>
     * Copyright: Copyright (c) 2008
     * </p>
     * <p>
     * Company: LoonFramework
     * </p>
     * <p>
     * License: 
    http://www.apache.org/licenses/LICENSE-2.0
     * </p>
     * 
     * 
    @author chenpeng
     * @email:ceponline@yahoo.com.cn
     * 
    @version 0.1
     
    */

    public class Node implements Comparable {
        
    // 坐标
        public Point _pos;

        
    // 开始地点数值
        public int _costFromStart;

        
    // 目标地点数值
        public int _costToObject;

        
    // 父节点
        public Node _parentNode;

        
    private Node() {
        }


        
    /**
         * 以注入坐标点方式初始化Node
         * 
         * 
    @param _pos
         
    */

        
    public Node(Point _pos) {
            
    this._pos = _pos;
        }


        
    /**
         * 返回路径成本
         * 
         * 
    @param node
         * 
    @return
         
    */

        
    public int getCost(Node node) {
            
    // 获得坐标点间差值 公式:(x1, y1)-(x2, y2)
            int m = node._pos.x - _pos.x;
            
    int n = node._pos.y - _pos.y;
            
    // 取两节点间欧几理德距离(直线距离)做为估价值,用以获得成本
            return (int) Math.sqrt(m * m + n * n);
        }


        
    /**
         * 检查node对象是否和验证对象一致
         
    */

        
    public boolean equals(Object node) {
            
    // 验证坐标为判断依据
            if (_pos.x == ((Node) node)._pos.x && _pos.y == ((Node) node)._pos.y) {
                
    return true;
            }

            
    return false;
        }


        
    /**
         * 比较两点以获得最小成本对象
         
    */

        
    public int compareTo(Object node) {
            
    int a1 = _costFromStart + _costToObject;
            
    int a2 = ((Node) node)._costFromStart + ((Node) node)._costToObject;
            
    if (a1 < a2) {
                
    return -1;
            }
     else if (a1 == a2) {
                
    return 0;
            }
     else {
                
    return 1;
            }

        }


        
    /**
         * 获得上下左右各点间移动限制区域
         * 
         * 
    @return
         
    */

        
    public LinkedList getLimit() {
            LinkedList limit 
    = new LinkedList();
            
    int x = _pos.x;
            
    int y = _pos.y;
            
    // 上下左右各点间移动区域(对于斜视地图,可以开启注释的偏移部分,此时将评估8个方位)
            
    // 上
            limit.add(new Node(new Point(x, y - 1)));
            
    // 右上
            
    // limit.add(new Node(new Point(x+1, y-1)));
            
    // 右
            limit.add(new Node(new Point(x + 1, y)));
            
    // 右下
            
    // limit.add(new Node(new Point(x+1, y+1)));
            
    // 下
            limit.add(new Node(new Point(x, y + 1)));
            
    // 左下
            
    // limit.add(new Node(new Point(x-1, y+1)));
            
    // 左
            limit.add(new Node(new Point(x - 1, y)));
            
    // 左上
            
    // limit.add(new Node(new Point(x-1, y-1)));

            
    return limit;
        }


    }


    PathFinder.java
    package org.test.astar;

    import java.awt.Point;
    import java.util.LinkedList;
    import java.util.List;

    /**
     * <p>
     * Title: LoonFramework
     * </p>
     * <p>
     * Description:A*寻径处理用类(此类为演示用,并不意味着算法是最佳实现)
     * </p>
     * <p>
     * Copyright: Copyright (c) 2008
     * </p>
     * <p>
     * Company: LoonFramework
     * </p>
     * <p>
     * License: 
    http://www.apache.org/licenses/LICENSE-2.0
     * </p>
     * 
     * 
    @author chenpeng
     * @email:ceponline@yahoo.com.cn
     * 
    @version 0.1
     
    */

    public class PathFinder {
        
    // 路径优先等级list(此示例中为内部方法)
        private LevelList _levelList;

        
    // 已完成路径的list
        private LinkedList _closedList;

        
    // 地图描述
        private int[][] _map;

        
    // 行走区域限制
        private int[] _limit;

        
    /**
         * 以注入地图的2维数组及限制点描述初始化此类
         * 
         * 
    @param _map
         
    */

        
    public PathFinder(int[][] map, int[] limit) {
            _map 
    = map;
            _limit 
    = limit;
            _levelList 
    = new LevelList();
            _closedList 
    = new LinkedList();
        }


        
    /**
         * A*方式寻径,注入开始坐标及目标坐标后运算,返回可行路径的List
         * 
         * 
    @param startPos
         * 
    @param objectPos
         * 
    @return
         
    */

        
    public List searchPath(Point startPos, Point objectPos) {
            
    // 初始化起始节点与目标节点
            Node startNode = new Node(startPos);
            Node objectNode 
    = new Node(objectPos);
            
    // 设定起始节点参数
            startNode._costFromStart = 0;
            startNode._costToObject 
    = startNode.getCost(objectNode);
            startNode._parentNode 
    = null;
            
    // 加入运算等级序列
            _levelList.add(startNode);
            
    // 当运算等级序列中存在数据时,循环处理寻径,直到levelList为空
            while (!_levelList.isEmpty()) {
                
    // 取出并删除最初的元素
                Node firstNode = (Node) _levelList.removeFirst();
                
    // 判定是否和目标node坐标相等
                if (firstNode.equals(objectNode)) {
                    
    // 是的话即可构建出整个行走路线图,运算完毕
                    return makePath(firstNode);
                }
     else {
                    
    // 否则
                    
    // 加入已验证List
                    _closedList.add(firstNode);
                    
    // 获得firstNode的移动区域
                    LinkedList _limit = firstNode.getLimit();
                    
    // 遍历
                    for (int i = 0; i < _limit.size(); i++{
                        
    //获得相邻节点
                        Node neighborNode = (Node) _limit.get(i);
                        
    //获得是否满足等级条件
                        boolean isOpen = _levelList.contains(neighborNode);
                        
    //获得是否已行走
                        boolean isClosed = _closedList.contains(neighborNode);
                        
    //判断是否无法通行
                        boolean isHit = isHit(neighborNode._pos.x,
                                neighborNode._pos.y);
                        
    //当三则判定皆非时
                        if (!isOpen && !isClosed && !isHit) {
                            
    //设定costFromStart
                            neighborNode._costFromStart = firstNode._costFromStart + 1;
                            
    //设定costToObject  
                            neighborNode._costToObject = neighborNode
                                    .getCost(objectNode);
                            
    //改变neighborNode父节点
                            neighborNode._parentNode = firstNode;
                            
    //加入level 
                            _levelList.add(neighborNode);
                        }

                    }

                }


            }

            
    //清空数据
            _levelList.clear();
            _closedList.clear();
            
    //当while无法运行时,将返回null
            return  null;
        }

        
        
    /**
         * 判定是否为可通行区域
         * 
         * 
    @param x
         * 
    @param y
         * 
    @return
         
    */