动态多维数组c#
我不知道以前是否回答过这个问题,但这个问题确实很具体。我正在尝试用c#编写一个地下城生成器,我希望数组的大小是动态的,并根据输入的大小在控制台中显示为网格。我让数组是动态的,它可以以网格形式显示每个索引,但我不知道如何使一行中的索引数量是动态的。以下是我目前掌握的情况:动态多维数组c#,c#,arrays,dynamic,C#,Arrays,Dynamic,我不知道以前是否回答过这个问题,但这个问题确实很具体。我正在尝试用c#编写一个地下城生成器,我希望数组的大小是动态的,并根据输入的大小在控制台中显示为网格。我让数组是动态的,它可以以网格形式显示每个索引,但我不知道如何使一行中的索引数量是动态的。以下是我目前掌握的情况: Random rand = new Random(); int num; num = Convert.ToInt32(Console.ReadLine()); in
Random rand = new Random();
int num;
num = Convert.ToInt32(Console.ReadLine());
int x = num;
int y = num;
int i = x - 1;
int j = y - 1;
int[,] dungeon = new int[x,y];
for(int z = 0; z <= i; z++)
{
int a = 0;
for( a = 0; a <= j; a++)
{
dungeon[a,z] = rand.Next(0,2);
}
}
for (int h = 0; h <= i; h++)
{
if (h == 0)
{
Console.WriteLine("#-#-#-#-#");
}
Console.WriteLine("|" + dungeon[h,0] + "|" + dungeon[h,1] + "|" + dungeon[h,2] + "|" + dungeon[h,3] + "|");
Console.WriteLine("#-#-#-#-#");
Random rand=new Random();
int-num;
num=Convert.ToInt32(Console.ReadLine());
int x=num;
int y=num;
int i=x-1;
int j=y-1;
int[,]地下城=新int[x,y];
对于(int z=0;z嗯,当前网格始终是一个精确的正方形。因为两个维度使用相同的值。是否只想为每个维度使用一个单独的值?如果是,则需要从输入中获取另一个值。可以使用与现有方法相同的方法进行此操作。例如:
int x = Convert.ToInt32(Console.ReadLine());
int y = Convert.ToInt32(Console.ReadLine());
有几件事需要注意:
您不需要num
变量,只需立即将其分配给另一个变量,然后再也不要使用num
。只需首先使用您想要的变量即可
作为一项学术练习,请查看int.TryParse()
以及如何使用它的示例。当前,如果输入的不是整数,则应用程序将崩溃。使用int.TryParse()
可以处理该错误情况
另外,作为一个学术练习,请看一下使用嵌套列表而不是二维数组。类似于list
。在某些方面,它看起来更详细(re:messy),在其他方面,它会更有用。从这里继续,尝试将整个数据结构封装到自定义对象中(Grid
或Board
似乎是合理的名称)。这将允许您将任何混乱的内容放入类中,然后游戏逻辑可以与该类进行干净的交互
我希望数组的大小是动态的
因此,如果您对泛型集合没有限制,我强烈建议您使用列表。忽略更好的清除用户输入的方法,使用列表的代码可能如下所示。因为我们使用的是面向对象的语言,所以最好创建表示我们需要的对象(单元格、网格等)。然后创建表示这些对象(行、列、值)所需内容的属性或方法
所以我要把你们抛到最深处,但这里是我使用的参考资料
-一篇关于同一事物的所有不同陈述/抽象的非常好的文章
-微软文档
-如何使用Linq方法和Lambda表达式查询列表
-基本上是另一个代表..C#现在有足够的这些了吗
-泛型的力量
在所有这些之后,你可能会问自己,为什么要使用泛型类网格?我怀疑你想要存储在单元格中的唯一东西是int。也许你想要存储一个表示各种事物的完整对象
出于某种原因,您是否仅限于使用数组?其他明智的泛型ICollection类型更易于使用(如a).不,不限于只使用数组。我只是刚接触c#。不,我希望维度相同。至于列表,我会试试。@MichaelAlexander:那你到底想问什么?如果你让行数是动态的,并且你想让列数等于行数,那有什么问题吗?是的。最终目标是得到ob单元格中的对象。我试图做的是编写一些可以随机生成房间的基本代码。(1是房间,0不是)。一旦开始工作,(那时,希望我有一个实际的IDE,而不是Sololearn),我将努力使它们成为对象。
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
Random rand = new Random();
int num;
num = Convert.ToInt32(Console.ReadLine());
Func<int> valueGenerator = () => { return rand.Next(0,2); };
var dungeon = new Grid<int>(num, num, valueGenerator);
foreach(var row in dungeon.Rows)
{
// First() - https://msdn.microsoft.com/en-us/library/bb291976(v=vs.110).aspx
if (row.First().Row == 0)
{
Console.WriteLine("#-#-#-#-#");
}
// ToArray() - https://msdn.microsoft.com/en-us/library/bb298736(v=vs.110).aspx
var rowValues = row.Select(r => r.Value.ToString()).ToArray();
// string.Join() - https://msdn.microsoft.com/en-us/library/57a79xd0(v=vs.110).aspx
var rowDisplay = string.Join("|", rowValues);
// $ ie Interpolated Strings - https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interpolated-strings
Console.WriteLine($"|{rowDisplay}|");
Console.WriteLine("#-#-#-#-#");
}
}
public class Grid<T>
{
private int _numberOfRows;
private int _numberOfColumns;
// List<> - https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx
private List<Cell<T>> _cells;
public Grid(int numberOfRows, int numberOfColumns)
{
if (numberOfRows == 0)
throw new ArgumentOutOfRangeException("numberOfRows must be greater than zero.");
if (numberOfColumns == 0)
throw new ArgumentOutOfRangeException("numberOfColumns must be greater than zero.");
_numberOfRows = numberOfRows;
_numberOfColumns = numberOfColumns;
// Enumerable.Range - https://msdn.microsoft.com/en-us/library/system.linq.enumerable.range(v=vs.110).aspx
_cells = Enumerable.Range(0, _numberOfRows)
// Select - https://msdn.microsoft.com/en-us/library/bb548891(v=vs.110).aspx
.Select(r => Enumerable.Range(0, _numberOfColumns)
.Select(c => new Cell<T>
{
Row = r,
Col = c
})
// ToList() - https://msdn.microsoft.com/en-us/library/bb342261(v=vs.110).aspx
.ToList())
// - https://msdn.microsoft.com/en-us/library/system.linq.enumerable.selectmany(v=vs.110).aspx
.SelectMany(c => c)
.ToList();
}
public Grid(int numberOfRows, int numberOfColumns, Func<T> valueGenerator)
{
if (numberOfRows == 0)
throw new ArgumentOutOfRangeException("numberOfRows must be greater than zero.");
if (numberOfColumns == 0)
throw new ArgumentOutOfRangeException("numberOfColumns must be greater than zero.");
_numberOfRows = numberOfRows;
_numberOfColumns = numberOfColumns;
_cells = Enumerable.Range(0, _numberOfRows)
.Select(r => Enumerable.Range(0, _numberOfColumns)
.Select(c => new Cell<T>
{
Row = r,
Col = c,
Value = valueGenerator()
})
.ToList())
.SelectMany(c => c)
.ToList();
}
public IEnumerable<ICell<T>> Cells
{
get
{
return _cells;
}
}
public IEnumerable<IEnumerable<ICell<T>>> Rows
{
get
{
return _cells.GroupBy(c => c.Row)
.Select(gs => gs.OrderBy(g => g.Col).ToList())
.ToList();
}
}
public IEnumerable<IEnumerable<ICell<T>>> Columns
{
get
{
return _cells.GroupBy(c => c.Col)
.Select(gs => gs.OrderBy(g => g.Row).ToList())
.ToList();
}
}
// We expose the Interface because we don't want anyone outside grid modifying
// Row or Col
public interface ICell<T>
{
int Row { get; }
int Col { get; }
T Value { get; set; }
}
private class Cell<T> : ICell<T>
{
public T Value { get; set; }
public int Row { get; set; }
public int Col { get; set; }
}
}
}
#-#-#-#-#
|0|0|0|1|
#-#-#-#-#
|1|0|0|1|
#-#-#-#-#
|0|0|1|0|
#-#-#-#-#
|0|1|1|0|
#-#-#-#-#