Tilebased boardgame dicenumber限制(增量算法)

时间:2016-11-15 13:38:38

标签: c#

开发基于2D平铺的“棋盘游戏”当玩家掷骰子时,我正在努力克服我必须做出的限制(如果你降落5等,移动5个牌)。

我正在尝试使用以下逻辑: enter image description here

  • 从起点开始
  • 检查
  • 上方和下方的位置
  • 检查邻居图块是否可以步行,如果是,则将它们更改为可到达
  • 转到邻居区域,重复

我一直在寻找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循环可能吗?

1 个答案:

答案 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})