안녕하세요 틴구입니다
오늘은 배열에 대해서 알아보고 배열과 반복문을 이용해 다양한 게임을 만들고 분석해보는 시간을 가져볼게요.
요즘 들어 드는 생각인데 반복문부터 점점 어려워지는 거 같아요 진짜로
반복문의 조건식 쓰는거부터해서 헷갈리는 거 같아서 많이 보고 써봐야 할 거 같아요.
완성된 코드를 보고 분석하는건 어느 정도 하겠는데 코드를 보지 않고 게임을 만들 때가 진짜 어려운 거 같아요.
그래도 한 번 만들고 두 번째 만들어보면 어느정도 이해 가고 쉬워지는 게 느껴져서 좋은 거 같아요!!
그럼 바로 배열에 대해서 알아볼게요
배열
배열이란 같은 타입의 변수 여러개를 하나의 이름으로 생성해줄때 사용하는 문법입니다.
같은 타입의 변수 몇십, 몇백개를 생성하고 초기화시켜주기 힘들기에 배열을 사용합니다.
예를 들어 int타입 변수 100개짜리 배열이 만들어진다면 메모리에 400바이트만큼의 공간을 연결되게 할당을 해줍니다
배열의 형태는 : 변수타입 배열명[개수]; 로 선언이 됩니다.
ex) int NumArray[1000];
이런 식으로 사용할 수 있습니다.
배열의 각 요소에 접근을 하기 위해서 인덱스를 사용하게 됩니다.
인덱스는 0번부터 시작하여 개수 - 1 까지 인덱스가 존재합니다.
만약 허용되는 인덱스의 범위를 벗어나게 된다면 에러가 발생한다.
1000개짜리인데 0 ~ 999 까지는 인덱스가 존재하지만 1000번 이상을 접근하게 될 경우
허용되지 않은 메모리에 접근하게 되므로 문제가 발생하는 것입니다.
배열을 선언과 동시에 초기화를 해줄 때 배열 선언 뒤에 = {} 를 해주고 중괄호 안에 원하는 값을
넣어주면 차례대로 0번 인덱스부터 값이 부여되게 됩니다.
단, 모든 요소에 대해 넣어주지 않으면 넣어준 인덱스들은 해당 값으로 할당이 되고
나머지 요소들은 모두 0으로 초기화됩니다.
= {}; 을 해서 아무것도 없을 경우 전체가 0으로 초기화가 됩니다.
ex) int NumArray[100] = {};
이런 식으로 인덱스 값들을 모두 0으로 초기화할 수 있다.
ex) int NumArray1[10] = {1, 2, 3, 4, 5};
이런 식으로 사용하게 되면 0번 인덱스부터 4번 인덱스까지 순서대로 1, 2, 3, 4, 5의 값을 갖게 되고
나머지는 0으로 초기화가 되는 개념입니다.
// 배열의 개수를 10으로 설정을 하면 인덱스가 0 ~ 9까지 생성이 되는데
// 여기서 인덱스 초기화를 1, 2, 3, 4, 5를 하게 되면
// 0번의 인덱스부터 4번 인덱스까지 순서대로 1, 2, 3, 4, 5의 값이 들어가게 되는 것이다.
int NumArray1[10] = {1, 2, 3, 4, 5};
for (int i = 0; i < 10; ++i)
{
std::cout << NumberArray1[i] << ", "
}
을 출력하게 되면 1, 2 ,3 ,4 ,5 0, 0, 0, 0, 0 가 출력되게 됩니다.
또 배열을 선언할 때 배열의 개수는 변수로 지정이 불가능합니다.(동적배열선언시 가능)
개수는 숫자로만 선언이 가능합니다.
인덱스 접근은 변수로도 가능합니다.
배열을 선언할때 배열의 개수는 변수로 지정이 불가능하다는 말이
int Number = 100;
int NumberArray[Number] = {};
이런 식으로 사용이 불가능하다는 것입니다.
다만 상수를 사용하면 가능합니다
const int Number = 100;
int NumberArray[Number] = {};
다차원배열
다차원배열은 여러 차원에 걸쳐 배열의 개수를 지정하고 사용이 가능한 배열입니다.
int Number[2][10] 이렇게 다차원 배열을 선언하게 되면 배열의 총개수는 2 * 10이 되어 20개가 됩니다
int Number[2][10][10]을 하게되면 2 * 10 * 10이 되어 200개가 된다.
int Number[2][10] = {};
for (int i = 0; i < 2; ++i)
{
for (int j = 0; i < 10; ++j)
{
Number[i][j] = i * 2 * j
}
}
위의 식은
int NumberArray[20] = {};
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 10; ++j)
{
NumberArray[i * 10 + j] = i * 10 + j;
}
}
의 식과 똑같고
for (int i = 0; i < 20; ++i)
{
std::cout << NumberArray[i] << "\t";
}
을 출력해보면
0 1 2 3 4 ~ 16 17 18 19 가 출력되게 된다.
또 배열을 이용해서 난수를 만들 수도 있는데 한번 만들어볼게요
우선 1 ~ 25까지 숫자를 랜덤으로 섞고 출력하는 과정을 보여드릴게요
#include <iostream>
#include <time.h>
int main()
{
// 난수를 만들기 위한 코드
srand((unsigned int)time(0));
// 처음은 난수 오류가 있어서 버리기 용도
rand();
// 25개의 숫자를 만들기 위한 배열 생성 및 초기화
int Number[25] = {};
// 인덱스가 0 ~ 24까지여서 +1을 해주어 1 ~ 25의 숫자를 만들기 위함
for (int i = 0; i < 25; ++i)
{
Number[i] = i + 1;
}
// 숫자가 잘 섞이기 위해 100의 반복문을 돌림
for (int i = 0; i < 100; ++i)
{
// 인덱스의 값에 들어갈 변수 설정 0 ~ 24의 값
int Index1 = rand() % 25;
int Index2 = rand() % 25;
// 임시로 Temp변수를 만들어 섞어주기 위함
int Temp = Number[Index1];
Number[Index1] = Number[Index2];
Number[Index2] = Temp;
}
// 각 값들을 출력하기 위한 코드 구성
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 5; ++j)
{
// 세로줄번호 * 가로개수 + 가로줄번호
// i(세로줄번호)가 0일 때 * 5(가로개수) + 가로줄번호를 하면 0 ~ 4가 출력이 되고
// 2중포문을 벗어나고 endl;후 다시 i값 증감되어 1 * 5 + 5를 하면 10 ~ 14의 값이 출력되고 반복된다.
std::cout << Number[i * 5 + j] << "\t";
}
std::cout << std::endl;
}
return 0;
}
이것을 이용하여 과제를 풀어볼게요
선생님께서 과제를 내주셨는데 과제가 뭐냐
210714 숙제
빙고 만들어오기
1 ~ 25까지의 숫자를 골고루 섞어서
5 x 5로 출력되게 해온다.
예)
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
이렇게 출력하되 숫자는 섞어준다.
플레이어는 숫자 1개를 입력한다.
입력하면 해당 숫자는 *로 출력이 되게 만들어보자.
예를 들어 14를 입력했다면
1 2 3 4 5
6 7 8 9 10
11 12 13 * 15
16 17 18 19 20
21 22 23 24 25
의 과제입니다 한번 배열을 이용해 풀어볼까요
#include <iostream>
#include <time.h>
int main()
{
srand((unsigned int)time(0));
rand();
int Number[25] = {};
// 숫자를 1 ~ 25까지 만들기 위한 코드
for (int i = 0; i < 25; ++i)
{
Number[i] = i + 1;
}
// 값을 섞어주기 위한 구성
for (int i = 0; i < 100; ++i)
{
int Index1 = rand() % 25;
int Index2 = rand() % 25;
int Temp = Number[Index1];
Number[Index1] = Number[Index2];
Number[Index2] = Temp;
}
// while문을 통해 계속해서 출력하기
while (true)
{
system("cls");
// 별을 입력하기 위한 변수
int Star = 0;
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 5; ++j)
{ // 플레이어가 입력한 숫자가 빙고판 숫자랑 같으면 *로 출력이 된다
if (Number[i * 5 + j] == Star)
{
std::cout << "*\t";
}
// 다르면 원래 빙고판대로 출력이 된다.
else
{
std::cout << Number[i * 5 + j] << "\t";
}
}
// 5번 실행 후 다음 줄로 가기 위한 endl
std::cout << std::endl;
}
std::cout << "선택할 숫자를 입력하세요." << std::endl;
std::cout << "나가기 버튼 = 0" << std::endl;
// 플레이어가 숫자를 선택할 수 있게끔 Input변수
int Input = 0;
std::cin >> Input;
// 0을 입력 시 나가기 빙고판이 25까지 있으니 26 이상의 숫자를 입력하면 처음으로 돌아간다.
if (Input == 0)
{
std::cout << "빙고게임을 종료합니다." << std::endl;
break;
}
else if (Input > 25)
continue;
// 플레이어 입력한 숫자랑 빙고판 숫자랑 겹칠 때 *을 입력하기 위한 과정
for (int i = 0; i < 25; ++i)
{
if (Input == Number[i])
{
Number[i] = Star;
}
}
}
return 0;
}
이렇게 코드를 진행해봤습니다!!
코드를 짜게 되면 뭔가 뿌듯하고 점점 성장? 하는 게 느껴져서 좋은 거 같아요 물론 더럽게 어렵지만요
위에 코드 짜는데 엄청 틀리면서 3시간은 걸린 거 같아요!! 그래도 과제를 풀었다는 거에 만족합니다!!
오늘은 여기까지 해볼게요 다음에 봬요!!
'c++' 카테고리의 다른 글
20210716 구조체 ~ 포인터1 (0) | 2021.07.17 |
---|---|
20210715 빙고 완전체 코드 분석! (0) | 2021.07.15 |
20210713 과제 풀이 ~ 난수 (0) | 2021.07.13 |
20210712 반복문 for, while, do while (0) | 2021.07.13 |
20210709 연산자 축약형 ~ 조건문 feat enum문 (0) | 2021.07.10 |
댓글