본문 바로가기
C 계열/C

💻 MUD를 구현하며 배우는 C언어 (#4) 사용자 정보 설정

by Yubin Heo 2020. 4. 1.

이번 강좌가 엄청 어렵게 느껴질 수 있습니다.

그걸 버티실 의지가 있다면 밑으로 내려가 주세요.

 

* 저번 시간 코드 *

더보기
#include <stdio.h>
#include <windows.h>

#define pause system("pause > nul");
#define cls system("cls");
#define mainsize system("mode con cols=90 lines=30"); // cols = 칸/행 (가로)  lines = 줄/열 (세로)

void ViewStory(); // 스토리를 보여주는 함수
void ViewMain(); // 메인 화면을 보여주는 함수
void gotoxy(int x, int y); // 커서 이동 함수
void setcolor(int number); // 색상 변경 함수

int main(void) {
	printf("게임에 오신 것을 환영합니다!");
	cls;
	ViewStory();
	ViewMain();
}

void gotoxy(int x, int y) {
	COORD pos = { x,y };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

void setcolor(int number) {
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), number);
}


void ViewStory() {
	cls;
	printf("고대, 태초의 세계에는 돌, 나무, 바람, 해와 달, 강물과 바다 등,\n");
	printf("365개의 피조물에 신이 깃들었고 각자가 자신의 권능을 발휘하며 세상을 무질서하게 만들었다.\n");
	pause;
	printf("\n태초의 신에게서 힘을 받은 세 명의 오버시어가 나타났다.\n");
	pause;
	printf("\n오버시어들이 각각 자신의 권능인 '빛', '시간', '생명'을 세계에 부여해 질서를 세우자,\n");
	printf("고대신들은 세상의 법칙을 다룰 힘을 잃어버리고 버려지게 되었다.\n");
	pause;
	printf("\n기존의 신들이 잃어버린 힘은 무덤 속에 가두어졌고 \n");
	printf("주시하는 신 아브락사스는 그 무덤을 지켜보게 되고, 세계를 셋으로 나누었다.\n");
	pause;
	printf("\n태초의 어둠 속에서 세 여신이 나타나 순수한 에너지\n");
	printf("그 자체인 에르다를 빚어 메이플 월드, 그란디스, 마스테리아 세 세계를 창조하였다.\n");
	pause;
	printf("\n만물을 구성하는 원소가 된 에르다는 생명과 물체가\n");
	printf("만들어지고 사라지는 것을 반복하며 세상에 흐르게 된다.\n");
	pause;
	printf("\n이후 여신들은 그 세계의 용사들을 수호하며 때때로\n");
	printf("인간과 에르다를 이어줘 에르다를 다루는 능력을 발현시켜주었다.\n");
	pause;
	printf("\n질서를 세운 오버시어들은 질서가 무너지고 고대신들이\n");
	printf("부활하는 일이 일어나지 않도록 자신들의 대리인으로서 힘을 나눠준 초월자를 배치했다.\n");
	pause;
	printf("\n각 세계당 빛의 초월자, 시간의 초월자, 생명의 초월자를 각각 한 명씩, 총 세 명을 배치했다.\n");
	pause;
	printf("\n초월자는 존재 그 자체로 담당하는 영역의 균형을 유지하는 역할을 맡아\n");
	printf("에르다의 흐름에 이상이 생기지 않도록 보호하였다.\n");
	pause;
	printf("\n이로 인해 세계의 불확실성이 감소되었으며, 감히 예측할 수 없었던\n");
	printf("미래를 결정된 것으로 바꾸어버렸다.\n");
	pause;
	printf("\n\n아무 키나 누르시면 메인 화면으로 돌아갑니다.\n");
	pause;
}

void ViewMain() {
	int select;
	cls;
	mainsize;
	gotoxy(38, 5);
	setcolor(9);
	printf("Text RPG Game!");
	gotoxy(6, 7);
	setcolor(15);
	printf("내 이름 : 홍길동");
	gotoxy(6, 8);
	printf("HP : 20 \t MP : 20 \t EXP : 0% \t LEVEL : 1");
	gotoxy(6, 10);
	printf("1. 전투를 하러 나간다");
	gotoxy(6, 11);
	printf("2. 아이템을 사러 간다");
	gotoxy(6, 12);
	printf("3. 노동을 하러 간다");
	gotoxy(6, 13);
	printf("4. 잠시 휴식을 취한다");
	gotoxy(6, 14);
	printf("5. 게임을 종료한다");
	gotoxy(6, 16);
	printf("| 무엇을 하는 것이 좋을까? | >> ");
	scanf_s("%d", &select);
	pause;
}

 

