Java 如何使人工智能系统选择最快的方式,并通过墙壁导航到特定的网格点

Java 如何使人工智能系统选择最快的方式,并通过墙壁导航到特定的网格点,java,algorithm,Java,Algorithm,基本上,我在尝试改进我正在制作的一款吃豆人游戏中的幽灵。在原始的《吃豆人》中,当一个鬼魂被吃掉时,当《吃豆人》获得能量时,鬼魂的眼睛会导航回原处,然后将鬼魂产卵回原处。我想这样做。它还可以帮助我实现一个鬼AI,让它们比随机的移动更智能 因此,基本上,这些眼睛必须通过这个导航: 从下面的2D阵列中绘制电路板: //0's = Walls or location not allowed to go //1's = Dot Spot //2's = Clear Path nothing o

基本上,我在尝试改进我正在制作的一款吃豆人游戏中的幽灵。在原始的《吃豆人》中,当一个鬼魂被吃掉时,当《吃豆人》获得能量时,鬼魂的眼睛会导航回原处,然后将鬼魂产卵回原处。我想这样做。它还可以帮助我实现一个鬼AI,让它们比随机的移动更智能

因此,基本上,这些眼睛必须通过这个导航:

从下面的2D阵列中绘制电路板:

  //0's = Walls or location not allowed to go
  //1's = Dot Spot
  //2's = Clear Path nothing on it but safe to move
  //3's = Power Dot
  //-1's = only ghosts can go through
  //5= Top entry spot
  //6= bottom entry point
  //7 = Cherry
  //(Spots = row - 1 same with columns = - 1. First # is row. Second is col
  public int board[][] =
  {{2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, //1
    {2, 0, 3, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 3, 0, 2}, //2
    {2, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 2}, //3
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2}, //4
    {2,0,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,1,0,2}, //5
    {2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,0,2}, //6
    {2,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2}, //7
    {2,2,2,2,0,1,0,1,1,1,1,1,1,1,0,1,0,2,2,2,2}, //8
    {0,0,0,0,0,1,0,1,0,0,-1,0,0,1,0,1,0,0,0,0,0}, //9
    {5,2,2,2,2,1,1,1,0,2,2,2,0, 1 ,1,1,2,2,2,2,6}, //10 - cherry
    {0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0}, //11
    {2,2,2,2,0,1,0,1,1,1,2,1,1,1,0,1,0,2,2,2,2}, //12
    {2,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,2}, //13
    {2,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,2}, //14 - pacman on this row
    {2,0,1,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,2}, //15
    {2,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,2}, //16 
    {2,0,0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,0,2}, //17
    {2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,0,2}, //18
    {2,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,2}, //19
    {2,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,2}, //20
    {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}}; //21


因此,我的问题是,我应该如何让眼睛以最快的方式到达中心原点而不穿过墙壁?

你可以在有障碍的矩阵中寻找最短路径。

你可以在有障碍的矩阵中寻找最短路径。

只需使用预先计算的墨迹即可。主正方形标记为零。然后,将标记为n的正方形的所有未指定的相邻正方形指定为标记n+1。现在你所有死去的鬼魂所要做的就是搬到一个标签较低的邻近广场。最终他们会走最短的路回家。轻松点

只需使用预先计算好的墨迹即可。主正方形标记为零。然后,将标记为n的正方形的所有未指定的相邻正方形指定为标记n+1。现在你所有死去的鬼魂所要做的就是搬到一个标签较低的邻近广场。最终他们会走最短的路回家。轻松点

@sje397别作恶:Dijkstra在这张地图上会做得很好。有关原始Pac Man中人工智能是如何工作的文章,请参阅。@ChristofferHammarström我知道我需要做什么,但不知道如何做。我不明白如何获得所有有效路径到目标点的距离。一旦我知道哪条路走得最少,决策部分就很容易了,但我就是不知道如何在十字路口选择最短的路径。@Fogest:这篇文章不是关于什么,而是关于如何。最初的人工智能没有像那样工作。它没有试图找到最短的路径。这并不重要,你可以随心所欲,我想你会觉得这篇文章很有趣。@ChristofferHammarström是的,我想你是对的,它只是检查了除了后面以外的各个方向上的自由点,然后检查了哪些点直接更长,如果鬼魂在路径上行走,它实际上并不计算距离。这确实让事情变得容易多了。根据我还有多少时间来完成这项工作,我认为检查直达距离会花费更少的时间,因此即使更少,也是一个更好的选择smart@sje397不要作恶:Dijkstra在这张地图上会做得很好。有关原始《吃豆人》中人工智能的实际工作原理的文章,请参阅。@ChristofferHammarström我明白我的意思需要做的只是如何去做。我不明白如何获得所有有效路径到目标点的距离。一旦我知道哪条路走得最少,决策部分就很容易了,但我就是不知道如何在十字路口选择最短的路径。@Fogest:这篇文章不是关于什么,而是关于如何。最初的人工智能没有像那样工作。它没有试图找到最短的路径。这并不重要,你可以随心所欲,我想你会觉得这篇文章很有趣。@ChristofferHammarström是的,我想你是对的,它只是检查了除了后面以外的各个方向上的自由点,然后检查了哪些点直接更长,如果鬼魂在路径上行走,它实际上并不计算距离。这确实让事情变得容易多了。根据我完成这项工作所剩的时间,我认为检查直达距离会花费更少的时间,因此是一个更好的选择,即使不那么聪明。我对编程非常陌生,还没有使用或学习过算法,所以说起来容易做起来难。@Fogest:你需要一些算法技巧来解决这个问题。关于路径搜索的基础知识,我可以推荐这本书的前几章。我对编程相当陌生,还没有使用或学习过算法,所以说起来容易做起来难。@Fogest:你需要一些算法技巧来解决这个问题。我可以推荐这本书,前几章,作为路径搜索的基础。所以你说,基本上,在一个方向上的每个方块每次都会被分配n+1?这就是Dijkstra,正如alf所说,它非常适合这个问题。这是对Dijkstra的一个重大简化,因为在这种情况下,通过采取更多的步骤,您无法找到更短的路径。Fogest,您只需要计算墨迹一次,因为它永远不会改变。@Rafe抱歉,我不明白您所说的计算墨迹是什么意思。我理解需要做什么的概念,但对于我这样的技术水平的人来说植入是很困难的。所以你说基本上,一个方向上的每个方块每次都会被分配n+1?这就是Dijkstra,正如alf所说,这是非常困难的
适合这个问题。这是对Dijkstra的一个重大简化,因为在这种情况下,通过采取更多的步骤,您无法找到更短的路径。Fogest,您只需要计算墨迹一次,因为它永远不会改变。@Rafe抱歉,我不明白您所说的计算墨迹是什么意思。我理解需要做什么的概念,但对我这样的技术水平的人来说植入是困难的。