C로 만든 리듬게임

JEEWOO SUL·2021년 9월 1일
1
post-thumbnail

2017년에 간단하게 만들었던 콘솔 게임이다. 처음 프로그래밍을 시작했던 때라 많이 부족하지만.. 나름 3~4개월이라는 시간이 걸렸다. 이를 통해 C에서 중요한 기본 개념(포인터, 배열, for문 등)를 확실히 습득할 수 있었다.

🎬 시연영상

📝 코드

🎯 개발 과정

1. 기본 틀 잡기

콘솔좌표와 유니코드를 이용해서 기본 리듬게임 틀을 만들었다.

유니코드표 : https://en.wikipedia.org/wiki/List_of_Unicode_characters

이중에서 적절한 도형을 조합해서 만들었다.
콘솔 좌표는 우리가 생각하는 일반 좌표와 다르게 위에서 아래로 감소한다. 예를 들어 콘솔창 크기가 가로가 800이고 세로가 600이면, 콘솔좌표는 밑에 있는 그림과 같이 나타날 수 있다.

최종적으로 하나하나 좌표와 유니코드를 설정하면, 이런 표를 만들 수 있다.


2. 노트 떨어지는 기능

노트는 유니코드를 이용해서 네모 4개를 이용해서 만들었다. (유니코드 표 참조)

전체 흐름은 while 문을 이용해서 "노트를 이동 → 첫번째 값을 입력 → 전체 화면 (노트와 틀) 출력 → 키보드 입력 및 point 계산" 하는 순서이다.


기본 틀(frame)은 총 4칸이다. 시각적으로 4칸이지만 이것을 2차원 배열로 생각하면, frame[세로 칸][가로 칸]이다. 세로칸은 28칸으로 설정했고, 가로칸은 기본 4칸에 각 노트에 대한 점수 저장을 위해 1칸을 추가하면 총 5칸이다. 틀을 2차원 배열로 보기 쉽게 나타내 주면 밑에 그림을 보면 알 수 있다.

그러면 노트를 1칸씩 이동할려고 하면, for문을 이용해서 세로 칸을 1칸씩 이동하면 된다.

for(y=MAX_LINES-1; y>0; y--) {
	for(x=5; x>=0; x--) {
    	frame[y][x] = frame[y-1][x];
    }
}

3. 음악 재생

음악 재생은 PlaySound()함수를 사용했다. PlaySound() 함수를 이용해서 음악을 재생할려면 음원 파일은 .wav 파일이여만 한다. mp3나 mp4 파일이면 "Audacity" 편집기를 이용해서 wav 파일로 바꾸길 바란다.

4. 음악 파일(.wav)와 노트의 연결

wav 파일 구성(WAVE file format)은 밑에 그림과 같다. 주소값이 44bytes 부터 음악 파일의 데이터이다.

fopen,fclose, fread 함수와 메모리 할당(malloc)를 이용해서 음원(.wav) 파일을 열고 데이터를 읽는다. 그 데이터의 숫자 범위는 0x00~0xFF 인데 알맞게 4개로 배분하기 위해서 숫자 비율에 맞게 할려고 했으나 너무 어려워서 그냥 숫자 순대로 4개로 배분했다. 텀은 16bytes이다.

5. 내려오는 노트의 처리

키를 입력받고 대기하는 시간은 1초로 설정하였다. 이때, Sleep()함수를 이용하였다.
키를 입력받을 때, getch() 함수를 이용해 입력값을 읽어온다. 그런데 getch()함수는 키보드로 키를 입력하기 전까지 대기를 하다가 키를 누른 뒤에 다음 문장을 실행하므로 실시간으로 키보드를 입력받으려면 kbhit() 함수를 이용한다. kbhit()함수는 입력 버퍼에 입력값이 있는 지 확인하여 만약에 있으면 true, 없으면 false를 리턴한다.

char get_key() {
	if(_kbhit()) // 키를 눌렀으면 0이 아닌 값 반환
    		return _getch();
	return '\0';
}

max 시간은 1초인데, 입력받았을 때까지의 대기 시간과 그 외의 시간을 계산해야한다. 여기서 max 시간은 마음대로 설정해도 된다. 만약 max시간(=1초) 내에(while문을 이용해서), 해당 노트와 키보드 입력한 키와 맞았을 때 max시간(=1초)에서 대기시간(=맞출 때까지의 시간)을 빼준 다음 그 시간만큼 기다려야한다. 시간 계산은 GetTickCount() 함수를 이용한다.

profile
느리지만 확실하게 🐢

0개의 댓글