1.什么是二維陣列?
就是陣列中保存的元素都是一維陣列,我們就稱之為二維陣列
2.二維陣列的定義格式
元素型別 陣列名稱[一維陣列的組數][一維陣列中存盤的元素個數]
一維陣列的個數:代表二維陣列中可以存盤元素的個數
3.如何操作二維陣列?
陣列名稱[索引];
取出二維陣列中對應索引的一維陣列
陣列名稱[索引][索引];
需求:要求定義變數保存用戶的年齡
需求:要求定義變數保存一個班級用戶的年齡
需求:要求定義變數保存兩個班級用戶年齡

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int ages[2][4]={
{18,19,24,21},
{17,15,19,20}
};
//取出二維陣列中的每一個一維陣列
for(int i=0;i<2;i++)
{
//2.再從每一個一維陣列中取出一維陣列中的元素
for(int j=0;j<3;j++)
{
printf("ages[%i][%i]=%i\n",i,j,ages[i][j]);
}
}
return 0;
}
二維陣列初始化
1.二維陣列的初始化
1.1定義的同時初始化
1.2先定義再初始化
1.定義的同時初始化
1.1定義的同時完全初始化
int nums[2][3] = {{1,3,5},{2,4,6}};
1.2定義的同時部分初始化
int nums[2][3] = {{1,3,5}};
1.3定義的同時初始化的注意點
如果在定義的同時初始化,那么一維陣列的個數可以省略
int nums[][3] = {{1,3,5},{2,4,6}};
如果在定義的同時初始化,那么一維陣列元素的個數不能省略(不然程式就會報錯!!!!)
int nums[2][] = {{1,3,5},{2,4,6}};
如果在定義的同時初始化,那么一維陣列的{}可以省略
int nums[2][3] = {1,3,5,2,4,6};
二維陣列存盤細節
1二維陣列的存盤細節
和一維陣列一模一樣
1.1分配存盤空間從記憶體地址大的開始分配
1.2陣列名對應的是占用存盤空間最小的地址
1.3給元素分配存盤空間從占用存盤空間記憶體地址小的開始分配

二維陣列和函式

1.基本資料型別和函式
在函式內修改形參,不會影響到外界實參
2.一維陣列和函式
在函式內修改形參,會影響到外界實參
3.二維陣列和函式
在函式內修改形參,會影響到外界實參
總結:
以后要想知道在函式中修改形參會不會影響到外界的實參,是不是看一下傳遞的是不是地址就可以
如果傳遞的是地址,那么在函式內修改形參,會影響到外界的實參


迷宮游戲-地圖列印

