티스토리 뷰

안녕하세요, IT디자이너입니다.

 

이번 포스팅은 정해진 시간에 따라 키보드 입력을 받을 시 점수를 얻는 게임을 만들도록 하겠습니다.

 

이 게임을 위해 필요한 함수들은

 

시간을 체크할 함수, 키보드 입력 감지 함수, 키보드 입력 버퍼를 비울 함수가 필요합니다.

 

1. 시간 체크 함수

먼저 시간을 체크할 함수는 여러가지가 있습니다.

 

timeGetTime(), getTickCount(), colock() 함수 등이 있으며 이 함수들 말고도 더 많습니다.

 

먼저 이 함수를 사용하기 이전에 timer interrupt에 관하여 설명드리도록 하겠습니다.

 

윈도우즈가 여러 프로세스의 interrupt 주기는 0.015625(sec) 입니다. 즉, 시간은 지나지만 해당 시간동안은 실행되어야 할 프로세스가 실행을 기다리는 상태가 됩니다.

 

 

시간 함수를 사용하였을 때, 위 사진처럼 0.015625(sec) 만큼의 해상도를가지고 출력되는 모습입니다. 

 

 

과거에는 해당 주기를 하드웨어의 한계로 조절할 수 없었지만, 현재는 0.001(sec)로 조절이 가능합니다. 

 

timeBeginPeriod(1); 함수를 이용하여 0.0001(sec) 프로세스 스케쥴링 주기를 맞출 수 있습니다.

 

하지만, 그만큼 cpu의 과부하가 걸려 전력소모가 심해지기 때문에 주의하셔야하며, 이 함수는 현재 컴퓨터의 모든 프로세스 해상도에 영향이 가는 함수이기 때문에

 

코드의 실행을 마치셨으면, 마지막 코드에 timeEndPeriod(1); 함수를 사용해주세요 ^_^

 

2. 키보드 입력감지 함수, 엔터없이 버퍼에서 문자 출력 함수 ( _kbhit(), _getch()  )

 

1) _kbhit()

_kbhit() 함수는 사용자가 키보드를 입력하였는지 입력하지 않았는지 단순히 입력 버퍼만 확인하고 true or false를 리턴하는 함수입니다.

 

단순히 버퍼만 확인하기 때문에 처음 버퍼에 키보드로부터 값이 입력되고 난 후 버퍼를 비우지 않으면 계속 true 값을 리턴합니다.

 

 

2) _getch() 

_getch() 함수는 사용자로부터 엔터 입력 없이 버퍼에 있는 값을 출력하는 함수입니다. _kbhit() 함수를 사용하고 버퍼를 비울 때 사용하기 좋은 함수겠죠? ;)

 

이 함수를 사용하기 위해서는 conio.h 헤더를 include를 하여야합니다.!!

 

3. 타이밍 맞추기 게임 만들기!

 

이제 우리는 특정 시간에 맞추어 사용자가 키보드를 입력하였을 때 정확도에 따라서 점수를 제공하는 게임을 만들 것입니다.

 

1) 실행 결과 

2) 게임 구성 팁

  • 사용자의 정확도에 따라서 Gread, Good, NoGood, Bad 점수가 저장됩니다.
  • 사용자가 입력하지 않았을 경우 자동으로 Bad 점수가 저장됩니다.
  • 사용자의 점수를 저장할 배열을 만듭니다.

 

답은 꼭 다 만드신 후 보시길 바랍니다.!!!

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

 

#include <iostream>
#include <Windows.h>
#include <conio.h>  // _kbhit(), _getch() 함수 사용을 위한 라이브러리

#pragma comment(lib, "winmm.lib") // timeGetTime() 함수 사용을 위한 라이브러리

using namespace std;