💨 오늘의 목표


게임이 시작될 때, 스토리 뷰를 거치고 난 다음, 이름을 입력하고

메인 화면에 사용자의 고유 값을 출력한다.

 

 

💨 오늘의 코드 (변경점)


#include <stdio.h>
#include <windows.h>

#define pause system("pause > nul");
#define cls system("cls");
#define mainsize system("mode con cols=90 lines=30"); // cols = 칸/행 (가로)  lines = 줄/열 (세로)

void ViewStory(); // 스토리를 보여주는 함수
void ViewMain(); // 메인 화면을 보여주는 함수
void gotoxy(int x, int y); // 커서 이동 함수
void setcolor(int number); // 색상 변경 함수
void setnickname(); // 닉네임 설정 함수

char nickName[20]; // 캐릭터 이름
int hp = 20;
int mp = 20;
int attack = 5;
int defence = 5;
int exp = 0;
int level = 1;
int goso = 500;

int main(void) {
	printf("게임에 오신 것을 환영합니다!");
	cls;
	ViewStory();
	ViewMain();
}

void gotoxy(int x, int y) {
	COORD pos = { x,y };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

void setcolor(int number) {
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), number);
}


void ViewStory() {
	cls;
	printf("고대, 태초의 세계에는 돌, 나무, 바람, 해와 달, 강물과 바다 등,\n");
	printf("365개의 피조물에 신이 깃들었고 각자가 자신의 권능을 발휘하며 세상을 무질서하게 만들었다.\n");
	pause; 
	printf("\n태초의 신에게서 힘을 받은 세 명의 오버시어가 나타났다.\n");
	pause;
	printf("\n오버시어들이 각각 자신의 권능인 '빛', '시간', '생명'을 세계에 부여해 질서를 세우자,\n");
	printf("고대신들은 세상의 법칙을 다룰 힘을 잃어버리고 버려지게 되었다.\n");
	pause;
	printf("\n기존의 신들이 잃어버린 힘은 무덤 속에 가두어졌고 \n");
	printf("주시하는 신 아브락사스는 그 무덤을 지켜보게 되고, 세계를 셋으로 나누었다.\n");
	pause;
	printf("\n태초의 어둠 속에서 세 여신이 나타나 순수한 에너지\n");
	printf("그 자체인 에르다를 빚어 메이플 월드, 그란디스, 마스테리아 세 세계를 창조하였다.\n");
	pause;
	printf("\n만물을 구성하는 원소가 된 에르다는 생명과 물체가\n");
	printf("만들어지고 사라지는 것을 반복하며 세상에 흐르게 된다.\n");
	pause;
	printf("\n이후 여신들은 그 세계의 용사들을 수호하며 때때로\n");
	printf("인간과 에르다를 이어줘 에르다를 다루는 능력을 발현시켜주었다.\n");
	pause;
	printf("\n질서를 세운 오버시어들은 질서가 무너지고 고대신들이\n");
	printf("부활하는 일이 일어나지 않도록 자신들의 대리인으로서 힘을 나눠준 초월자를 배치했다.\n");
	pause;
	printf("\n각 세계당 빛의 초월자, 시간의 초월자, 생명의 초월자를 각각 한 명씩, 총 세 명을 배치했다.\n");
	pause;
	printf("\n초월자는 존재 그 자체로 담당하는 영역의 균형을 유지하는 역할을 맡아\n");
	printf("에르다의 흐름에 이상이 생기지 않도록 보호하였다.\n");
	pause; cls;
	printf("\n이로 인해 세계의 불확실성이 감소되었으며, 감히 예측할 수 없었던\n");
	printf("미래를 결정된 것으로 바꾸어버렸다.\n");
	pause;
	printf("\n\n아무 키나 누르시면 이름을 설정하는 곳으로 갑니다.\n");
	pause;
	setnickname();
}

void setnickname() {
	cls;
	setcolor(4);
	printf("\n\n\t닉네임 설정\n");
	setcolor(15);
	printf("\t당신의 이름을 입력 해 주세요 : ");
	scanf_s("%[^\n]", nickName, sizeof(nickName));
	Sleep(1000);
	ViewMain();
}

