我正在做一个小游戏,我将在一个移动的网格上有一个角色。当他们四处走动时,我将使用Dijkstra的算法进行路径测量。唯一的问题是我想制作薄壁(而不是仅仅删除节点),如:http://i.gyazo.com/85d110c17cf027d3ad0219fa26938305.png
我认为最好的方法就是编辑2个方格之间的边缘权重,使其永远不会交叉。无论如何,关于这个问题:
为网格中的每个连接分配边权重的最有效方法是什么?
我考虑使用邻接矩阵,但对于15x6网格,这是一个90x90矩阵,似乎......过度。任何帮助都会很好,谢谢(:
答案 0 :(得分:0)
您只需要在直线方块之间存储边缘,并且方形最多可以有4个邻居,每个方向一次。将节点访问的边缘存储为最多4个枚举项{up,down,left,right}。那个小于90 x 4。
答案 1 :(得分:0)
可以帮助您决定应该做什么的一些指示:
double
作为权重,则可以使用很多语言
您可以使用的无限值。在java中
Double.POSITIVE_INFINITY
。关于无穷大的美 - 尽管你加入它,它仍然保持无穷大(并且不会像整数一样溢出)。O(V^2)
的时间复杂度变为O(V+E)
(在您的情况下实际为O(V)
)和O(V^2)
代替Dijkstra算法而不是O(E + VlogV)
(图表为O(VlogV)
)答案 2 :(得分:0)
我同意多岩石的回答 - 只需为数组中的每个方块存储四个方向的权重(每个数组元素将是包含四个权重的结构/元组)。要在两个任意方块之间查找边缘,首先要检查它们是否相邻,如果是,请使用数组中的适当权重。不知道为什么有人提到邻接列表或矩阵,这里是多余的。
答案 3 :(得分:0)
尝试使用以下代码创建游戏。
b'/'
答案 4 :(得分:0)
使用此代码初始化大型阵列的游戏板。然后为墙的位置添加空值,确保将墙添加到两个单元格。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
cell game = new cell(90, 100);
}
}
public class cell
{
public static cell[,] board = null;
public int index { get; set; } //row number * 6 + col
public int row { get; set;}
public int col { get; set;}
public cell up { get; set; }
public cell down { get; set; }
public cell left { get; set; }
public cell right { get; set; }
public bool visited { get; set; }
public cell() { }
public cell(int rows, int cols)
{
board = new cell[rows, cols];
int cellNumber = 0;
for (int row = 0; row < rows; row++)
{
for (int col = 0; col < cols; col++)
{
board[row, col] = new cell();
board[row, col].visited = false;
}
}
for (int row = 0; row < rows; row++)
{
for (int col = 0; col < cols; col++)
{
cellNumber = (row * cols) + col;
board[row, col].index = cellNumber;
board[row, col].row = row;
board[row, col].col = col;
if (col == 0)
{
board[row, col].left = null;
}
else
{
board[row, col].left = board[row, col - 1];
}
if (row == 0)
{
board[row, col].up = null;
}
else
{
board[row, col].up = board[row - 1, col];
}
if (col == cols - 1)
{
board[row, col].right = null;
}
else
{
board[row, col].right = board[row, col + 1];
}
if (row == rows - 1)
{
board[row, col].down = null;
}
else
{
board[row, col].down = board[row + 1, col];
}
}
}
}
}
}