이차원 배열
char char2_[5][5] = //행[5], 열[5]
{
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
};
이건 char형 2차원 배열이다.
' '를 붙여줘야 하는것으로 생각된다.
Ex) char char3 = '1';
그냥 위 배열 그대로 출력했더니 역시나 아무것도 안나오는 모습.
아래 코드에서는 뒤쪽에서 *문자를 대입을 해주므로 문제없이 출력이 된다.
#include <iostream>
using namespace std;
void Desc002();
void swap(int*a,int*b);
int main()
{
Desc002();
}
//다차원 배열
void Desc002()
{
char char2_[5][5] = //행[5], 열[5]
{
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
};
char userInput = '0';
char* ptr = &char2_[2][2];
while(1)
{
for(int y = 0; y < 5; y++)
{
for (int x = 0; x < 5; x++)
{
char2_[y][x] = '*';
}
}
if(userInput == 'w'||userInput == 'W')
{
*(ptr-5) = '0';
ptr = (ptr-5);
}
else if(userInput == 's'||userInput == 'S')
{
*(ptr+5) = '0';
ptr = (ptr+5);
}
else if(userInput == 'a'||userInput == 'A')
{
*(ptr-1) = '0';
ptr = (ptr-1);
}
else if(userInput == 'd'||userInput == 'D')
{
*(ptr+1) = '0';
ptr = (ptr+1);
}
else
{
*ptr = '0';
ptr = ptr;
}
userInput = '0';
// //출력부분
// for(int i = 0; i < 25; i++)
// {
// printf("%c ", char_[i]);
// if(i%5 == 4)
// {
// printf("\n");
// }
// }
for(int y = 0; y < 5; y++)
{
for (int x = 0; x < 5; x++)
{
printf("%c ", char2_[y][x]);
}
printf("\n");
}
printf("\n");
cin >> userInput;
}
}
void swap(int*a,int*b)
{
int temp = 0;
temp = *a;
*a = *b;
*b = temp;
}
이차원 배열을 매개변수로 받아서 함수 쓰는 방법
예제로 게임을 만들다보면 문자열을 배열에 넣어놓고,
함수에서 사용하고 싶을 때가 있었는데 그때마다 이차원배열을 어떻게 가져와야 되는지 몰라서 못썻다.
이제는 쓸수있다.
char char2[2][5] 의 뜻은 쉽게 말해서 5바이트의 문자열 2개를 저장할 수 있는 변수 char2라는 의미이다.
앞의 [2]는 배열의 갯수를 말하며, [5]는 배열의 사이즈를 말한다.
int형 이차원 배열의 경우라면 [5]는 4바이트 5개 즉 20바이트를 의미한다.
>>> 이거는 메모리 관련해서 좀 더 공부하여 정리해보겠다.
하던 얘기를 계속해보면
char char2[2][5] = {"hi","hell"}; // 여기서 hello는 못쓴다. 문자열 끝에 \0(NULL) 문자가 들어가야 문자가 끝난것으로 인지하기 때문
따라서 매개변수에서 위 내용을 받아와서 쓰고싶다면
void 변수이름 (*ptr[0])
{
내용
}
이런식으로 첫번째 배열의 주소만 체크해주면 된다.
여기서 가장 앞쪽 주소들만 call해주면 된다.
즉 *(ptr+5)가 될것이다.
%s로 읽게 될 경우 \0을 컴파일러가 체크할때까지 문자열을 읽으므로
문자열이 출력되게 된다.
숫자퍼즐 예제
다음은 숫자퍼즐을 만들어보았다.
이런 게임이다.
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
// 게임함수
void Desc002(int* ptr,int gameLevel);
// 스왑 함수
void swap(int*a,int*b);
int main()
{
int gameLevel;
srand(time(NULL));
// 유저 입력 gameLevel
printf("원하시는 게임 난이도를 입력해 주세요(3~6)\n");
scanf("%d",&gameLevel);
system("clear");
//gameLevel에 따른 2차원 배열 설정
//배열의 경우 미리 설정해놓지 않으면 크기 설정이 다시되지 않기 때문에
//레벨별로 지역변수설정해주었습니다.
if(gameLevel == 3)
{
int number[3][3] = {0,};
int* ptr = &number[0][0];
//이차원배열 number[0][0] 값과 게임 레벨 함수에 입력
Desc002(ptr,gameLevel);
}
else if(gameLevel == 4)
{
int number[4][4] = {0,};
int* ptr = &number[0][0];
Desc002(ptr,gameLevel);
}
else if(gameLevel == 5)
{
int number[5][5] = {0,};
int* ptr = &number[0][0];
Desc002(ptr,gameLevel);
}
else if(gameLevel == 6)
{
int number[6][6] = {0,};
int* ptr = &number[0][0];
Desc002(ptr,gameLevel);
}
else
{
printf("잘못입력했습니다. 게임을 다시 시작하세요.\n");
}
//gameLevel에 따른 2차원 배열 설정
}
void Desc002(int* ptr,int gameLevel)
{
//매개변수로 받아오 주소값(number[0][0]) 다른 포인터에 저장
int* ptr2 = ptr;
//유저 인풋값 선언 및 초기화(w,a,s,d)
char userInput = '0';
//random에 필요한 변수 선언
int random1 = 0,random2 =0, r=0;
//포인터 위치를 잡아주기 위한 변수 선언(배열 크기 선언)
int gameLevelSize = gameLevel*gameLevel;
// 정답 비교를 위한 배열 선언
int answer3[9] = {0,};
int answer4[16] = {0,};
int answer5[25] = {0,};
int answer6[36] = {0,};
// 정답 비교를 위한 배열 선언
// 게임 클리어를 위한 변수
int gameClear = 0;
// 게임 클리어를 위한 변수
// answer에 숫자 배열 입력해주는 구간
if(gameLevel == 3)
{
for(int n = 0; n < gameLevelSize; n++)
{
if(n == gameLevelSize-1)
{
answer3[n] = 0;
}
else
{
answer3[n] = n+1;
}
}
}
else if(gameLevel == 4)
{
for(int n = 0; n < gameLevelSize; n++)
{
if(n == gameLevelSize-1)
{
answer4[n] = 0;
}
else
{
answer4[n] = n+1;
}
}
}
else if(gameLevel == 5)
{
for(int n = 0; n < gameLevelSize; n++)
{
if(n == gameLevelSize-1)
{
answer5[n] = 0;
}
else
{
answer5[n] = n+1;
}
}
}
else if(gameLevel == 6)
{
for(int n = 0; n < gameLevelSize; n++)
{
if(n == gameLevelSize-1)
{
answer6[n] = 0;
}
else
{
answer6[n] = n+1;
}
}
}
// answer에 숫자 배열 입력해주는 구간
// main함수 내의 number[][]배열에 숫자를 넣어주는 구간
for(int n = 0; n < gameLevelSize; n++)
{
if(n == gameLevelSize-1)
{
*(ptr+n) = 0;
}
else
{
*(ptr+n) = n+1;
}
}
// main함수 내의 number[][]배열에 숫자를 넣어주는 구간
// 랜덤으로 섞어주는 구간
while(r < 300)
{
random1 = rand()%gameLevelSize;
random2 = rand()%gameLevelSize;
if(random1==random2){
continue;
}
r++;
swap(ptr+random1,ptr+random2);
}
// 랜덤으로 섞어주는 구간
// 포인터를 값 0과 일치시켜 주는 for문
for(int n = 0; n < gameLevelSize; n++)
{
if(*(ptr+n) == 0)
{
ptr = (ptr+n);
}
}
// 포인터를 값 0과 일치시켜 주는 for문
//gameClear점수가 게임 사이즈(배열 사이즈)보다 커지면 게임 종료
while(gameClear < gameLevelSize)
{
//사용자 wasd입력시 0을 상하좌우로 움직여주는 구간
if(userInput == 'w'||userInput == 'W')
{
swap(ptr-gameLevel,ptr);
ptr = (ptr-gameLevel);
}
else if(userInput == 's'||userInput == 'S')
{
swap(ptr+gameLevel,ptr);
ptr = (ptr+gameLevel);
}
else if(userInput == 'a'||userInput == 'A')
{
swap(ptr-1,ptr);
ptr = (ptr-1);
}
else if(userInput == 'd'||userInput == 'D')
{
swap(ptr+1,ptr);
ptr = (ptr+1);
}
else
{
ptr = ptr;
}
//사용자 wasd입력시 0을 상하좌우로 움직여주는 구간
//유저 입력값 초기화
userInput = '0';
//출력장치
for(int n = 0; n < gameLevelSize; n++)
{
printf("%2d ",*(ptr2+n));
if((n+1)%gameLevel == 0)
{
printf("\n");
}
}
printf("\n");
//정답 비교구간 배열 사이즈 전체 비교
for(int n = 0; n < gameLevelSize; n++)
{
//게임 레벨에 따라 answer값이 다름에 따라 if else문 사용
if(gameLevel == 3)
{
if(*(ptr2+n)==answer3[n])
{
gameClear++;
}
}
else if(gameLevel == 4)
{
if(*(ptr2+n)==answer4[n])
{
gameClear++;
}
}
else if(gameLevel == 5)
{
if(*(ptr2+n)==answer5[n])
{
gameClear++;
}
}
else if(gameLevel == 6)
{
if(*(ptr2+n)==answer6[n])
{
gameClear++;
}
}
//게임 레벨에 따라 answer값이 다름에 따라 if else문 사용
}
//정답 비교구간 배열 사이즈 전체 비교
//gameClear점수 초기화
if(gameClear < gameLevelSize)
{
gameClear = 0;
}
//gameClear점수 초기화
//유저 wasd값 입력
cin >> userInput;
//화면 클리어
system("clear");
}//while 게임종료
system("clear");
printf("축하합니다. 게임을 클리어 하셨습니다.\n");
}
void swap(int*a,int*b)
{
int temp = 0;
temp = *a;
*a = *b;
*b = temp;
}
'프로그래밍 > C,C++' 카테고리의 다른 글
C++ 11, stoi, stof, stol, sod 문자열을 숫자로 바꾸는 함수 (0) | 2023.07.18 |
---|---|
#include <cmath> 공부, 코딩테스트 (0) | 2023.07.18 |
[C/C++] 매개변수로 배열을 받을때는 사이즈도 함께 받자. (0) | 2023.06.11 |
[C,C++] 기본 3가지 정렬(선택정렬, 버블정렬, 삽입정렬) (0) | 2023.06.11 |
[C/C++] 문자열 할당 및 출력하기 예제 (0) | 2023.06.07 |