void ViewMain() {
	int select;
	cls;
	mainsize;
	gotoxy(38, 5);
	setcolor(9);
	printf("Text RPG Game!");
	gotoxy(6, 7);
	setcolor(15);
	printf("내 이름 : %s", nickName);
	gotoxy(6, 8);
	printf("HP : %d \t MP : %d \t EXP : %d%% \t LEVEL : %d", hp, mp, exp, level);
	gotoxy(6, 9);
	printf("Attack : %d \t Defence : %d \t GoSo : %d\\", attack, defence, goso);
	gotoxy(6, 11);
	printf("1. 전투를 하러 나간다");
	gotoxy(6, 12);
	printf("2. 아이템을 사러 간다");
	gotoxy(6, 13);
	printf("3. 노동을 하러 간다");
	gotoxy(6, 14);
	printf("4. 잠시 휴식을 취한다");
	gotoxy(6, 15);
	printf("5. 게임을 종료한다");
	gotoxy(6, 17);
	printf("| 무엇을 하는 것이 좋을까? | >> ");
	scanf_s("%d", &select);

	if (select == 1) {
		cls;
		printf("전투를 하러 나가기 싫은데?\n");
		pause;
		ViewMain();
	} else if (select == 2) {
		cls;
		printf("아 나 백수라;; 크흠\n");
		pause;
		ViewMain();
	} else if (select == 3) {
		cls;
		printf("아 일 나가긴 해야되는 좀 귀찮네;; ㅋ \n");
		pause;
		ViewMain();
	} else if (select == 4) {
		cls;
		printf("아니 백수가 일을 나가야지;; \n");
		pause;
		ViewMain();
	} else if (select == 5) {
		cls;
		printf("시른데?");
		pause;
		ViewMain();
	} else {
		cls;
		printf("제대로 입력좀 하란 말이야 \n");
		pause;
		ViewMain();
	}
	pause;
}

 

어제와 다른 부분을 찾아서 추가하고 수정해 줍니다.

 

💨 오늘의 코드 설명


char nickName[20];
int hp = 20; 
int mp = 20; 
int attack = 5; 
int defence = 5; 
int exp = 0; 
int level = 1; 
int goso = 500;

-> char은 문자형 변수 타입 입니다.

    위에부터 이름, 체력, 기력(마나), 공격력, 방어력, 경험치, 레벨, 고소(돈) 입니다.

    변수를 만들고 초기값으로 20 20 5 5 0 1 500 을 부여했습니다.

 

void setnickname() {
	cls;
	setcolor(4);
	printf("\n\n\t닉네임 설정\n");
	setcolor(15);
	printf("\t당신의 이름을 입력 해 주세요 : ");
	scanf_s("%[^\n]", nickName, sizeof(nickName));
	Sleep(1000);
	ViewMain();
}

-> 닉네임을 설정하는 함수 입니다. scanf_s 함수에서의 문자 입력은 위와 같습니다.

     %[^\n] 은 엔터와 공백을 포함한 모든 문자를 뜻합니다.

     sizeof 함수는 배열의 길이를 구해주는 역할을 합니다.

     

     Sleep 함수는 다음 코드로 넘어가기 전에 잠시 쉬는 시간을 가집니다

     Sleep 함수를 사용할 때에, 인자값 1000이 1초를 의미합니다.

 

if (select == 1) {
		cls;
		printf("전투를 하러 나가기 싫은데?\n");
		pause;
		ViewMain();
	} else if (select == 2) {
		cls;
		printf("아 나 백수라;; 크흠\n");
		pause;
		ViewMain();
	} else if (select == 3) {
		cls;
		printf("아 일 나가긴 해야되는 좀 귀찮네;; ㅋ \n");
		pause;
		ViewMain();
	} else if (select == 4) {
		cls;
		printf("아니 백수가 일을 나가야지;; \n");
		pause;
		ViewMain();
	} else if (select == 5) {
		cls;
		printf("시른데?");
		pause;
		ViewMain();
	} else {
		cls;
		printf("제대로 입력좀 하란 말이야 \n");
		pause;
		ViewMain();
	}

(위 기능들을 구현할 단계가 아니기 때문에, printf문으로 대체했습니다.)

 

if는 if(조건식) { ... } 의 형식으로 사용하며,

조건식이 참(true) 일때 실행됩니다.

 

else if는 else if(조건식) { ... } 의 형식으로 사용되며,

제일 처음 조건식이 거짓(false) 일때, 조건을 한번 더 주는 형식입니다.

 

else 는 else { ... } 의 형식으로 사용하며,

모든 조건식이 거짓(false) 일때 실행됩니다.

 

== 는 왼쪽이 오른쪽하고 같냐 라는 의미 입니다.

반대로 >= 는 왼쪽이 오른쪽보다 크거나 같냐 라는 의미이고

<=는 왼쪽이 오른쪽보다 작거나 같냐 라는 의미 입니다.

!= 는 왼쪽과 오른쪽이 같지 않냐 라는 의미 입니다.

 

오늘의 결과는 아래와 같습니다.

 

뿅!

댓글