상태이상 : 호기심 중독

이것저것 알아두면 언젠간 도움이 된다.

코딩/그냥 만든 무언가

단지 3x3 사각형이 왔다갔다 할 뿐인 프로그램 - 1

IT코코아 2018. 9. 9. 19:13

나도 콘솔 게임을 만들고 싶어서 무작정 인터넷보고 따라하는 중이다.
새로 알게된 것들이 꽤 있어 적어 둘려고 한다.

전체 코드

#include "stdafx.h" //Windows.h, coino.h, iostream
void move() {
	int ch;

	do
	{
		ch = _getch(); //키보드로부터 입력
		ch = toupper(ch); //대문자로 변경.
		
		if (ch == 224) //특수키를 입력하면 두개의 값을 반환함. 방향키는 224 먼저.
		{
			switch (_getch()) //2번째 값을 받기위해 다시 호출.
			{
			case 77 : std::cout << "→";
				break;
			case 75 : std::cout << "←";
				break;
			case 72 : std::cout << "↑";
				break;
			case 80 : std::cout << "↓";
			}
			_putch('\r');    // Carriage return  
			_putch('\n');
		}
		
		
	} while (1); //Y가 아니면 do를 다시 실행.

	  
}
void setCursor(int x, int y)
{
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); //콘솔에서 커서의 위치를 바꿔준다.
}

int cube[5][5] =
{
{ 0,0,0,0,0 },
{ 0,1,1,1,0 },
{ 0,1,1,1,0 },
{ 0,1,1,1,0 },
{ 0,0,0,0,0 },
};

void ShowCube(int X, int Y){
	int x, y;
	 
	for (y = 0; y<5; y++,puts(""))
	{
		setCursor(X, Y);
		for (x = 0; x<5; x++)
		{
			if (cube[y][x] == 1)
			{
				std::cout << "■";
				
			}
		}
		Y++;
		
	}
	Sleep(100);
}

void removeCube(int X, int Y) {
	int x, y;

	for (y = 0; y<5; y++, puts(""))
	{
		setCursor(X, Y);
		for (x = 0; x<5; x++)
		{
			if (cube[y][x] == 1)
				std::cout << "  "; //■의 가로 길이가 2칸이더라..
		}
		Y++;

	}
	Sleep(100);
}

int main()
{	
	system("mode con lines=50 cols=200"); //콘솔의 크기를 정해준다. 행, 열 순으로 지정

	while (1) {
		ShowCube(50, 10);
		removeCube(50, 10);
		ShowCube(60, 10);
		removeCube(60, 10);
	}
	
    return 0;
}                                             

void move()

이 함수는 만들어 두고 main에는 아직 사용하지 않았다.
처음에 "일단 캐릭터가 움직여야겠지" 하고 방향키를 입력하면 화살표가 출력되도록 일단은 만들어 봤다.

int ch;

	do
	{
		ch = _getch(); //키보드로부터 입력
		ch = toupper(ch); //대문자로 변경.
		
		if (ch == 224) //2개의 값을 반환함. 방향키는 224 먼저.
		{
			switch (_getch()) //2번째 값을 받기위해 다시 호출.
			{
			case 77 : std::cout << "→";
				break;
			case 75 : std::cout << "←";
				break;
			case 72 : std::cout << "↑";
				break;
			case 80 : std::cout << "↓";
			}
			_putch('\r');    // Carriage return  
			_putch('\n');
		}
		
	} while (1); 

사실 이 함수는 MSDN에 있는 _getch()함수의 설명에 나와있던 코드였다.
원하는 키만을 입력받기 위한 코드 였는데 내 입맛에 맞게 응용해봤다.

_getch()는 입력한 키보드의 값을 아스키코드로 반환해주는 함수이다. cin과 달리 입력버퍼를 사용하지 않아 바로 입력과 동시에 변수에 넣어진다고 한다. + 왜인지 모르겠는데 디버그 모드로 콘솔창에 입력을 해도 화면에는 입력한 문자가 보이지 않더라..
(컨트롤, 알트, 시프트 키는 입력받을 수 없다고 한다.)
<coino.h>를 포함시켜야한다.

toupper()함수는 인수의 문자를 대문자로 바꿔주는 함수이다.
소문자 대문자 구분없이 입력받고자 할 때 이용하면 될 것 같다. <iostream.h>에 존재한다.

_getch()를 통해 키보드로 부터 입력을 받고 ch를 cout을 통해 출력 시켜봤는데 이상하게도 값이 두번 나오더라. 왜 그런가 찾아보니 특수키와의 구분짓기 위해서라고 한다. 
참고로 방향키는 224를 먼저 반환하고 위, 아래, 왼쪽, 오른쪽 순으로 72, 80, 75, 77을 반환한다.

_putch()는 아스키코드값을 콘솔에 버퍼 없이 출력해주는 함수인 것 같다.
인수로 정수를 사용해도되고 char타입을 사용해도 된다.

무한 반복이라 그냥 while문을 사용해도 되지만 귀찮아서 do while을 사용했다. 
사용 해본지 엄청 오래된 do while문... MSDN예제를 보고 "조건확인 전에 다른 절차가 필요할 때 do while을 쓰는구나" 하고 다시 사용법을 익힐 수 있었다.

void setCursor(int x, int y)

{
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

SetConsoleCursorPosition(), <Windows.h>헤더를 포함시켜 함수를 사용한다.
콘솔의 커서 위치를 2차원 좌표를 이용해 움직일 수 있다.
인수로 첫번째에는 핸들을 두번째는 좌표를 저장한 변수를 넘겨주면 된다.
GetStdHandle(STD_OUTPUT_HANDLE)이놈은 콘솔에 있는 커서의 정보를 반환한다고 한다.

COORD라는게 눈에 띄는 데 좌표값을 저장하는 구조체라고 한다.

반응형