https://youtu.be/Ehxds_PS4Ow

▲ 2018년 12월. 콘솔로 반복문과 배열을 이용하여 만든 도트 게임입니다.
   텍스트 색깔을 바꾸어 하나씩 출력하며 색을 출력하는 방식입니다.
   이 콘솔 프로그램의 목적은 반복문, 조건문 문법에 익숙해지는 연습에 있습니다.

 

Welcome.zip
0.44MB

▲코드 올림!


▲ 반복문과 스위치문이 사용된 모습. 배열에 담아둔 글자를 해당 조건에 따라 출력

 

▲배열로 색 정보를 담아둔 모습. 0일때는 검은색, 이외에는 각 숫자별로 색을 의미합니다.

 

 

플레이어가 두명의 플레이어를 모두 조종하는 턴제 대전 게임이며,

 

절차지향 언어의, 위에서부터 아래로 내려가는 특성을 배움과 동시에

 

반복문, 조건문, 배열등을 다양한 방법으로 구사해보는것에 목적이 있습니다.

 

왠만한 설명은 코드 내 주석에 전부 설명되어있긴 하나,

 

전체적인 구조방식 및 익숙치 않을법한 몇몇 코드만 추가로 적어두겠습니다.

 

아래 사진은 큰 3가지 화면을 요약해본 그림입니다.

 

 

 

첫화면

 

첫번째 while문이 나오는부분을 크게 묶어서 첫화면이라고 하겠습니다.

 

여기 속에 들어있는 코드를 보면 먼저 디자인 파트에선 2차원 배열을 선언하고,

 

그 2차원 배열 속 숫자를 하나씩 읽으며 적힌 숫자에 따라 색을 바꾼 후

 

화면에 네모를 찍는 방식으로 그림을 그립니다.

 

switch 문을 사용했는데, 배열에서 상대적으로 사용빈도가 높은 순으로

 

case문을 배치를 하였습니다 (예를들어 배열에 0이 가장 많이 들어있으니 case 0을 맨 위로).

 

그래야 실행할때 컴퓨터가 아래까지 코드를 보고 왔다갔다 하지 않아서 빨라지지 않을까 하는 마음에..

 

입력받을때 1이나 2 외엔 전부 continue를 이용해 처음부터 새로 그리는 방식을 채택했습니다.

 

사실 '2' 도 루프를 깨지 않는 유효입력이긴 하나 게임 자체가 꺼지므로..큰 의미는 없고, 사실상 1만 허용합니다.

 

입력을 1 받았다면 무한반복 while문이 깨지고 다음 픽창 while문으로 도달하게 됩니다.

 

 

 

※getch 처음보시는분들 있으실수 있는데, 이건 C++가 아닌 C에서도

 

conio.h를 포함시킬경우 사용시킬수 있는 기능으로, 한글자 입력받는 역할을 수행합니다.

 

두글자 이상을 한번에 입력받을땐 c++의 cin 이나 C언어의 scanf 그대로 쓰시면 되고,

 

한글자만 입력받아도 될 경우엔 전 getch를 사용합니다.

 

자세한 사항은 getch를 구글에 검색해보시면 여러 활용예시가 나옵니다.

 

#include <conio.h> //헤더는 콘솔인풋아웃풋의 약자인 conio
	char input; //유저 입력을 받기 위한 차형 선언
	input = _getch(); //입력받아 인풋에 저장. 이 코드에 도달하면 콘솔창에서 입력받게 커서 반짝거림


//이제 input엔 입력한 글자 하나가 들어가있음.

 

 

픽창

 

전투화면보다 훨씬 더 공을 많이들인, 신경을 많이 쓴 픽창입니다.

 

먼저 1224개의 요소가 들어간 배열을 인쇄해준 다음 입력을 받는걸로 시작됩니다.

 

처음에 입력을 받기 전이라면 화면은 반만 표시되고,

 

입력을 받은 후에야 상세 캐릭터 정보창을 띄워주기 시작합니다.

 

위에 설명한 getch로 화면을 인쇄하는 도중에 멈추고 분기점을 만들어내는

 

용도로 사용한것인데, 아래 그림으로 설명해보겠습니다.

 

 

이처럼 유저입력창인 cin이나 getch를 화면 전체 그리는 코드 중간에

 

넣어줄시 잠시 멈춤 효과를 줄 수 있는 동시에,

 

나머지 화면 출력을 유저 입력값을 분기점으로 삼아

 

그리게 되므로 맨 위쪽 1224개의 커다란 그림을 매번 다시 그릴 필요 없게 됩니다.

 

잘못된 입력이나 다른 캐릭터를 선택하기 위해 번호를

 

입력받는등의 사유로 화면을 새로 그려야 할 일이 있을땐 화면

 

중간서부터 아래 내용을 전부 지워버리고 다시 그리기 시작합니다.

 

전부 화면을 지운 후 상단의 1224개의 배열을 다시 찍기엔

 

콘솔같이 느린 화면에선 좀 부담이 되니 선택한 방법입니다.

 

▼화면을 전부 지우는 system cls
System("cls"); //편리하긴 하나 콘솔서 꽤 느리게 작동함! 화면을 전부 지워버림. 무거운 기능중 하나