對上面進行改進
求出其行數,列數
int row = sizeof(map)/sizeof(map[0]);
int column = sizeof(map[1]);
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
/*
######
#O #
# ## #
# # #
## #
######
*/
char map[6][6]={
{'#','#','#','#','#','#'},
{'#','R',' ','#',' ',' '},
{'#',' ','#','#',' ','#'},
{'#',' ',' ','#',' ','#'},
{'#','#',' ',' ',' ','#'},
{'#','#','#','#','#','#'}
};
int row = sizeof(map)/sizeof(map[0]);
int column = sizeof(map[1]);
//2.遍歷二維陣列,列印地圖
printMap(map,row,column);
return 0;
}
/** \brief printfMap 用于列印地圖
*
* \param map 需要列印的二維陣列
* \param row 二維陣列的行數(也就是有多少個一維陣列)
* \param col 二維陣列的列數(也就是一維陣列有多少個元素)
* \return
*
*/
void printMap(int value[6][6],int row,int col)
{
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
printf("%c",map[i][j]);
}
printf("\n");
}
}
下一步:請輸入w、a、s、d其中一個字符,控制小人走出迷宮
迷宮游戲-獲取行走方向
統一將字母轉化成小寫
ch = ch + ('a'-'A');
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char map[6][6]={
{'#','#','#','#','#','#'},
{'#','R',' ','#',' ',' '},
{'#',' ','#','#',' ','#'},
{'#',' ',' ','#',' ','#'},
{'#','#',' ',' ',' ','#'},
{'#','#','#','#','#','#'}
};
int row = sizeof(map)/sizeof(map[0]);
int column = sizeof(map[1]);
//2.遍歷二維陣列,列印地圖
printMap(map,row,column);
//3.提示用戶輸入資料
char ch = getDirection();
lowerCase(getDirection());
printf("ch=%c\n",ch);
return 0;
}
//在企業開發中,封裝函式一定要遵守單一原則
//一個函式只做一件事情
/** \brief lowerCase 將大寫字母轉換為小寫字母
*
* \param ch 需要轉換的字母
* \return 轉換之后的字母
*
*/
char lowerCase(char ch)
{
//1.判斷是否是大小字母
if(ch >= 'A' && ch <= 'Z')
{
return ch + ('a'-'A');
}
return ch;
}
/** \brief getDirection 獲取行走的方向
*
* \return 獲取到的方向
*
*/
char getDirection()
{
//3.提示用戶輸入資料
printf("請輸入w a s d其中一個字符,控制小人走出迷宮\n");
//4.定義變數保存用戶輸入的資料
char ch;
//5.接收用戶輸入的資料
scanf("%c",&ch);
//統一將字母轉換為小寫
ch=lowerCase(ch);
return ch;
}
/** brief printfMap 用于列印地圖
*
* param map 需要列印的二維陣列
* param row 二維陣列的行數(也就是有多少個一維陣列)
* param col 二維陣列的列數(也就是一維陣列有多少個元素)
*/
void printMap(char value[6][6],int row,int col)
{
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
printf("%c",value[i][j]);
}
printf("\n");
}
}
迷宮游戲-人物行走
4.讓小人動起來
4.1定義一個變數保存小人當前位置
#include <stdio.h>
#include <stdlib.h>
char lowerCase(char ch);
char getDirection();
void move(char ch,char map[6][6]);
void printMap(char value[6][6],int row,int col);
int startRow = 1;
int startCol = 1;
int main(void)
{
char map[6][6]={
{'#','#','#','#','#','#'},
{'#','R',' ','#',' ',' '},
{'#',' ','#','#',' ','#'},
{'#',' ',' ','#',' ','#'},
{'#','#',' ',' ',' ','#'},
{'#','#','#','#','#','#'}
};
int row = sizeof(map)/sizeof(map[0]);
int column = sizeof(map[1]);
//2.遍歷二維陣列,列印地圖
printMap(map,row,column);
//3.提示用戶輸入資料
char ch = getDirection();
lowerCase(ch);
//4.讓小人動起來
//4.1定義一個變數保存小人當前位置
//4.2判斷用戶輸入的反向
move(ch,map);
printMap(map,row,column);
return 0;
}
//在企業開發中,封裝函式一定要遵守單一原則
//一個函式只做一件事情
void move(char ch,char map[6][6])
{
switch(ch)
{
case 'w':printf("向上走\n");
if(map[startRow-1][startCol] != '#')
{
//清空當前的位置
map[startRow][startCol] = ' ';
//讓上一行變成小人
map[startRow-1][startCol]='R';
//修改小人當前的位置變成為行走之后的位置
startRow=startRow-1;
}
break;
case 's':printf("向下走\n");
if(map[startRow+1][startCol] != '#')
{
//清空當前的位置
map[startRow][startCol] = ' ';
//讓上一行變成小人
map[startRow+1][startCol]='R';
//修改小人當前的位置變成為行走之后的位置
startRow=startRow+1;
}
break;
case 'a':printf("向左走\n");
if(map[startRow][startCol-1] != '#')
{
//清空當前的位置
map[startRow][startCol] = ' ';
//讓前一列變成小人
map[startRow][startCol-1]='R';
//修改小人當前的位置變成為行走之后的位置
startCol=startCol-1;
}
break;
case 'd':printf("向右走\n");
if(map[startRow][startCol+1] != '#')
{
//清空當前的位置
map[startRow][startCol] = ' ';
//讓一行變成小人
map[startRow][startCol+1]='R';
//修改小人當前的位置變成為行走之后的位置
startCol=startCol+1;
}
break;
default: printf("沒有這個方向\n"); break;
}
}
char lowerCase(char ch)
{
//1.判斷是否是大小字母
if(ch >= 'A' && ch <= 'Z')
{
return ch += ('a'-'A');
}
}
char getDirection()
{
//3.提示用戶輸入資料
printf("請輸入w a s d其中一個字符,控制小人走出迷宮\n");
//4.定義變數保存用戶輸入的資料
char ch;
//5.接收用戶輸入的資料
scanf("%c",&ch);
//統一將字母轉換為小寫
ch=lowerCase(ch);
return ch;
}
void printMap(char value[6][6],int row,int col)
{
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
printf("%c",value[i][j]);
}
printf("\n");
}
}
迷宮游戲-連續行走
#include <stdio.h>
#include <stdlib.h>
char lowerCase(char ch);
char getDirection();
void move(char ch,char map[6][6]);
void printMap(char value[6][6],int row,int col);
int startRow = 1;
int startCol = 1;
int endRow = 1;
int endCol = 5;
int main(void)
{
char map[6][6]={
{'#','#','#','#','#','#'},
{'#','R',' ','#',' ',' '},
{'#',' ','#','#',' ','#'},
{'#',' ',' ','#',' ','#'},
{'#','#',' ',' ',' ','#'},
{'#','#','#','#','#','#'}
};
int row = sizeof(map)/sizeof(map[0]);
int column = sizeof(map[1]);
//2.遍歷二維陣列,列印地圖
printMap(map,row,column);
//3.提示用戶輸入資料
do{
char ch = getDirection();
//4.讓小人動起來
//4.1定義一個變數保存小人當前位置
//4.2判斷用戶輸入的反向
move(ch,map);
printMap(map,row,column);
if(startCol==endCol&&startRow == endRow)
{
break;
}
}while(1);
printf("游戲結束\n");
return 0;
}
//在企業開發中,封裝函式一定要遵守單一原則
//一個函式只做一件事情
void move(char ch,char map[6][6])
{
switch(ch)
{
case 'w':printf("向上走\n");
if(map[startRow-1][startCol] != '#')
{
//清空當前的位置
map[startRow][startCol] = ' ';
//讓上一行變成小人
map[startRow-1][startCol]='R';
//修改小人當前的位置變成為行走之后的位置
startRow=startRow-1;
}
break;
case 's':printf("向下走\n");
if(map[startRow+1][startCol] != '#')
{
//清空當前的位置
map[startRow][startCol] = ' ';
//讓上一行變成小人
map[startRow+1][startCol]='R';
//修改小人當前的位置變成為行走之后的位置
startRow=startRow+1;
}
break;
case 'a':printf("向左走\n");
if(map[startRow][startCol-1] != '#')
{
//清空當前的位置
map[startRow][startCol] = ' ';
//讓前一列變成小人
map[startRow][startCol-1]='R';
//修改小人當前的位置變成為行走之后的位置
startCol=startCol-1;
}
break;
case 'd':printf("向右走\n");
if(map[startRow][startCol+1] != '#')
{
//清空當前的位置
map[startRow][startCol] = ' ';
//讓一行變成小人
map[startRow][startCol+1]='R';
//修改小人當前的位置變成為行走之后的位置
startCol=startCol+1;
}
break;
default: printf("沒有這個方向\n"); break;
}
}
char lowerCase(char ch)
{
//1.判斷是否是大小字母
if(ch >= 'A' && ch <= 'Z')
{
return ch += ('a'-'A');
}
}
char getDirection()
{
//3.提示用戶輸入資料
printf("請輸入w a s d其中一個字符,控制小人走出迷宮\n");
//4.定義變數保存用戶輸入的資料
char ch;
//5.接收用戶輸入的資料
scanf("%c",&ch);
//清空輸入緩沖區
setbuf(stdin,NULL);
//統一將字母轉換為小寫
ch=lowerCase(ch);
return ch;
}
void printMap(char value[6][6],int row,int col)
{
//清空螢屏
system("cls");
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
printf("%c",value[i][j]);
}
printf("\n");
}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/325848.html
標籤:其他
上一篇:Unity-瓦片地圖詳解
