Java游戏服务器开发之A星算法
   学习这个主要是用于寻路算法。
   参考资料主要是siki学院的视频,A计划--人工智能--A星算法。
网址http://www.sikiedu.com/course/62/tasks
   代码也是大部分参考里面,原本是C#的,用Java实现了一遍。
   一般看视频的话,基本一知半解,自己敲一遍,基本就能了解了
   
我先直接放代码,先跑成功后,再说明下整个实现
首先,需要将我们的地图虚拟化,我们用Point表示。
其次,创建整个地图,按照长宽来初始化。initMap
接着,写出计算FGH的值(先不用管是什么)的函数。calcF
再者,就是书写查找路径的方法。 findPath
1.循环"开启列表",while (openList.size() > 0) 
2.找到列表中F值最小的点M。findMinFOfPoint
3.找到M点周边可以到达的点数组L。getSurroundPoints
4.使用相关条件过滤掉一部分L中的点。pointsFilter
5.循环L,判断里面的G值是否比原来的更小(更优)for (Point surroundPoint : surroundPoints)

最后,就是输出结果showLoad

看具体的代码

Point类

package com.lizhao.astar.siki;public class Point implements Comparable<Point> {private Point parent;private int x;private int y;private float F;private float G;private float H;private boolean isWall = false;private boolean isLoad = false;public Point(int x, int y) {this(x, y, null);}public Point(int x, int y, Point parent) {this.x = x;this.y = y;this.parent = parent;}public void UpdateParent(Point parent, float g) {this.parent = parent;this.G = g;F = G + H;}public void updateFGH(float f, float g, float h) {this.F = f;this.G = g;this.H = h;}public Point getParent() {return parent;}public void setParent(Point parent) {this.parent = parent;}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 float getF() {return F;}public void setF(float f) {F = f;}public float getG() {return G;}public void setG(float g) {G = g;}public float getH() {return H;}public void setH(float h) {H = h;}public boolean isWall() {return isWall;}public void setWall(boolean wall) {isWall = wall;}public boolean isLoad() {return isLoad;}public void setLoad(boolean load) {isLoad = load;}@Overridepublic int compareTo(Point point) {return Float.compare(F, point.getF());}@Overridepublic String toString() {return "Point " + (getX() + 1) + "," + (getY() + 1);}
}

initMap方法