▼ 대체안
for (int i = 0; i < 콘솔높이; i++) //좌표서부터 본인이 지정해준 횟수만큼
{
	printf("                                            \n"); //기존 적힌 내용을 빈공간으로 덮어씌워 지움
}

 

 

필요한 부분으로 커서를 이동 후에 거기서부터 화면을 지우기 위한 스페이스를 입력하든

 

새로 그림을 그리든 하기 위해선 커서를 원하는 위치로 옮기는 방법 및 콘솔의 좌표계를 알아야합니다.

 

OpenGL, 유니티 혹은 DirectX 다룰때 좌표계를 새로 배울거라 간단하게만 알고 넘어가겠습니다.

 

▲우측방향으로 x가 증가, 아래방향으로 y가 증가합니다.

 

 

COORD가 제 코드에 있는데, 이건 Coordinate의 약자로 말 그대로 좌표란 뜻입니다.

 

COORD의 형식은 구조체를 재정의한것으로, x,y를 한묶음으로 coord라는 자료형식으로

 

부르기로 했다 이렇게 이해하시면 될거같습니다.

 

구조체에 대한 자세한 설명은 바로 다음 프로그램에 다루겠습니다

 

 

COORD pos; //좌표를 저장할 구조체형식의 position 저장할 변수	
pos.X = 0; //x좌표 0으로
pos.Y = 28; //y좌표 28로. 
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); //커서를 위 좌표로 옮김

 

 

▲구조체 속에 들어있는 X에는 원하는 0의 좌표를,

 

Y에도 원하는 좌표를 넣은 후 해당 위치로 이동을 시키는 마지막 줄을 실행하면

 

해당 위치로 커서를 옮깁니다.

 

저 상태서 cout << "난 여기야" <<endl; 입력시 커서가 있던곳서 출력이 되기 시작합니다.

 

원하는곳서 출력하는것에 대해 설명하느라 이야기가 많이 새어나갔는데,

 

본론으로 돌아와 픽창을 다시 요약하자면

 

화면 중반부분까지 커서를 옮긴 후 거기서부터 맨 아래까지

 

반복문으로 기존 출력물들을 싹 다 지운 후 커서를 다시 화면 중간으로 옮겨서

 

원하는 내용을 출력했다고 보시면 됩니다.

 

최종 픽 확인 그림까지 그려진 상태에서 스페이스바를 입력받으면

 

픽창의 무한루프문이 깨지고 다음 전투화면 루프로 넘어갑니다.

 

 

 

전투화면

 

총 체력이 120이고 체력이 90일때, 반복문을 이용해 10의 단위로 끊어서

 

남은체력 90은 ■ 9개로, 닳은 체력 30은 □ 를 3개 그리는 방식으로 체력을 표시했습니다.

 

전투의 무한반복문이 돌기 전에 반복문 "밖"에서 HP나 쿨타임등 초기값을 먼저

 

선언해주어 실행 도중에 의도치 않게 반복문이 돌때마다 변수들이 초기화되는 불상사를 막아두었습니다.

 

전투 도중 어느 한쪽의 hp가 마이너스가 된다면 그 다음줄에 바로

 

해당 마이너스 체력에 0을 대입해버리고 게임오버 플래그를 세워

 

반복문이 게임오버를 체크하는 단계에 도달시 게임이 종료되게 해두었습니다.

 

턴을 바꾸는 방법으로는 아래 방식을 사용했습니다.

 

int turn = rand() % 2; //턴 랜덤시작. 0일때 내턴, 1일때 상대턴

turn  = !turn //공격 할때마다 턴을 바꾸기 위해 이 코드가 들어가있음. !0은 1이고, !1 = 0 입니다.

 

 

스킬은 오버워치 궁극기처럼 처음부터 사용하지 못하게 되어있지만

 

일반 공격을 할때마다 쿨타임이 줄어들어 사용할수 있는 턴이 돌아오게 됩니다.

 

구현은 그냥 일반공격할때 쿨타임 --, 스킬 사용후엔 다시 쿨타임에 원래값 대입하기로,

 

마나같은 개념 없이 간단하게만 만들었습니다,

 

그래픽 찍는건 그냥 원하는 커서 위치서 배열을 정방향 혹은 역순으로 찍거나,

 

반복문으로 지우고 그리고를 빠르게 반복해서 움직이는거처럼 보이게 만드는등

 

약간 복붙의 노가다성이 짙고 논리적인 부분은 크게 없었다고 봅니다.

 

여기파트선 복사붙여넣기를 자주 하다보니 주석이나 멘트가 틀린게 좀 있을수 있습니다.

 

로직은 거의 비슷비슷하니 알아서 상황에 맞게 이해해주시는수밖에..

 

복붙이 많다보니 중괄호만 어디있었는지 안놓치게 괄호마다

 

주석을 다 다는것도 하나의 방법이라고 생각합니다.

'결과물 > C,C++ Console' 카테고리의 다른 글

Console - 텍스트 상점 구현  (0) 2020.06.22
Console - 2048게임  (0) 2020.06.22
Console - 섯다  (0) 2020.06.22

+ Recent posts