Featured image of post C언어로 만드는 리듬게임

C언어로 만드는 리듬게임

1학년 2학기 프로그래밍랩 과목 텀프로젝트 리듬게임

C언어로 만드는 리듬게임

1학년 텀프로젝트 과제로 만들었던 리듬게임입니다.

리듬게임 자체를 만드는건 오래 걸리지 않았던 것 같은데, 노트들의 싱크를 맞춘다고 정말 고생했던 기억이 납니다.

사용법

D, F, J, K 키를 사용하여 노트를 입력합니다.

정확하게 노트를 입력하면 Excellent, 조금 느리게 입력하면 Good 판정이 됩니다.

연속으로 노트를 입력하게 되면 콤보가 쌓입니다.

콤보와 판정을 통해 점수가 쌓입니다. 점수 계산 식은 다음과 같습니다.

1
score += (combo / 10 + 1) * 50

설정 메뉴에서 두가지 옵션을 켜고 끌 수 있습니다.

  • ‘노트 찍기 모드’를 켜면 에디터 모드가 활성화 됩니다. 노래는 나오지만 노트는 내려오지 않습니다. 이 때, 노래에 맞춰 키보드를 입력하면 노트가 ’note.txt’ 파일에 저장되게 됩니다.

  • ‘디버깅 모드’를 켜면 디버깅 모드가 활성화 됩니다. 화면이 새로고침 되는 딜레이를 확인할 수 있습니다.

설명

  • 시작 부분의 간단한 텍스트 애니메이션은 for문을 통해 구현하였습니다. 이차원 char 배열로 텍스트를 저장해둔 뒤, 한 줄씩 출력/지우기를 반복하는 방식입니다.

  • 노래를 선택하게 되면 노트가 저장된 텍스트 파일에서 char 배열로 버퍼를 받습니다. 0이면 노트가 없는 것이고, 1이면 노트가 있는 것으로 판단합니다.

  • 노래는 PlaySound 함수를 사용하여 재생하였습니다.

  • 노트는 텍스트 색상을 바꾼 뒤, 공백을 출력하여 리듬게임의 노트인 것처럼 구현하였습니다. SetConsoleTextAttribute 함수를 통해 텍스트의 색상을 바꾸어 주었습니다.

  • 한 화면의 딜레이는 노래의 BPM에 맞춰주었습니다. 노트가 빠르게 출력되어야 하기에 필연적으로 딜레이에 편차가 생기게 됩니다. 반복문의 시작과 끝에 시간을 측정하여, 딜레이를 균일하게 보정해 주었습니다.

  • 더블 버퍼링을 응용하여 프론트 버퍼와 백 버퍼가 바뀌는 부분만 공백으로 지운 후, 출력하는 방식으로 구현하였습니다.

  • 키 입력을 받는 것은 GetAsyncKeyState 함수를 사용하였습니다. 멀티 쓰레드를 위해 _beginthreadex 함수를 사용하였습니다. 여러 키를 동시에 입력받을 수 있게 해 줍니다.

  • 판정선에 노트가 들어왔을 때, 화면 버퍼와 키 입력 상태를 비교하여 노트 입력 판정을 구분합니다. 프론트 버퍼와 백 버퍼의 상태를 비교하여 롱 노트와 숏 노트를 구분합니다. 노트를 정확하게 눌렀다면 Excellent, 빠르게 눌렀다면 Good, 놓쳤다면 Miss로 구분합니다. key_state 변수를 만들어 키를 꾹 눌러 점수를 얻는 것을 방지하였습니다.

  • 게임 중 Excellent, Good, Miss 판정을 기록합니다. 기록된 판정의 비율에 따라 랭크가 부여됩니다. 게임이 끝나게 되면 판정들을 보여주고, 비율에 따라 그래프를 그려 성취도를 직관적으로 보여줍니다.