public void initMap() {for (int x = 0; x < mapWith; x++) {for (int y = 0; y < mapHeight; y++) {map[x][y] = new Point(x, y);}}
//    map[6][3].setWall(true);map[6][4].setWall(true);map[6][5].setWall(true);map[6][6].setWall(true);//    map[4][5].setWall(true);//    map[4][6].setWall(true);}

calcF方法

  /**************************************************************第一步,写出计算FGH的值**********************************************************//*** 计算F值** @param now 当前点* @param end 终点*/private void calcF(Point now, Point end) {//F = G + H// H 表示从指定的方格移动到终点 B 的预计耗费 (H 有很多计算方法, 这里我们设定只可以//上下左右移动).//G 表示从起点 A 移动到网格上指定方格的移动耗费 (可沿斜方向移动).float h = calcH(now, end);float g = calcG(now, now.getParent());float f = g + h;now.updateFGH(f, g, h);}/*** 获取H值* H 表示从指定的方格移动到终点 B 的预计耗费* (H 有很多计算方法, 这里我们设定只可以上下左右移动).** @param start* @param end* @return*/private float calcH(@NotNull Point start, @NotNull Point end) {return Math.abs(end.getX() - start.getX()) + Math.abs(end.getY() - start.getY());}/*** 获取G值* G 表示从起点 A 移动到网格上指定方格的移动耗费 (可沿斜方向移动).* 父节点到走到该节点的消耗** @param start* @param parent* @return*/private float calcG(@NotNull Point start, @NotNull Point parent) {float g = 0;if (start.getParent() == null) {g = 0;} else {g = PointUtil.getDistance(start, parent) + parent.getG();}return g;}

findPath方法

findMinFOfPoint 方法

  /*** 开启列表中F值最小的点** @param openList* @return*/private Point findMinFOfPoint(List<Point> openList) {float f = Float.MAX_VALUE;Point temp = null;for (Point p : openList) {if (p.getF() < f) {temp = p;f = p.getF();}}return temp;}

getSurroundPoints 方法、

  /*** 周围的点** @param point* @return*/private List<Point> getSurroundPoints(Point point) {Point up = null, down = null, left = null, right = null;Point lu = null, ru = null, ld = null, rd = null;if (point.getY() < mapHeight - 1) {up = map[point.getX()][point.getY() + 1];}if (point.getY() > 0) {down = map[point.getX()][point.getY() - 1];}if (point.getX() > 0) {left = map[point.getX() - 1][point.getY()];}if (point.getX() < mapWith - 1) {right = map[point.getX() + 1][point.getY()];}if (up != null && left != null) {lu = map[point.getX() - 1][point.getY() + 1];}if (up != null && right != null) {ru = map[point.getX() + 1][point.getY() + 1];}if (down != null && left != null) {ld = map[point.getX() - 1][point.getY() - 1];}if (down != null && right != null) {rd = map[point.getX() + 1][point.getY() - 1];}List<Point> list = new ArrayList<Point>();if (down != null && down.isWall() == false) {list.add(down);}if (up != null && up.isWall() == false) {list.add(up);}if (left != null && left.isWall() == false) {list.add(left);}if (right != null && right.isWall() == false) {list.add(right);}if (lu != null && lu.isWall() == false && left.isWall() == false && up.isWall() == false) {list.add(lu);}if (ld != null && ld.isWall() == false && left.isWall() == false && down.isWall() == false) {list.add(ld);}if (ru != null && ru.isWall() == false && right.isWall() == false && up.isWall() == false) {list.add(ru);}if (rd != null && rd.isWall() == false && right.isWall() == false && down.isWall() == false) {list.add(rd);}return list;}

pointsFilter 方法

  /*** 过滤掉周围的点** @param src* @param closeList*/private void pointsFilter(List<Point> src, List<Point> closeList) {for (Point p : closeList) {if (src.indexOf(p) > -1) {src.remove(p);}}}

findPath具体

  private void findPath(Point start, Point end) {List<Point> openList = new ArrayList<Point>();List<Point> closeList = new ArrayList<Point>();openList.add(start);while (openList.size() > 0) {Point point = findMinFOfPoint(openList);openList.remove(point);closeList.add(point);List<Point> surroundPoints = getSurroundPoints(point);pointsFilter(surroundPoints, closeList);for (Point surroundPoint : surroundPoints) {if (openList.indexOf(surroundPoint) > -1) {float nowG = calcG(surroundPoint, point);if (nowG < surroundPoint.getG()) {surroundPoint.UpdateParent(point, nowG);}} else {surroundPoint.setParent(point);calcF(surroundPoint, end);openList.add(surroundPoint);}}//判断一下if (openList.indexOf(end) > -1) {break;}}}

showLoad方法

  private void showLoad() {for (int i = 0; i < map.length; i++) {for (int j = 0; j < map[i].length; j++) {if (map[i][j].isLoad()) {System.out.print("$");} else if (map[i][j].isWall()) {System.out.print(1);} else if (map[i][j].getParent() != null) {System.out.print(3);} else {System.out.print(0);}System.out.print(",");}System.out.println();}}

写个测试方法:

  //测试A星算法public static void testAStar() {AStar aStar = new AStar();aStar.initMap();Point start = aStar.map[4][4];Point end = aStar.map[8][5];aStar.findPath(start, end);aStar.showPath(start, end);aStar.showLoad();System.out.println("Hello World! ");}

最后的输出结果,0是地图,1是墙,3是被探索过的区域,$是具体的路径

 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,
    0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,
6   0,0,3,3,3,3,1,3,$,3,0,0,0,0,0,
5   0,0,3,3,$,3,1,3,$,3,0,0,0,0,0,
4   0,0,0,3,3,$,$,$,3,3,0,0,0,0,0,
    0,0,0,0,3,3,3,3,3,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
            5,6 

            6,4     14+50
            6,5     10+40
            6,6     14+30
            6,7     24+40

nice
上面的代码在码云上 https://gitee.com/lizhaoandroid/BehaviorTree,在com.lizhao.astar.siki包下面
可以加qq群一起学习讨论Java游戏服务器开发的相关知识 676231524

Java游戏服务器开发之A星算法相关推荐

  1. ioGame 网络游戏服务器框架 (java)、java游戏服务器、netty 集群分步式的网络游戏服务器

    ioGame 国内首个基于蚂蚁金服 SOFABolt 的 java 网络游戏服务器框架:无锁异步化.事件驱动的架构设计 通过 ioGame 可以很容易的搭建出一个集群无中心节点.有状态多进程的分步式游 ...

  2. 【阅读笔记】Java游戏服务器架构实战

    [阅读笔记]Java游戏服务器架构实战 书籍链接:Java游戏服务器架构实战 作者提供的源码链接:kebukeYi / book-code 这里对书籍中比较重要的知识点(精华部分)进行摘录(总结) 文 ...

  3. 如何学习java游戏服务器开发?

    为什么游戏服务器很多都用Java开发 Java 做游戏服务器开发的优势还是很多的,<我的世界>的服务器就是Java开发的.Java技术比较成熟,大数据,云计算,网站App后台,基本都采用J ...

  4. 学习JAVA游戏服务器开发需要了解的情况

    一,游戏服务器开发的工作介绍 近来遇到有很多人想从其它开发领域转到游戏服务器开发行业上来,他们或许觉得游戏服务器开发工资高,或许觉得做游戏服务器需要掌握的技术更高级,可以锻炼自己,或许觉得想换个环境等 ...

  5. Java游戏服务器系列之Netty详解

    今天带大家来学习Java游戏服务器的相关知识,文中对Netty作了非常详细的介绍,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下 一.简介 Java的底层API逐渐复杂,而开发者面对的 ...

  6. 高性能服务器开发之C++定时器

    高性能服务器开发之C++定时器 来源: https://www.cnblogs.com/junye/p/5836552.html 写这篇文章前搜了下网上类似的文章,有很多,所以笔者的这篇文章就不对定时 ...

  7. java游戏服务器必备

    推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 对于一个新手,想接触游戏服务器,一定会有个疑问--使用Java开发服务器需要学习什么? Java语言,由于学习成本低,开发速度快,稳定 ...

  8. 【游戏开发】《Java游戏服务器架构实战》项目在windows上部署

    [游戏开发]<Java游戏服务器架构实战>项目在windows上部署 文章目录 [游戏开发]<Java游戏服务器架构实战>项目在windows上部署 一.配置项目基础环境 二. ...

  9. Java游戏服务器开发之概念扫盲

    入行缘由 在2017年我正式的从web转Java游戏服务器开发.那个时候机缘巧合的投了一家使用Java语言开发游戏服务器的企业,当时的老板还问我为什么从web转游戏开发.当时我的回答还是历历在目:我喜 ...

最新文章

  1. Android 5.0新特性ToolBar
  2. java 内部类 抽象类_Java 内部类、匿名内部类、抽象类
  3. 成功解决基于pyecharts生成的html文件打开时显示空白
  4. Boost asio学习笔记之二—— 网络编程
  5. 深入理解java中的Soft references amp;amp; Weak references amp;amp; Phantom reference
  6. spring整合mybatis采坑
  7. 江西财经大学计算机排名2019,2019年全国商科院校评价报告出炉 江西财经大学排名第七...
  8. 超级计算机子系统,大规模并行巨型机的并行I/O子系统
  9. 物理搬砖问题_人物专访|从“搬砖烧炉工”到MIT物理PhD, 很普通、很坚持、很热爱...
  10. 安卓java游戏模拟器_java游戏模拟器安卓版下载
  11. adb 清理内存_教你几招如何清理手机内存,加快运行速度!
  12. (php毕业设计)基于thinkphp5小区物业管理系统
  13. 1、电脑鼠标右键反应慢,解决办法
  14. 考研二战日记-第11天——高数2.1 导数概念
  15. SLT2021: LIGHTSPEECH: LIGHTWEIGHT NON-AUTOREGRESSIVE MULTI-SPEAKER TEXT-TO-SPEECH
  16. 误传了数千年的几个名句
  17. 并发编程--线程池原理
  18. 设置canvas画布大小
  19. 使用WebGL绘制流动虚线
  20. PHP获取每个周五或周一的日期

热门文章

  1. 相对应力梯度在疲劳分析中的影响及应用案例
  2. Deform二次开发入门
  3. Tomcat文件服务器搭建过程详解
  4. oracle定时备份详解,oracle数据定时备份
  5. 如何用FL Studio做电音
  6. 计算机本地连接 协议4打不开,本地连接属性:Internet协议版本4(TCP/IPv4)打开闪退解决办法...
  7. 10.20-smbus
  8. kudu table
  9. UG创建图纸明细表失败的情况
  10. Python爬虫——百度+新浪微盘下载歌曲