int main()
{

	timeBeginPeriod(1); // timer interrupt 해상도를 1로 맞춥니다.

	char pointList[4][256] = { // 점수 리스트
		{"Bad"},
		{"NoGood"},
		{"Good"},
		{"Gread"},
	};

	int g_Timing[] = { 5, 10, 14, 17, 20, 25, 29, 34, 37 }; // 타이밍

	char userPoint[9][256] = { {" "} }; // 유저의 점수 기록하는 배열

	double begin; // 처음 시작시 시간
	
	double end; // 프로그램 실행 후 반복문안에서 체크할 시간

	double checkC; // begin - end 값
		
	int tIndex = 0; // 스테이지 체크

	begin = timeGetTime();

	cout << fixed; // 출력 소수점 자리수 고정
	cout.precision(3); // 소수점 밑 3자리까지 출력

	
	while (1) {
		
		end = timeGetTime();

		checkC = (end - begin) / 1000; // 경과시간 구하기

		cout <<"타이머 : " << checkC << endl; 
		cout << endl;

		if (_kbhit()) {
			
			// fabs는 double의 절대값 구하는 함수입니다.
			if (fabs((double)g_Timing[tIndex] - checkC) >= (double)1) { // 유저 입력 시간이 1초이상 차이날 경우 
				strcpy_s(userPoint[tIndex],strlen(pointList[0])+1,pointList[0]);
			}

			// 0.75이하로 차이나고 0.5초 초과로 차이날경우
			else if (fabs((double)g_Timing[tIndex] - checkC) <= (double)0.75 && fabs((double)g_Timing[tIndex] - checkC) > (double)0.5) { 
				strcpy_s(userPoint[tIndex], strlen(pointList[1]) + 1, pointList[1]);

			}

			// 0.5이하로 차이나고 0.25초 초과로 차이날경우
			else if (fabs((double)g_Timing[tIndex] - checkC) <= (double)0.5 && fabs((double)g_Timing[tIndex] - checkC) > (double)0.25) {
				strcpy_s(userPoint[tIndex], strlen(pointList[2]) + 1, pointList[2]);

			}
			// 0.25 이하로 차이날 경우
			else if (fabs((double)g_Timing[tIndex] - checkC) <= (double) 0.25) {
				strcpy_s(userPoint[tIndex], strlen(pointList[3]) + 1, pointList[3]);
			}

			_getch(); // 버퍼 비우기
			tIndex++; // 스테이지 상승
		}

		// 유저가 입력하지 않았을 경우 자동으로 Bad값을 저장
		if (checkC > 6 && tIndex == 0) {
			strcpy_s(userPoint[tIndex], strlen(pointList[0]) + 1, pointList[0]);
			tIndex++;
		}
		else if (checkC > 11 && tIndex == 1) {
			strcpy_s(userPoint[tIndex], strlen(pointList[0]) + 1, pointList[0]);
			tIndex++;
		}
		else if (checkC > 15 && tIndex == 2) {
			strcpy_s(userPoint[tIndex], strlen(pointList[0]) + 1, pointList[0]);
			tIndex++;
		}
		else if (checkC > 18 && tIndex == 3) {
			strcpy_s(userPoint[tIndex], strlen(pointList[0]) + 1, pointList[0]);
			tIndex++;
		}
		else if (checkC > 21 && tIndex == 4) {
			strcpy_s(userPoint[tIndex], strlen(pointList[0]) + 1, pointList[0]);
			tIndex++;
		}
		else if (checkC > (double)26 && tIndex == 5) {
			strcpy_s(userPoint[tIndex], strlen(pointList[0]) + 1, pointList[0]);
			tIndex++;
		}
		else if (checkC > (double)30 && tIndex == 6) {
			strcpy_s(userPoint[tIndex], strlen(pointList[0]) + 1, pointList[0]);
			tIndex++;
		}
		else if (checkC > (double)35 && tIndex == 7) {
			strcpy_s(userPoint[tIndex], strlen(pointList[0]) + 1, pointList[0]);
			tIndex++;
		}
		else if (checkC > (double)38 && tIndex == 8) {
			strcpy_s(userPoint[tIndex], strlen(pointList[0]) + 1, pointList[0]);
			tIndex++;
			break;
		}


		for (int i = 0; i < 9; i++) { // 현재 스테이지와 유저의 점수를 출력
			cout << g_Timing[i] << " Sec : " << userPoint[i] << endl;
		}



		if (tIndex == 9) // 스테이지가 8이 지났을 경우 종료
			break;

		system("cls"); // 콘솔 지우기
	}

	timeEndPeriod(1); // timer interrupt 초기화
}

 

 

이렇게 타이밍 맞추기 미니 게임을 완성하였습니다. 이러한 방식을 응용하면 리듬게임도 만들 수도 있습니다.!!

 

이해가 안가는 부분은 댓글에 남겨주시면 감사하겠습니다. !!!

 

이상 IT디자이너였습니다. 

 

감사합니다.

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/10   »
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 26
27 28 29 30 31
글 보관함