Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从给定半径内的X、Y、Z数组中获取数据_C#_Arrays_Radius - Fatal编程技术网

C# 从给定半径内的X、Y、Z数组中获取数据

C# 从给定半径内的X、Y、Z数组中获取数据,c#,arrays,radius,C#,Arrays,Radius,我正在开发一个游戏服务器,目前我需要能够在一个区域内吸引观众,但是我担心我正在使用的服务器非常难看和“缓慢”,但我还没有体验到任何性能影响,因为我正在本地测试它,而不是在一个实时服务器上 这是我的GetOccessors函数: public void GetSpectators(ref HashSet<Player> Players, Coordinate_t coordinate, bool MultiFloor = false) { for

我正在开发一个游戏服务器,目前我需要能够在一个区域内吸引观众,但是我担心我正在使用的服务器非常难看和“缓慢”,但我还没有体验到任何性能影响,因为我正在本地测试它,而不是在一个实时服务器上

这是我的GetOccessors函数:

public void GetSpectators(ref HashSet<Player> Players, Coordinate_t coordinate, bool MultiFloor = false)
        {
            for (int x = coordinate.X - 11; x != coordinate.X + 11; x++)
            {
                for (int y = coordinate.Y - 11; y != coordinate.Y + 11; y++)
                {
                    if (MultiFloor)
                    {
                        for (int z = coordinate.Z - 2; z != coordinate.Z + 2; z++)
                        {
                            Tile tile = GetTile(x, y, z);
                            if (tile != null)
                            {
                                foreach (Player p in tile.Creatures)
                                {
                                    Players.Add(p);
                                }
                            }
                        }
                    }
                    else
                    {
                        Tile tile = GetTile(x, y, coordinate.Z);
                        if (tile != null)
                        {
                            foreach (Player p in tile.Creatures)
                            {
                                Players.Add(p);
                            }
                        }
                    }
                }
            }
        }
public void getconsiders(ref HashSet Players,坐标,bool MultiFloor=false)
{
for(intx=coordinate.x-11;x!=coordinate.x+11;x++)
{
for(int y=coordinate.y-11;y!=coordinate.y+11;y++)
{
if(多层)
{
for(intz=coordinate.z-2;z!=coordinate.z+2;z++)
{
Tile-Tile=GetTile(x,y,z);
如果(平铺!=null)
{
foreach(玩家p在瓦片中。生物)
{
玩家。添加(p);
}
}
}
}
其他的
{
Tile-Tile=GetTile(x,y,坐标Z);
如果(平铺!=null)
{
foreach(玩家p在瓦片中。生物)
{
玩家。添加(p);
}
}
}
}
}
}
我有一个类映射,它包含另一个字典和类Tile,每个Tile用X,Y,Z坐标表示,每个Tile包含一个名为Player的类列表,有些Tile包含Player,有些没有Player

我需要一种好的方式,而不是丑陋的方式,例如:


例如,半径为11的x=100、y=100、z=7范围内的所有玩家。

您可以使用圆方程检查玩家是否位于其他玩家的给定半径内,即

if
x1=100,y1=100,z=7 and r=11

then
(x-x1)^2+(y-y1)^2+(z-z1)^2=r^2.

满足此等式的任何点都位于该区域。

我认为,如果您尚未在
Player
类中引用互动程序,然后将所有玩家传递给
GetOccessors()
方法,这将是一个明智的做法

类似于

public class Player
{
    // a reference to the tile that the player is currently on.
    public Tile CurrentTile { get; set; }
}
这将允许你在玩家之间循环,而不是在如此多的牌之间循环。它应该更干净,更有效地找到玩家的方式,你想没有所有的循环嵌套。例如:

public List<Player> GetSpectators(Hashset<Player> playersInGame, Coordinate coord)
{
    var playersInRange = new List<Player>();

    // iterate through each player.
    foreach (var p in playersInGame)
    {
        // check if the tile the player is sitting on is in range of radius given.
        if ((p.CurrentTile.X < coord.X + 6 || p.CurrentTile.X > coord.X - 6)
            &&
            (p.CurrentTile.Y < coord.Y + 6 || p.CurrentTile.Y > coord.Y - 6))
        {
            // Player is within radius.
            playersInRange.Add(p);
        }
    }

    return playersInRange;
}
公共列表获取观众(哈希集玩家名称,坐标坐标坐标)
{
var playersInRange=新列表();
//遍历每个玩家。
foreach(playersInGame中的var p)
{
//检查玩家坐的地砖是否在给定的半径范围内。
如果((p.CurrentTile.Xcoord.X-6)
&&
(p.CurrentTile.Ycoord.Y-6))
{
//玩家在半径范围内。
playersInRange.Add(p);
}
}
返回playersInRange;
}

您可以添加Z坐标的附加检查和任何其他条件语句。但正如您所看到的,这将允许您使用一个循环,而不是3个嵌套循环。你可能觉得它有用,也可能不有用。但是我希望它能有所帮助。

不回答您的问题-您不需要通过
ref
传递
Players
,因为您没有在方法内部为
Players
分配新的HashSet实例。另外,
Players
应该是
Players
MultiFloor
应该是
MultiFloor
。如果说这个圆方程适用于整个正方形区域(例如,玩家的可见地图),这是否意味着在列表中循环比for(x…)更快?是的。时间复杂度将是O(n),其中n是玩家的数量。少于3个嵌套循环谢谢!这真的节省了我的程序每次玩家移动瓷砖时1~2%的使用率!太棒了!