开发基于2D平铺的“棋盘游戏”当玩家掷骰子时,我正在努力克服我必须做出的限制(如果你降落5等,移动5个牌)。
我一直在寻找A *和D *路径,但这对我来说是一个新主题,他们似乎更专注于从A点到B点,而不是“达到”这是我需要的。
如何通过代码执行此操作?
我从一个拿着我的瓷砖的数组创建了一个2D数组(我需要一个普通的tilemap数组用于其他目的):
for(int i = 0; i < 27; i++)
{
for(int j = 0; j < 33; j++)
{
tileMap[i, j] = goTile[i * 33 + j];
}
}
我现在使用tileMap作为我的positiong因子,例如我的球员当前位置是tileMap [2,4]。
然后我尝试开发一个函数:
void pathFinding(Vector2 playerPosition, int diceNumber)
{
GameObject currentPos = tileMap[(int)playerPosition.x, (int)playerPosition.y];
for (int i = 0; i < diceNumber; i++) {
if (tileMap[(int)playerPosition.x + 1, (int)playerPosition.y].tag == "walkableGrid")
{
tileMap[(int)playerPosition.x + 1, (int)playerPosition.y].gameObject.tag = "reachable";
playerPosition.x++;
}
if (tileMap[(int)playerPosition.x - 1, (int)playerPosition.y].tag == "walkableGrid")
{
playerPosition.x--;
}
if (tileMap[(int)playerPosition.x, (int)playerPosition.y + 1].tag == "walkableGrid")
{
playerPosition.y++;
}
if (tileMap[(int)playerPosition.x, (int)playerPosition.y - 1].tag == "walkableGrid")
{
playerPosition.y--;
}
}
}
但是当完成这个(如果它甚至可以工作)时,需要多行代码,我相信有一个更快的方法使用嵌套for循环可能吗?
答案 0 :(得分:2)
//I have now edited the code to better reflect your real data
public void ShowMoves(Vector2 playerPosition, int diceNumber, bool[] blocks)
{
int x = (int)playerPosition.x;
int y = (int)playerPosition.y;
if(tileMap.GetUpperBound(0) < x + 1)
{
if(tileMap[x + 1, y].tag == "walkableGrid" && blocks[0])
{
/*Light up the tile*/
if(diceNumber > 0)
ShowMoves(new Vector2(x + 1, y), diceNumber - 1, new bool[] { x != tileMap.GetUpperBound(0), false, y != tileMap.GetUpperBound(1), y != 0 });
}
}
if(x - 1 >= 0)
{
if(tileMap[x - 1, y].tag == "walkableGrid" && blocks[1])
{
/*Light up the tile*/
if(diceNumber > 0)
ShowMoves(new Vector2(x - 1, y), diceNumber - 1, new bool[] { false, x != 0, y != tileMap.GetUpperBound(1), y != 0 });
}
}
if(tileMap.GetUpperBound(1) < y + 1)
{
if(tileMap[x, y + 1].tag == "walkableGrid" && blocks[2])
{
/*Light up the tile*/
if(diceNumber > 0)
ShowMoves(new Vector2(x, y + 1), diceNumber - 1, new bool[] { x != tileMap.GetUpperBound(0), x != 0, y != tileMap.GetUpperBound(1), false });
}
}
if(y - 1 >= 0)
{
if(tileMap[x, y - 1].tag == "walkableGrid" && blocks[3])
{
/*Light up the tile*/
if(diceNumber > 0)
ShowMoves(new Vector2(x, y - 1), diceNumber - 1, new bool[] { x != tileMap.GetUpperBound(0), x != 0, false, y != 0 });
}
}
}
此代码可能无法编译,但它是一个帮助您的示例 - 它将循环直到没有可用的移动,并耗尽每个选项。由于blocks
布尔数组,它也不会自行恢复。输入格式是两个整数的位置,一个用于x,一个用于y,可用的磁贴,滚动中剩余的移动数量,以及从开头可用的块(始终为new bool[] {true, true, true, true}
< / p>
小心,我的代码中可能存在错误,我在SO中编写它并且不知道它运行得如何,如果它运行完全或任何东西。即使它没有,它应该是一个很好的起点,你可以创建你的逻辑和编码所有
编辑:代码已更改,以便更好地适合您的代码外观及其使用的数据类型
为避免总是通过输入blocks
new bool[] {true, true, true, true};
变量调用方法,您可以通过将此方法参数设为可选运算符
public void ShowMoves(Vector2 playerPosition, int diceNumber, bool[] blocks = new bool[] {true, true, true, true})