나도 콘솔 게임을 만들고 싶어서 무작정 인터넷보고 따라하는 중이다.
새로 알게된 것들이 꽤 있어 적어 둘려고 한다.
전체 코드
#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라는게 눈에 띄는 데 좌표값을 저장하는 구조체라고 한다.
'코딩 > 그냥 만든 무언가' 카테고리의 다른 글
단지 3x3 사각형이 왔다갔다 할 뿐인 프로그램 - 2 (0) | 2018.09.13 |
---|