게임프로그래밍(C++)

[게임프로그래밍] 수행 대비

susot 2025. 4. 13. 23:19

게임프로그래밍 수행을 대비하기 위해 공부해야될 내용들을 정리해두자

 

* &
* : 포인터를 쓸때도 쓰고, 포인터를 통해서 역참조할때도 쓴다.
& : 참조를 선언할 때 쓰고, 주소를 넘겨줄 때도 쓴다.

 

rand()

rand()를 쓰기위해서는 srand((unsigned int)time(NULL)); 꼭 쓰기

 

랜덤숫자 가공하기

만약 랜덤에서 숫자를 가공해서 쓰고싶다면?

예를 들어 1~6 사이에 숫자를 뽑고싶다면 rand() % 6 + 1을 할것 +1이 없으면 0~5 사이 값이 나오고 +2를 한다면 

2 ~ 7 사이에 값이 나옵니다.

 

함수전방선언

C++을 위에서 아래로 읽기 때문에 main아래있는 함수는 못읽습니다.

따라서 void Test(); 처럼 쓸 함수를 미리 main함수 위에 전방선언 해둬야합니다.

 

함수에 배열을 넘겨주려면 void Test(int _arr[])처럼 쓰면 됩니다.

 

셔플 알고리즘

배열의 중복값 없이 섞기 위해서 사용하는 알고리즘

 

void Init(int _arr[], int _gamecnt)
{
	srand((unsigned int)time(NULL)); // 처음 랜덤함수에 타임값을 넣어줌
	for (int i = 0; i < 9; i++)
	{
		_arr[i] = i + 1;
	}
	// for문으로 _arr에다가 1~9값을 넣어줌

	int idx1, idx2, temp;
	for (int i = 0; i < 100; i++)
	{
		idx1 = rand() % 9;
		idx2 = rand() % 9;

		temp = _arr[idx1];
		_arr[idx1] = _arr[idx2];
		_arr[idx2] = temp;
	}
	// 셔플 알고리즘 : 배열값을 100번 랜덤으로 섞어줌(중복값 방지)
	cout << _gamecnt << "회" << endl;
}

 

지금처럼 배열에다가 1~9까지 값을 넣은뒤에

for문을 100번정도 반복하는데 이때 인덱스값 두개를 랜덤하게 뽑고 두 배열값을 서로 바꿔주면 중복되지 않습니다.

100번정도 반복된 후에 순서대로 3개의 값이 필요하면 0,1,2번 인덱스값만 사용하면 됩니다.

 

입력 예외처리

만약 int값만 입력을 받아야하는데 int외에 값이 들어온다면 프로그래밍이 고장납니다.

이를 방지하기 위해서 cin.ignore를 써야합니다.

if (cin.fail()) // int외에 값이 입력되면 실행
{
	cout << "잘못된 입력" << endl;
	cin.clear();
	cin.ignore(1024, '\n');
	continue;
}

 

cin.fail()은 만약 int외에 값이 들어오면 실행됩니다.

if문 안에 들어가지면 cin.clear 해준뒤에 cin.ignore(1024, '\n')로 잘못 입력된 값들을 지워줘야 합니다.

 

콘솔창 제어하기

system("cls")는 콘솔창을 싹다 지우는 함수입니다.

system("pause")는 콘솔창을 프로그램이 끝나면 아무키나 누르세요. 뜨는거 해주는 함수입니다.

 

윈도우창 제어하기

윈도우창 제어를 위해서는 #include <Windows.h>를 사용해야 합니다.

Sleep()함수는 매개변수로 입력된 값만큼 윈도우창을 잠시 멈춰주는데, 밀리세컨트 단위입니다. 1000 = 1초

 

enum class

enum class는 enum을 쓸때 오류를 좀더 쉽게 잡을 수 있게 만들어진 모던 C++기능입니다.

enum class MODE
{
    EASY = 1, NORMAL, HARD
};

 

다음처럼 enum과 비슷하게 쓰지만

 

사용하기 위해서는 MODE::EASY로 써야하고 int형 변환을 위해서는 (int)MODE::EASY처럼 명시적으로

변환해줘야 합니다.

 

동적할당

동적할당은 컴파일 단계가 아닌 프로그램 실행중에 메모리에 할당하는 방법으로 배열을 동적할당 하기 위해서는

const int mode = (int)_eMode * 5;
int* ptr = new int [mode];

 

처럼 포인터 변수에 new 키워드를 사용하여 할당해야합니다.

 

그리고 동적할당은 힙 영역에 생성되기 때문에 항상 사용하지 않을때 직접 삭제를 해줘야합니다.

delete와 delete[]를 써서 삭제를 해줘야하고

delete[] prt; 포인터를 써줘야 동적할당된 배열이 삭제됩니다.

 

아무키나 입력받기

아무키나 입력받기 위해서는 일단 #include <conio.h>를 추가해줘야합니다.

아무키나 입력받는 함수는 _getch와 _kbhit가 있습니다.

 

이때 둘에 차이는 _getch는 입력받은 키를 char형으로 받지만 _kbhit는 그냥 딱 키보드가 입력되었는다는것만

받습니다.

 

아스키코드

만약 입력을 받을때 1을 입력받고 싶다면 어떻게 해야할까요?

 

 char ch = _getch();
 if(ch - '0' == 1) 
     break;

 

물론 ch == '1'을 써도 되지만 ch를 아스키 코드로 바꾼 값과 '0' = 48을 뺀 값이 1인지를 확인하는 방법을 쓸수도

있습니다.

 

타이머세기

만약 콘솔창에 타이머를 세고싶은데 전에 찍은 숫자를 지우고 싶다면 어떻게 해야할까요?

이스케이프 문자인 '\r'을 사용하면 됩니다.

'\r'은 커서를 해당줄 맨 앞으로 이동시키는 문자인데, 콘솔창은 만약 이미 출력된게 있는곳에 또 출력을 하려고

하면 기존에 출력된걸 덮어버리기 때문에 타이머처럼 보일 수 있습니다.