【问题标题】:Creating a List of Arrays in C#?在 C# 中创建数组列表?
【发布时间】:2013-12-21 03:37:40
【问题描述】:

所以我正在开发一个使用坐标系的游戏,我想用一定数量的树来填充地图。我这样做的方式(它可能不是最好的方式)是选择一组随机坐标,检查这些坐标是否在有树的位置列表中,如果没有将树添加到地图,并将这些坐标添加到列表中。我的直觉是将坐标存储为一个数组,但是我似乎无法弄清楚它的语法。这是我所拥有的:

int boardWidth = 10;
int boardHeight = 10;
int numTrees = 75;
List<int[]> hasTree = new List<int[]>();
public Transform tree;

Transform[,] SetTrees(Transform[,] map) {

    int treex = Random.Range(0,boardWidth-1);
    int treey = Random.Range(0,boardHeight-1);
    int[] treeCoords = new int[] { treex,treey };
    int treeCount = 0;

    while(treeCount < numTrees){

        if (hasTree.Contains(treeCoords)){
            treex = Random.Range(0,boardWidth-1);
            treey = Random.Range(0,boardHeight-1);
        }
        else{
            map[treex,treey] = (Transform)Instantiate(tree, new Vector3(i*tileWidth, 10, j*tileHeight), Quaternion.AngleAxis(90, Vector3.left));
            hasTree.Add(treeCoords);
            treex = Random.Range(0,boardWidth-1);
            treey = Random.Range(0,boardHeight-1);
            treeCount++;
        }
    }

    return(map);
}

有什么想法吗?

【问题讨论】:

  • hasTree.Add(treeCoords); ???那个“hasTree”对象是什么?它没有在上面的代码中定义?
  • 我会简化代码以...开始
  • 对不起,添加了之前定义的变量。

标签: c# arrays list unity3d


【解决方案1】:

如果我是你,我会尝试这样的:

int boardWidth = 10;
int boardHeight = 10;
int numTrees = 75;

var rnd = new Random();

var query =
    from x in Enumerable.Range(0, boardWidth)
    from y in Enumerable.Range(0, boardHeight)
    orderby rnd.NextDouble()
    select new { x, y };

var board = new bool[boardWidth, boardHeight];

foreach (var pair in query.Take(numTrees))
{
    board[pair.x, pair.y] = true;
}

【讨论】:

  • 这太棒了……我喜欢 linq :)……奇怪的是,有些人只是在这样的查询中自然而然地思考……我希望我有你的大脑!!!
【解决方案2】:

保持简单傻:

Transform[,] SetTrees(Transform[,] map) {
    for(int treeCount = 0; treeCount < numTrees; treeCount++){
        int treex = Random.Range(0,boardWidth-1);
        int treey = Random.Range(0,boardHeight-1);

        map[treex,treey] = new TreeTransform(treex, treey}
    }
    return(map);
}

将Tree创建的细节埋在它所属的构造函数TreeTransform中。

谁在乎板上树的创建顺序?没用。

树的数量没有理由要准确,所以忽略重复。

【讨论】:

  • 你不是删掉了一大堆功能吗?
  • @Wardy:在描述它的用途之前,它只是掩盖了装箱的问题。如果需要排序的树列表,请创建排序列表;但未排序的列表没有价值。正如我悲伤的介绍 - K.I.S.S.将其他功能放在需要的地方。
  • @Wardy:这是一个 x-y 问题:meta.stackexchange.com/questions/66377/what-is-the-xy-problem。 OP 给了我们一个糟糕的解决方案,并要求我们纠正它。我试图指出其他解决方案的可能性,而不是针对坏的解决方案。
  • 你删掉的功能不是“如何创建一棵树”而是“这里是否已经存在一棵树”,这里正在处理的逻辑显然是在地图上的一组树之后在此函数调用退出后。
  • @Wardy:在真正的比赛中,精确的 3890 发球台而不是 3889 或 3888 有什么用处?
【解决方案3】:

简化代码,这样可能更容易确定您的最佳行动方案。 我通过分解问题来简化它,直到它如此简单我真的看不出如何不去做!!!

我猜这里的一些代码是如何工作的,但我认为你想要这样的东西......

Transform[,] SetTrees(Transform[,] map) {

    for (int i = 0; i < numTrees; i++){
       if(!AddTreeTo(map)){
          --i;
       }
    }

    return(map);
}

bool AddTreeToMap(Transform[,] map)
{
        int[] treeCoord = GetRandomCoord(map.Width, map.Height);

        if (!map[treeCoord[0],treeCoord[1]].HasTree()){
            map[treex,treey] = (Transform)Instantiate(tree, new Vector3(i*tileWidth, 10, j*tileHeight), Quaternion.AngleAxis(90, Vector3.left));
            map[treeCoord[0],treeCoord[1]].Add(treeCoords);
            return true;
        }
        return false;
}

int[] GetRandomTreeCoord(int maxX, int maxY)
{
    int treex = Random.Range(0,maxX-1);
    int treey = Random.Range(0,maxY-1);
    int[] treeCoords = new int[] { treex,treey };

    return treeCoords;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2013-01-28
    相关资源
    最近更新 更多