너네 어제부터 학교 과제로 리듬게임 만든다고 개지랄하던 중붕이 한새끼 기억나냐??ㅋㅋㅋ 19학번 중붕이 드디어 완성했다... 이제 이 겜을 만들기까지의 과정을 여기에 기록하도록 하겠음






viewimage.php?id=2cb2d521e4df3d&no=24b0d769e1d32ca73fee80fa11d028315a8efe524a7018c72c9aa2b29d1c978bc30b59949f4a412d6875fa65760fcaaf6f6ae249548570c1b2430a5eb7de6691b02b


우선 헤더파일은 이렇게 선언했는데 이거 헤더파일이 어떤 역할을 하는 건지 잘 모르겠다;; 그냥 구글링 해가지고 내가 필요할 것 같은 함수들에 포함된 헤더들 긁어온거라서.. 혹시 아는 중붕이들 있으면 댓글로 좀 알려줘라..


일단 title1[]은 UI를 구성해주는 문자열이고, score이랑 combo는 말 그대로 점수랑 콤보 세주는 정수형 변수, akbo[] 문자열은 내가 채보를 한 악보라고 할 수 있음






viewimage.php?id=2cb2d521e4df3d&no=24b0d769e1d32ca73fee80fa11d028315a8efe524a7018c72c9aa2b29d1c978bc30b59949f4a4169382492637209cdadbe82ee428d0deb95aa747df55de4


start()함수는 처음 리듬게임의 타이틀 화면을 출력해주는 함수로 사용했음 이거 생각보다 비쥬얼 괜찮더라ㅋㅋ





viewimage.php?id=2cb2d521e4df3d&no=24b0d769e1d32ca73fee80fa11d028315a8efe524a7018c72c9aa2b29d1c978bc30b59949f4a4169382492637209cdadbe82e01dd858bbcffc757df55de4


title()은 게임의 UI를 출력해주는 함수야 이게 출력을 하면..




viewimage.php?id=2cb2d521e4df3d&no=24b0d769e1d32ca73fee80fa11d028315a8efe524a7018c72c9aa2b29d1c978bc30b59949f4a4169382492637209cdadbe82bc158a5dbfc8ab727df55de4



이런식으로 출력되게 돼. 혹시 여기 출력 화면에서 이 코드가 어떻게 짜여져있는지 알아챈 중붕이 있어??ㅋㅋ





viewimage.php?id=2cb2d521e4df3d&no=24b0d769e1d32ca73fee80fa11d028315a8efe524a7018c72c9aa2b29d1c978bc30b59949f4a4169382492637209cdadbe82e046880ab09cfe267df55de4


viewimage.php?id=2cb2d521e4df3d&no=24b0d769e1d32ca73fee80fa11d028315a8efe524a7018c72c9aa2b29d1c978bc30b59949f4a4169382492637209cdadbe82ea468a0fbeccf7297df55de4



여기는 리듬게임의 가장 중요한 알고리즘인 입력 및 판정을 해주는 함수야. 우선 kbhit() 함수로 상시 대기로 입력을 받고 (여기는 입력이라기 보다는 키보드가 눌렸는지 안눌렸는지 유무만 판별해서 0이나 1을 출력해주는 것이 가까워) 여기서 제시한 판정이 맞았다면 score 변수의 값을 올려주고, 콤보를 증가시켜줘.


근데, 노트를 너무 성급하게 눌러서 타이밍을 못 맞춘 경우도 생각해야겠지?? 그래서 만약 akbo 문자열 8번째에 0이 있다면, 점수를 지우고 스코어를 50씩 지우고 콤보를 0으로 초기화 하는 방향으로 코드를 작성했어






viewimage.php?id=2cb2d521e4df3d&no=24b0d769e1d32ca73fee80fa11d028315a8efe524a7018c72c9aa2b29d1c978bc30b59949f4a4169382492637209cdadbe82ed118d59bf9eae237df55de4


press()함수는 배열들은 1칸씩 밀어주는 함수로 선언했어


너네들도 알다시피 C언어는 프레임 단위로 무언갈 밀어주는 게 불가능해.. 그래서 내가 고안한 방법이 배열을 1칸씩 밀어주는거야. 이렇게 하면, 사용자가 보았을 때는 노트가 1칸씩 밀리는 것처럼 보일 수 있겠지??





