书接上回,我们已经介绍完了一维数组的使用,大抵了解的数组的基础功能和使用方法,现在我们就进入多维数组的讲解。
而多维数组中,最常用的有二维数组,我们就以此为例子展开多维数组的讲解。
因为其实很多概念我们在一维数组中已经有所解析,所以二维数组我们会讲的稍微快一些。
一维数组是一个下标确定元素。
那同理可得,二维数组就是两个下标确定元素,这两个下标我们习惯叫作行标和列标。
申明方式其实和一维数组颇有异曲同工之妙。
我们这里就用例子简单给大家看看有哪几种。
int[ , ] arr;//这种申明在后面一定要初始化
int[ , ] arr2=new int[3,3];//申明了一个三行三列的二维数组
int[ , ] arr3=new int[3,3]{{1,2,3}
{4,5,6}
{7,8,9}};//申明了一个三行三列的二维数组并填充了元素
int[ , ] arr4=new int[,]{{1,2,3}
{4,5,6}
{7,8,9}};//申明了一个二维数组并填充了元素
int[ , ] arr4={{1,2,3}
{4,5,6}
{7,8,9}};//最简单的申明
其实我们发现,二维数组只是多了一种对应关系,其实和一维数组的区别并不大。
我们这里再系统地讲解一下。
一维数组是一个线性结构,它包含一系列相同类型的元素,这些元素按照一定的顺序排列。一维数组只有一个维度,可以通过一个索引来访问数组中的元素。例如,int[] numbers = new int[5]; 定义了一个长度为5的一维数组,可以通过numbers[0]、numbers[1]等索引来访问数组中的元素。
二维数组是一个表格结构,它包含一系列相同类型的元素,这些元素按照行和列的方式排列。二维数组有两个维度,可以通过行和列的索引来访问数组中的元素。例如,int[,] matrix = new int[3, 4]; 定义了一个3行4列的二维数组,可以通过matrix[0, 0]、matrix[1, 2]等索引来访问数组中的元素。
Console.Writeline(arr.GetLength(0));//行
Console.Writeline(arr.GetLength(1));//列
和一维数组获取方法类似arr[索引,索引]
注意:第一个索引都是0
直接赋值
以下是用C#实现二维数组的遍历,我们需要两个for循环来实现它。
using System;
class Program
{
static void Main(string[] args)
{
int[,] array = new int[,]
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
int rows = array.GetLength(0);
int cols = array.GetLength(1);
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
Console.Write(array[i, j] + " ");
}
Console.WriteLine();
}
}
}
运行此代码,将会输出以下结果:
1 2 3
4 5 6
7 8 9
道理其实和一维数组一样,c#中数组生命果初始化过后,就不能再在原有基础上删改。
可能有些朋友在其他语言中可以进行删改,那是因为其他语言可能整合了可变数组和数组两个类型的数据。
其实这种举一反三的代码,都应该你们自己去实验,但是博主这里还是给你敲了出来。
也希望在学习C#的你能够一点一点地跟着去敲或者去试试。
using System;
class Program
{
static void Main(string[] args)
{
int[,] arr1 = new int[,]
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
int[,] arr2 = new int[4, 4];
int rows = arr1.GetLength(0);
int cols = arr1.GetLength(1);
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
arr2[i, j] = arr1[i, j];
}
}
arr1 = arr2;
for (int i = 0; i < arr1.GetLength(0); i++)
{
for (int j = 0; j < arr1.GetLength(1); j++)
{
Console.Write(arr1[i, j] + " ");
}
Console.WriteLine();
}
}
}
下面是一个用C#的二维数组实现二维地图,并实现玩家在地图上的移动的小代码
using System;
class Program
{
static void Main()
{
// 定义地图大小
int width = 10;
int height = 10;
// 创建地图
char[,] map = new char[width, height];
// 初始化地图,用 '·' 表示空地
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
map[i, j] = '·';
}
}
// 设置玩家初始位置
int playerX = 0;
int playerY = 0;
map[playerX, playerY] = 'P';
// 游戏主循环
bool gameover = false;
while (!gameover)
{
// 渲染地图
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
Console.Write(map[i, j] + " ");
}
Console.WriteLine();
}
// 获取玩家输入
ConsoleKeyInfo key = Console.ReadKey();
Console.WriteLine();
// 根据玩家输入移动玩家位置
switch (key.Key)
{
case ConsoleKey.LeftArrow:
if (playerY > 0)
{
map[playerX, playerY] = '·'; // 将当前位置标记为空地
playerY--;
map[playerX, playerY] = 'P'; // 将新位置标记为玩家位置
}
break;
case ConsoleKey.RightArrow:
if (playerY < width - 1)
{
map[playerX, playerY] = '·';
playerY++;
map[playerX, playerY] = 'P';
}
break;
case ConsoleKey.UpArrow:
if (playerX > 0)
{
map[playerX, playerY] = '·';
playerX--;
map[playerX, playerY] = 'P';
}
break;
case ConsoleKey.DownArrow:
if (playerX < height - 1)
{
map[playerX, playerY] = '·';
playerX++;
map[playerX, playerY] = 'P';
}
break;
case ConsoleKey.Escape:
gameover = true;
break;
}
Console.Clear();
}
}
}
上述代码中,我们首先定义了地图的宽度和高度,并创建了一个相应大小的二维字符数组来表示地图。然后,我们使用双重循环初始化地图中的每个位置为 '·'。接下来,我们设置了玩家的初始位置,并将其标记为 'P'。
然后,我们进入游戏主循环(目前是死循环),循环中先渲染地图,然后获取玩家的输入。根据玩家的输入,我们更新玩家的位置,并在地图上进行相应变更。玩家可以通过方向键来移动,并按下 ESC 键来退出游戏。
然后我们要在每一次画图后都要清除,不然的话,会发现打印台一直在不停打印。
如果你跟着一步一步敲下来,你肯定也会发现,其实游戏框架的搭建也很简单,在后续我们的unity中,也会有2D游戏设计,他的地图不过是二维的单位格子,属性更多而已。
你如果想要在这个代码中加入一些新的元素,也可以组成一个游戏。
我们是否可以创建一个怪物去追逐玩家?是否可以添加障碍物元素?我们玩家能不能有什么道具?
我们的地图可不可以随机生成?
其实当你开始往这个方向思考,你就能慢慢体会到做游戏的乐趣了。
我们这节博文中,不仅学习了二维数组的使用,还借此实现了一个小地图和玩家的基本移动功能,我们初步见识到自己目前学到的东西可以做一个简单的小游戏框架了。
相信你如果继续坚持,以后一定能做出更炫酷,更厉害的游戏。
不过,我们的学习之路还很长,复杂的难点还等着你去攻克。
还是那句话,学习要脚踏实地,一步一个脚印。
共勉!
请期待我的下一篇博客!