C#基础(4)二维数组

2024-09-04 17:44

本文主要是介绍C#基础(4)二维数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

书接上回,我们已经介绍完了一维数组的使用,大抵了解的数组的基础功能和使用方法,现在我们就进入多维数组的讲解。

而多维数组中,最常用的有二维数组,我们就以此为例子展开多维数组的讲解。

因为其实很多概念我们在一维数组中已经有所解析,所以二维数组我们会讲的稍微快一些。

基本概念

一维数组是一个下标确定元素。

那同理可得,二维数组就是两个下标确定元素,这两个下标我们习惯叫作行标和列标。

申明

申明方式其实和一维数组颇有异曲同工之妙。

我们这里就用例子简单给大家看看有哪几种。

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游戏设计,他的地图不过是二维的单位格子,属性更多而已。

你如果想要在这个代码中加入一些新的元素,也可以组成一个游戏。

我们是否可以创建一个怪物去追逐玩家?是否可以添加障碍物元素?我们玩家能不能有什么道具?

我们的地图可不可以随机生成?

其实当你开始往这个方向思考,你就能慢慢体会到做游戏的乐趣了。

总结

我们这节博文中,不仅学习了二维数组的使用,还借此实现了一个小地图和玩家的基本移动功能,我们初步见识到自己目前学到的东西可以做一个简单的小游戏框架了。

相信你如果继续坚持,以后一定能做出更炫酷,更厉害的游戏。

不过,我们的学习之路还很长,复杂的难点还等着你去攻克。

还是那句话,学习要脚踏实地,一步一个脚印。

共勉!

请期待我的下一篇博客!

这篇关于C#基础(4)二维数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136597

相关文章

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能