viewimage.php?id=2cb2d521e4df3d&no=24b0d769e1d32ca73fee80fa11d028315a8efe524a7018c72c9aa2b29d1c978bc30b59949f4a4169382492637209cdadbe82ec168b0deacff6717df55de4

viewimage.php?id=2cb2d521e4df3d&no=24b0d769e1d32ca73fee80fa11d028315a8efe524a7018c72c9aa2b29d1c978bc30b59949f4a4169382492637209cdadbe82ee17d80ebf99ab247df55de4




자! C언어에서 실제로 실행되는 부분인 main()함수를 이제 적기 시작했어


일단 start()함수를 선언하고, system(cls); 를 선언하여 콘솔 화면을 전부 다 지워주고, title()을 선언하고 음악을 재생하기 시작하지


일단 게임 화면에서는 배열을 전체 다 출력하지 않아. 배열을 일부만 출력해주고, 배열을 한칸씩 옮긴다음에 다시 배열을 일부만 출력해주는 방향으로 가는거지.


그 다음에는 점수와 콤보를 출력해주지 그런 다음에는 key()함수로 사용자가 입력을 했는지, 안했는지 판별하고 점수를 부여해


만약, 게이머가 키을 아예 입력 안했다면 어떻게 할까? key()함수에서도 인식 못하고 점수도 변동이 없겠지??


그래서 만약 akbo 문자열의 2번째 값이 0이라면 콤보를 0으로 만들고, 점수를 50점씩 깎는 방향으로 코드를 작성했어.


또한, 콤보가 각각 10콤보, 50콤보, 100콤보, 150콤보, 200콤보를 달성한다면 콤보 수를 출력해주는 이벤트도 작성했어


그 다음에는 press()함수로 악보를 각각 1칸씩 밀어주지


이런저런 일련의 알고리즘이 전부 다 끝나면, 100밀리세컨드를 쉬고 다시 반복을 해.



만약 소스가 궁금하다면,


https://drive.google.com/file/d/1GuO6D5L8_yK-xwTlaZpvD37neqaIGj9T/view?usp=sharing


여기서 소스를 다운 받을 수 있어. 또한, 음악이 정상적으로 재생되게 하려면 C드라이브 최상위 트리에 asdf.wav파일을 배치해야돼. asdf.wav 파일을 다운 받고 싶으면


https://drive.google.com/file/d/16BvMAQlCl0zAtkgczCBnZv8ZYh_40aAC/view?usp=sharing


여기로 들가서 다운 받으면 돼 (노래 - Bruno Mars - The Lazy Song)



후... 학교 들어오고나서 1학년 제일 처음 프로젝트 (C언어로 자유주제 개발 및 발표)를 받은거라 더 열심히 한 것 같아ㅋㅋ 만약 이런 거랑 비슷한 과제가 들어온다면 난 이것 만큼이나 정성스레 코드를 짤 수 있을까..? 이런 게임은 처음 만들어 보는데 생각보단 잘 만들어 진 것 같아.. 암튼 긴 글 봐줘서 고맙고 너네들도 즐겜해라 ㅂㅂ




자고 일나니까 댓글존나 달렷네ㅋㅋ 영상 좀 올려달라던 중붕이 존나 많아서 녹화해서 올린다







ㄹㅇ 좆같이 못치는건 걍 넘어가고 보다시피 판정 구현에 너무 빨리쳐도 실패, 너무 느리게 쳐도 실패로 넣음 ㅇㅇ 밑에 !10콤보! 는 애미 시발ㅋㅋㅋ 50콤보를 어떻게 못넘어가냐ㅋㅋㅋㅋㅋㅋㅋㅋㅋ


후... 개애미 뒤진 좆같은 언어 빨리 C++ 이나 자바로 넘어가던가 해야지ㅋㅋ 나중엔 파이썬으로 딥러닝이나 배워봐야겠다


아니 그보다 한번 내 글 읽어봤는데 말투 왜케 띠껍냐??ㅋㅋ 어제 밤에 과제하다가 대가리가 삐꾸났나ㅋㅋ



출처: 중세게임 갤러리 [원본보기]