选择半径周围的六边形

时间:2017-03-13 15:52:57

标签: c# list hexagonal-tiles

我有一张六边形的地图。当点击一个部队所在的六边形时,应根据部队的范围变量突出显示所点击的其他六边形。

我自己尝试了很多方法,但都失败了。我似乎无法获得突出显示正确的列表。在这个例子中,我将使用一系列2个瓦片。

我试图实现的方法如下: 有3个列表。

  • 打开列表包含要按1
  • 扩展的节点
  • 关闭列表包含将突出显示的节点
  • 删除列表包含已展开的节点

我遵循以下算法:

  1. 将开始节点添加到所有列表。

  2. 将打开列表中的节点展开1个图块。

  3. 使用删除列表删除打开列表中的节点。

  4. 将开放列表节点添加到关闭列表中。

  5. 清除删除列表。

  6. 复制打开列表内容以删除列表。

  7. 重复任何部队的范围。

  8. 我的目标是在点击的瓷砖周围突出显示半径为r的六角形瓷砖; r =部队范围。

    我很失落,我可能会犯一些明显的错误。任何帮助将不胜感激!

    (以下是我制作的代码)

    private List<string> expand(List<string> open, bool odd)
        {
            List<string> newopen = new List<string>();
            int oddEven = 1;
            if (odd == false)
            {
                oddEven = -1;
            }
            foreach (string s in open)
            {
                string[] rc = s.Split('.'); //row + col of the current hex
                int Row = int.Parse(rc[0]);
                int Col = int.Parse(rc[1]);
    
                for (int r = 1; r >= -1; r--)
                {
                    for (int c = -1; c <= 1; c++)
                    {
                        if (!((r == oddEven && c != 0) || (r== 0 && c == 0)))
                        {
                            if (((Row + r) > -1 && (Col + c) > -1) && ((Row + r) < 9 && (Col + c) < 18)) //mapcheck
                            {
                                if (Hexmap[Row + r, Col + c] == '-') //mapcheck
                                {
                                    newopen.Add((Row + r).ToString() + "." + (Col + c).ToString());
                                }
                            }
                        }
                    }
                }
            }
    
            return newopen;
        }
        private void Remove(ref List<string> rem, ref List<string> open)
        {
            foreach (string s in rem)
            {
                open.Remove(s);
            }
        }
        private void Add(ref List<string> closed, ref List<string> open)
        {
            foreach (string s in open)
            {
                closed.Add(s);
            }
        }
    
        private void TroopSelect(int row, int col, int range)
        {
            bool odd = true;
            if ((row % 2) == 0)
            {
                odd = false;
            }
    
            List<string> open = new List<string>();
            List<string> close = new List<string>();
            List<string> remove = new List<string>();
    
            open.Add(row.ToString() + "." + col.ToString());
            close.Add(row.ToString() + "." + col.ToString());
            remove.Add(row.ToString() + "." + col.ToString());
    
            for (int i = 0; i < range; i++)
            {
                open = expand(open, odd); //row and col of the current point being checked --- REMOVE ROW COL, find it out from the list within the function
                Remove(ref remove, ref open); //remove from open the remove hex values
                Add(ref close, ref open); //add to closed what's in open
                remove.Clear();  //clear remove
                remove = open; //set remove the same as open
            }
    
            foreach (string s in close)
            {
                string[] rc = s.Split('.'); //row + col of the current hex
                int Row = int.Parse(rc[0]);
                int Col = int.Parse(rc[1]);
    
                Hexagons.Add(new PointF(Row, Col));
            }
        }
    
        private void CheckTroop(int row, int col)
        {
            if (Hexmap[row, col] == 'o') //it's a friendly troop
            {
                foreach (Troops t in playertroops)
                {
                    if (t.row == row && t.column == col)
                    {
                        TroopSelect(row, col, t.range);
                        this.battlegrid.Invalidate();                   
                    }
                }
            }
        }
    
        private void battlegrid_MouseClick(object sender, MouseEventArgs e)
        {
            int row, col;
            PointToHex(e.X, e.Y, HexHeight, out row, out col); //gets the hex in the x/y position
            CheckTroop(row, col);
    
            //this.Invalidate();
        }
    

    下面还有两张图片:(忽略背景中的岩石!)

    1. 第一个部队范围= 1,工作正常

    2. 部队范围的第二张图像= 2,不能正常工作 troop range 1 troop range 2

    3. 再次感谢您的帮助。

0 个答案:

没有答案