1. 작품 개요
- 개발 동기
C언어 2차원배열을 배우던 도중 미로가 머리를 스쳐서 미로를 만들게 되었습니다.
- 개발 환경
Visual Stdio 2019를 사용하여 제작하였습니다.
- 제작과정
4/30 | 5/2 | 5/5 | 5/7 |
주제 확정 | 미로 배열 생성 | 커서및 캐릭터 이동,제어 | 열쇠와 문, 파일입출력 동적할당 구조체 |
2. 작품 소개
- 사용 헤더 및 라이브러리
#include<stdio.h> //printf()등 함수
#include<windows.h> //gotoxy()등 함수
#include<conio.h> //_getch()등 함수
#include<time.h> //struct tm을 위하여
#include<stdlib.h> //malloc함수를 위하여
- 사용자 지정 함수
int keycontrol(void); //키 입력
void title_draw(void); //게임 이름
void textcolor(int,int); //색 선택
int menu(void); //메뉴 창f
void gotoxy(int, int); //커서 이동
void map_print(int*,int*); //맵 출력
void CursorView(char show); // 커서숨기기
int list(int); //난이도 선택
void gloop(int); //게임 루프
void move(int*, int*, int, int, int*,int*);//캐릭터 이동
void drawUI(int*, int*,int*); //게임 UI
void clear(void); //엔딩 화면
- 구조체
struct list_xy {
int list_x;
int list_y;
} a = { 36,15 };//list의 x,y좌표를 묶음
char temp_map[14][56]; //출력할 임시 맵
-함수 설명
int keycontrol() {
int n = _getch();
if (n == ' ') return Selection; //공백을 입력하여 Selection을 반환
else if (n == 'w'||n == 'W') return UP; //w를 누르면 UP을 반환
else if (n == 'a'||n == 'A') return LEFT; //a를 누르면 LEFT를 반환
else if (n == 'd'||n == 'D') return RIGHT; //d를 누르면 RIGHT를 반환
else if (n == 's'||n == 'S') return DOWN; //s를 누르면 DOWN을 반환
}
n에 _getch()를 사용하여 공백을 입력받으면 Selection이되고
W또는w를 입력받으면 UP이되고
A또는 a를 입력받으면 LEFT가되고
D또는d를 입력받으면 RIGHT가되고
S또는 s를 입력받으면 DOWN이되도록 하였다.
void title_draw(void) {
system("mode con cols=93 lines=30 | title maze");//콘솔창 사이즈와 이름
printf(" __ __ _______ _______ _______ _______ _______ _______ _______ _______ _______ \n");
printf("| |_| || _ || || | | || || || _ || || | \n");
printf("| || |_| ||____ || ___| | ___|| _____|| _|| |_| || _ || ___| \n");
printf("| || | ____| || |___ | |___ | |_____ | | | || |_| || |___ \n");//타이틀 출력
printf("| || || ______|| ___| | ___||_____ || |_ | || ___|| ___| \n");
printf("| ||_|| || _ || |_____ | |___ | |___ _____| || || _ || | | |___ \n");
printf("|_| |_||__| |__||_______||_______| |_______||_______||_______||__| |__||___| |_______| \n");
}
타이틀 화면을 출력하기위하여 콘솔창의 크기를 조절하고 타이틀을 출력한다.
int menu() {
gotoxy(a.list_x, a.list_y); printf("Press any key to start");
gotoxy(a.list_x, a.list_y + 2); printf(" 게임 방법"); //메뉴 출력
gotoxy(a.list_x, a.list_y + 3); printf(" 이동: w,a,s,d");
gotoxy(a.list_x, a.list_y + 4); printf(" 캐릭터:"); textcolor(lightgreen, black); printf("@");textcolor(lightgray, black);
gotoxy(a.list_x, a.list_y + 5); printf(" 도착:"); textcolor(cyan, black); printf("O"); textcolor(lightgray, black);
gotoxy(a.list_x, a.list_y + 6); printf(" 열쇠:"); textcolor(yellow, black); printf("^"); textcolor(lightgray, black);
gotoxy(a.list_x, a.list_y + 7); printf(" 문:"); textcolor(lightred, black); printf("*"); textcolor(lightgray, black);
n = _getch();
return n;
}
타이틀화면밑에 게임방법을 출력하고 아무키를 입력받으면 n을 반환하도록 하였습니다.
int list(int n) {
if (n) {
system("cls");
title_draw();
gotoxy(a.list_x, a.list_y); printf("> 쉬움(1)");
gotoxy(a.list_x, a.list_y + 1); printf(" 보통(2)"); //난이도 출력
gotoxy(a.list_x, a.list_y + 2); printf(" 어려움(3)");
gotoxy(a.list_x, a.list_y + 3); printf(" 종료");
while (1) {
int list = keycontrol();
switch (list) {
case UP: {
if (a.list_y > 15) {//y의 최솟값
gotoxy(a.list_x, a.list_y); printf(" ");//원래 자리에 공백
gotoxy(a.list_x, --a.list_y); printf(">");//위에 > 출력
}
break;
}
//방향키
case DOWN: {
if (a.list_y < 18) {//y의 최댓값
gotoxy(a.list_x, a.list_y); printf(" ");//원래 자리에 공백
gotoxy(a.list_x, ++a.list_y); printf(">");//밑에 >출력
}
break;
}
case Selection: return a.list_y - 15 ;//y의 최솟값이 15이므로, retyrn값이 0~3까지
}
}
}
}
처음화면에서 입력을 받았을 경우 gotoxy를 통하여 난이도와>를 출력하고
만약UP이 입력이되었을때 타이틀y좌표가 15보다 큰경우(크면클수록 밑에있다) --를 하여 >를 한칸 위에 출력하고,
DOWN인경우 반대로 하여 >를 한칸 아래에 출력하도록 하였다.
그리고Selection을 입력항경우 반환을 하는데 y좌표에따라 다른값을 반환을하고 종료위치인곳인경우 0이 반환이되도록 하여 프로그램이 종료되도록 하였다.
void map_print(int*x,int*y) {
system("mode con cols=56 lines=20 | title maze");//게임에 알맞은 콘솔크기 출력
int h, w; //세로,가로
char tmp;
for (h = 0; h < 14; h++) { //세로길이
for (w = 0; w < 56; w++) { //가로길이
tmp = temp_map[h][w];
if (tmp == '0') { //길
textcolor(black, black);
printf(" ");
}
if (tmp == '1') { //벽
textcolor(lightgray, lightgray);
printf("#");
}
if (tmp == '2') { //플레이어
*x = w; //가로위치를 전송
*y = h; //세로위치를 전송
textcolor(lightgreen, black);
printf("@");
}
if (tmp == '3') { //도착지
textcolor(cyan, black);
printf("O");
}
if (tmp == 'k') {//열쇠
textcolor(yellow, black);
printf("^");
}
if (tmp == 'l') {//문
textcolor(lightred, black);
printf("*");
}
}
printf("\n");//줄바꾸기
}
textcolor(white, black);//원래 색으로
}
맵을 char형으로 만들어서 for문을 통하여 '0'일경우 길이므로 공백으로 출력을하고
'1'일경우 벽이므로#을만드는데 색을 lightgray색으로 덮어서 꽉차도록 하였습니다.
'2'일경우 플레이어이므로@를 출력하되 그 문자에만 색을 입혔습니다.
'3'일경우 도착지이므로 O를 출력하고 cyan색을 사용하였습니다.
'k'일경우 열쇠이므로^를 출력하고 노란색으로 입혔습니다.
'l'일경우 문이므로*를 출력하여 문의 느낌을 내었고 빨간색을 입혔습니다.
출력을 끝낸후에는 색을 원대로 바꾸었습니다.
void gloop(int mapcode) {
int x, y;//플레이어 좌표
int k = 0; //열쇠
int play = 1; //실행 여부
switch (mapcode) {
case 0: memcpy(temp_map, map1, sizeof(temp_map)); break; //temp_map에 map1을 복사
case 1: memcpy(temp_map, map2, sizeof(temp_map)); break; //temp_map에 map2를 복사
case 2: memcpy(temp_map, map3, sizeof(temp_map)); //temp_map에 map3를 복사
}
map_print(&x,&y); //map프린트
while (play) {//일단은 1롤 초기화 종료될경우 0
drawUI(&x, &y, &k); //UI로 현재 좌표랑 열쇠 갯수를 프린트
switch (keycontrol()) {
case UP: move(&x, &y, 0, -1, &k, &play);
break;
case DOWN: move(&x, &y, 0, 1, &k, &play);
break;
case RIGHT:move(&x, &y, 1, 0, &k, &play);
break;
case LEFT: move(&x, &y, -1, 0, &k, &play);
break;
}
}
clear();
}
난이도 조절창에서 반환받은 값을통하여 불러울 맵을 선택하고 맵을 출력하는 함수로갑니다.
그리고 게임이 시작을하면 동작을 해야하므로 반복문을 돌고 UI를 출력하는 함수로 갑니다.
그리고 키를 입력받고 입력받은 값에 따라서 move함수로 가게 됩니다.
그리고 게임이 끝났을경우에는 반복문을 0으로(move함수에서 바꾼다)하고 clear함수로 갑니다.
void move(int* x, int* y, int move_x, int move_y,int* k,int* play) {// 플레이어 좌표2개 ,얼마나 이동하는지 2개,실행여부
char mapob = temp_map[*y + move_y][*x + move_x];
textcolor(white, black);
if(mapob=='0'||mapob=='2'){
gotoxy(*x, *y); printf(" ");
textcolor(lightgreen, black);
gotoxy(*x + move_x, *y + move_y); printf("@");
*x += move_x;
*y += move_y;
}
if (mapob == 'k') {
*k += 1;
temp_map[*y + move_y][*x + move_x] = '0';
gotoxy(*x + move_x, *y + move_y);
printf(" ");
}
if (mapob == 'l') {
if (*k > 0) {
*k -= 1;
temp_map[*y + move_y][*x + move_x] = '0';
gotoxy(*x + move_x, *y + move_y);
printf(" ");
}
}
if (mapob == '3') {
*play = 0;
}
}
gloop함수에서 입력받은 값에따라 move에 오게되는데 x와y는 플레이어의 좌표를 맵출력을할때 받아오고
move_x와move_y는 gloop함수에서 입력받은값에따라 움직이기위해서 더해야 하는 부분이고
k를 통하여 키갯수를 받아오며,play를 받아와서 게임종료를 설정한다
mapob는 원래의 x,y값에move_x,move_y를 더하여 움직이게될 방향을 받고
mabop가 길또는 플레이어일 경우에는 움직이게 하기위하여 원래있던위치에는 공백을 출력하고 움직이게될곳에
플레이어를 출력하게 하였다. 만약 움직이게될 경로에 열쇠가 있다면 열쇠갯수에 변화를 주기위해1을더하고
문을 만났는데 열쇠가 0을 넘는다면 1을빼고 공백을 출력하도혹 하였다.
도착지에 갔을경우 *play의 값을 0으로 바꾸어서 gloop의 반복문을 멈추게 하였다.
void drawUI(int* x, int* y,int*k) {
textcolor(white, black);
gotoxy(3, 17); printf("위치 : %02d, %02d", *x, *y);
textcolor(yellow, black);
gotoxy(20, 17); printf("열쇠 : %d개", *k);
}
현재위치와 열쇠갯수를 받고 gotoxy를 통하여 설정한 위치에 현재위치와 열쇠갯수를 출력하게됩니다.
void clear() {
char* name = (char*)malloc(sizeof(char) * 40);//이름 입력
char* date = (char*)malloc(sizeof(char) * 50);//현재 시간
time_t t = time(NULL);
struct tm ti = *localtime(&t);
FILE *User_name = NULL;
system("cls");
gotoxy(22, 5); printf("게임 클리어!!");
Sleep(2000);
gotoxy(20, 7); printf("이름을 입력하세요\n");
gotoxy(23, 8); scanf("%100[^\n]s",name);
gotoxy(20, 10);printf("재시작 합니다!!");
Sleep(1500);
User_name = fopen("User.txt", "w");
sprintf(date, "\n날짜 : %d-%d-%d %d:%d:%d", ti.tm_year + 1900, ti.tm_mon + 1, ti.tm_mday, ti.tm_hour, ti.tm_min, ti.tm_sec);
fprintf(User_name, name);
fprintf(User_name, date);
fclose(User_name);
free(name);
free(date);
}
gloop함수에서 게임이 종료되었으루 경우에 claear함수에 오게되는데 이 함수에서는 자신의 이름을 입력받아야 되므로
malloc을사용하여 동적할당을 받고 현재 시간을 출력해야하므로 마찬가지로 malloc을 사용하여 만들었습니다.
그리고 시간을 현재시간으로 맞추고 시간구조체를 사용하여 현재시간을 ti로 저장되게 했습니다.
그리고 사용자의 이름이 보여질 파일을 비웁니다. 그리고 콘솔창을 정리하고 게임클리어 문구를 띄우고 2초뒤에
이름을 입력하라는 문구가 나옵니다. 그리고 scanf를 통하여 이름을 입력받는데 줄바꾸기를 할경우에 입력이 종료되도록 하였습니다. 그리고 1.5초뒤에 종료되고 main함수로 인하여 메뉴화면으로 넘어가게됩니다.
그리고 파일에서는 user라는 txt파일을 열고 쓰기형식으로 합니다. 그리고 사용자 이름과 시간구조체에있던 시간들이
파일에 입력되도록 하고 파일을 닫고 동적할당을 헤제합니다.
int main(){
while (1) {
CursorView(show);
title_draw();
menu();
int listcode = list(n);
system("cls");
switch (listcode) {
case 0:gloop(0); break;
case 1:gloop(1); break;
case 2:gloop(2); break;
case 3: return 0;
}
a.list_y = 15;
}
}
반복문을 통하여 게임이 계속 실행되도록 하고 종요일경우에는 return이 0이므로 종료가 됩니다.
3. 코드
#define _CRT_SECURE_NO_WARNINGS
//해더파일
#include<stdio.h> //printf()등 함수
#include<windows.h> //gotoxy()등 함수
#include<conio.h> //_getch()등 함수
#include<time.h> //struct tm을 위하여
#include<stdlib.h> //malloc함수를 위하여
//키보드 값
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3
#define Selection 4
enum {
black,
blue,
green,
cyan,
red,
purple,
brown,
lightgray,
darkgray,
lightblue,
lightgreen,
lightcyan,
lightred,
lightpurple,
yellow,
white
};
//전역변수 선언
int n; //메뉴창에서 입력
int key; //키보드 입력
char show; // CursorView를 위해 선언
struct list_xy {
int list_x;
int list_y;
} a = { 36,15 };//list의 x,y좌표를 묶음
char temp_map[14][56]; //출력할 임시 맵
int q; //제한시간
//맵
char map3[14][56] = {
{"11111111111111111111111111111111111111111111111111111111"},
{"12000110001001000k10110101010001010101000111100100101011"},
{"11010000100100001000011010010101100000010000100000010011"},
{"11000101000000110101000010101001001010101100101001010101"},
{"10001101010110100101010000101100001010011101101010100101"},
{"11010101010001000010101010010001010101010101010100101011"},
{"11001010100010100000001000100100100010101001010100010101"},
{"11100010001000100010001001000100101010000100000100100101"},
{"10101000101010101111001001000100010011101001001001001011"},
{"11010010001000100100010001001001000000011010000000101011"},
{"10010111010100101010101010101010001001000101110100010101"},
{"10101010101110001000010101001011000100100001k11101l10101"},
{"110001001010000011110000000101000000100100000000100l0031"},
{"11111111111111111111111111111111111111111111111111111111"},
};
char map1[14][56] = {
{"11111111111111111111111111111111111111111111111111111111"},
{"12000000000000000000000000000111000000000000000000000001"},
{"10000000000000000000000000000000000000000000000000000001"},
{"11111111111111111111111111111111111111111111111110000001"},
{"10000000000000000000000111111000000000000000000000000001"},
{"11111111111111111000000000000000011111111111111111111111"},
{"110010101000101000000k1000100100100010101001010100010101"},
{"10000000000000000000000000000000000000000000000000000001"},
{"111111111111111111111111111111l1111111111111111111111111"},
{"11010010001000100100010001001001000000011010000000101011"},
{"10010111010100101010101010101010001001000100000100010101"},
{"10101010101110001000010101001000000100100001000001010101"},
{"11000100101000001111000000010100000010010000000000000031"},
{"11111111111111111111111111111111111111111111111111111111"},
};
char map2[14][56] = {
{"11111111111111111111111111111111111111111111111111111111"},
{"12000000000000000000000000000000000000000000000000000001"},
{"11111111111111111111111111111111111111111111111100000001"},
{"1100000000011000000000010000000100l010000000000000011111"},
{"100011010100001001010100001011000010000111011010100000k1"},
{"11010101111111111111111111111111111111111111111111111111"},
{"100000001100100k1000100111110000000001010010000000000011"},
{"10111000100100110000100000000010011101010001001111000011"},
{"10000101100000000100110011000010010001100101010000100101"},
{"11110111111111111100100100100000101100000100010011010001"},
{"10000100000000000000110011011100100111111110010100100101"},
{"10111110000000000000110111110010000100011100000011001001"},
{"10000000001111111110l00100011001010001010110011001000031"},
{"11111111111111111111111111111111111111111111111111111111"},
};
//함수 선언
int keycontrol(void); //키 입력
void title_draw(void); //게임 이름
void textcolor(int,int); //색 선택
int menu(void); //메뉴 창f
void gotoxy(int, int); //커서 이동
void map_print(int*,int*); //맵 출력
void CursorView(char show); // 커서숨기기
int list(int); //난이도 선택
void gloop(int); //게임 루프
void move(int*, int*, int, int, int*,int*);//캐릭터 이동
void drawUI(int*, int*,int*); //게임 UI
void clear(void); //엔딩 화면
void time_out(); //제한 시간
void CursorView(char show) {
HANDLE hConsole;
CONSOLE_CURSOR_INFO ConsoleCursor;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
ConsoleCursor.bVisible = show;
ConsoleCursor.dwSize = 1;
SetConsoleCursorInfo(hConsole, &ConsoleCursor);
}
void gotoxy(int x, int y) {
COORD pos = { x,y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void textcolor(int foreground, int background)
{
int color = foreground + background * 16;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}
int keycontrol() {
int n = _getch();
if (n == ' ') return Selection; //공백을 입력하여 Selection을 반환
else if (n == 'w'||n == 'W') return UP; //w를 누르면 UP을 반환
else if (n == 'a'||n == 'A') return LEFT; //a를 누르면 LEFT를 반환
else if (n == 'd'||n == 'D') return RIGHT; //d를 누르면 RIGHT를 반환
else if (n == 's'||n == 'S') return DOWN; //s를 누르면 DOWN을 반환
}
void title_draw(void) {
system("mode con cols=93 lines=30 | title maze");//콘솔창 사이즈와 이름
printf(" __ __ _______ _______ _______ _______ _______ _______ _______ _______ _______ \n");
printf("| |_| || _ || || | | || || || _ || || | \n");
printf("| || |_| ||____ || ___| | ___|| _____|| _|| |_| || _ || ___| \n");
printf("| || | ____| || |___ | |___ | |_____ | | | || |_| || |___ \n");//타이틀 출력
printf("| || || ______|| ___| | ___||_____ || |_ | || ___|| ___| \n");
printf("| ||_|| || _ || |_____ | |___ | |___ _____| || || _ || | | |___ \n");
printf("|_| |_||__| |__||_______||_______| |_______||_______||_______||__| |__||___| |_______| \n");
}
int menu() {
gotoxy(a.list_x, a.list_y); printf("Press any key to start");
gotoxy(a.list_x, a.list_y + 2); printf(" 게임 방법"); //메뉴 출력
gotoxy(a.list_x, a.list_y + 3); printf(" 이동: w,a,s,d");
gotoxy(a.list_x, a.list_y + 4); printf(" 캐릭터:"); textcolor(lightgreen, black); printf("@");textcolor(lightgray, black);
gotoxy(a.list_x, a.list_y + 5); printf(" 도착:"); textcolor(cyan, black); printf("O"); textcolor(lightgray, black);
gotoxy(a.list_x, a.list_y + 6); printf(" 열쇠:"); textcolor(yellow, black); printf("^"); textcolor(lightgray, black);
gotoxy(a.list_x, a.list_y + 7); printf(" 문:"); textcolor(lightred, black); printf("*"); textcolor(lightgray, black);
n = _getch();
return n;
}
int list(int n) {
if (n) {
system("cls");
title_draw();
gotoxy(a.list_x, a.list_y); printf("> 쉬움(1)");
gotoxy(a.list_x, a.list_y + 1); printf(" 보통(2)"); //난이도 출력
gotoxy(a.list_x, a.list_y + 2); printf(" 어려움(3)");
gotoxy(a.list_x, a.list_y + 3); printf(" 종료");
while (1) {
int list = keycontrol();
switch (list) {
case UP: {
if (a.list_y > 15) {//y의 최솟값
gotoxy(a.list_x, a.list_y); printf(" ");//원래 자리에 공백
gotoxy(a.list_x, --a.list_y); printf(">");//위에 > 출력
}
break;
}
//방향키
case DOWN: {
if (a.list_y < 18) {//y의 최댓값
gotoxy(a.list_x, a.list_y); printf(" ");//원래 자리에 공백
gotoxy(a.list_x, ++a.list_y); printf(">");//밑에 >출력
}
break;
}
case Selection: return a.list_y - 15 ;//y의 최솟값이 15이므로, retyrn값이 0~3까지
}
}
}
}
void map_print(int*x,int*y) {
system("mode con cols=56 lines=20 | title maze");//게임에 알맞은 콘솔크기 출력
int h, w; //세로,가로
char tmp;
for (h = 0; h < 14; h++) { //세로길이
for (w = 0; w < 56; w++) { //가로길이
tmp = temp_map[h][w];
if (tmp == '0') { //길
textcolor(black, black);
printf(" ");
}
if (tmp == '1') { //벽
textcolor(lightgray, lightgray);
printf("#");
}
if (tmp == '2') { //플레이어
*x = w; //가로위치를 전송
*y = h; //세로위치를 전송
textcolor(lightgreen, black);
printf("@");
}
if (tmp == '3') { //도착지
textcolor(cyan, black);
printf("O");
}
if (tmp == 'k') {//열쇠
textcolor(yellow, black);
printf("^");
}
if (tmp == 'l') {//문
textcolor(lightred, black);
printf("*");
}
}
printf("\n");//줄바꾸기
}
textcolor(white, black);//원래 색으로
}
void gloop(int mapcode) {
int x, y;//플레이어 좌표
int k = 0; //열쇠
int play = 1; //실행 여부
switch (mapcode) {
case 0: memcpy(temp_map, map1, sizeof(temp_map)); break; //temp_map에 map1을 복사
case 1: memcpy(temp_map, map2, sizeof(temp_map)); break; //temp_map에 map2를 복사
case 2: memcpy(temp_map, map3, sizeof(temp_map)); //temp_map에 map3를 복사
}
map_print(&x,&y); //map프린트
while (play) {//일단은 1롤 초기화 종료될경우 0
drawUI(&x, &y, &k); //UI로 현재 좌표랑 열쇠 갯수를 프린트
switch (keycontrol()) {
case UP: move(&x, &y, 0, -1, &k, &play);
break;
case DOWN: move(&x, &y, 0, 1, &k, &play);
break;
case RIGHT:move(&x, &y, 1, 0, &k, &play);
break;
case LEFT: move(&x, &y, -1, 0, &k, &play);
break;
}
}
clear();
}
void move(int* x, int* y, int move_x, int move_y,int* k,int* play) {// 플레이어 좌표2개 ,얼마나 이동하는지 2개,실행여부
char mapob = temp_map[*y + move_y][*x + move_x];
textcolor(white, black);
if(mapob=='0'||mapob=='2'){
gotoxy(*x, *y); printf(" ");
textcolor(lightgreen, black);
gotoxy(*x + move_x, *y + move_y); printf("@");
*x += move_x;
*y += move_y;
}
if (mapob == 'k') {
*k += 1;
temp_map[*y + move_y][*x + move_x] = '0';
gotoxy(*x + move_x, *y + move_y);
printf(" ");
}
if (mapob == 'l') {
if (*k > 0) {
*k -= 1;
temp_map[*y + move_y][*x + move_x] = '0';
gotoxy(*x + move_x, *y + move_y);
printf(" ");
}
}
if (mapob == '3') {
*play = 0;
}
}
void drawUI(int* x, int* y,int*k) {
textcolor(white, black);
gotoxy(3, 17); printf("위치 : %02d, %02d", *x, *y);
textcolor(yellow, black);
gotoxy(20, 17); printf("열쇠 : %d개", *k);
}
void clear() {
char* name = (char*)malloc(sizeof(char) * 40);//이름 입력
char* date = (char*)malloc(sizeof(char) * 50);//현재 시간
time_t t = time(NULL);
struct tm ti = *localtime(&t);
FILE *User_name = NULL;
system("cls");
gotoxy(22, 5); printf("게임 클리어!!");
Sleep(2000);
gotoxy(20, 7); printf("이름을 입력하세요\n");
gotoxy(23, 8); scanf("%100[^\n]s",name);
gotoxy(20, 10);printf("재시작 합니다!!");
Sleep(1500);
User_name = fopen("User.txt", "w");
sprintf(date, "\n날짜 : %d-%d-%d %d:%d:%d", ti.tm_year + 1900, ti.tm_mon + 1, ti.tm_mday, ti.tm_hour, ti.tm_min, ti.tm_sec);
fprintf(User_name, name);
fprintf(User_name, date);
fclose(User_name);
free(name);
free(date);
}
int main(){
while (1) {
CursorView(show);
title_draw();
menu();
int listcode = list(n);
system("cls");
switch (listcode) {
case 0:gloop(0); break;
case 1:gloop(1); break;
case 2:gloop(2); break;
case 3: return 0;
}
a.list_y = 15;
}
}
4. 실행화면
게임을 시작하였을때 첫 화면으로 게임방법과 시작을 할 수 있다.
게임을 시작하면 난이도 와 종료를 선택할 수 있다.
난이도 "보통(2)"를 선택했을때의 화면이다. 진로를 방해하는 문(*)이 있고 그곳을 지나가기위해 필요한 열쇠(^)가
있다.
열쇠를 먹어서 밑에 열쇠갯수가 1개가된석을 확인할 수 있다.
문을 열기위하여 열쇠를 사용하였고 그로인하여 밑에 열쇠 갯수가 1개에서 0개가 된것을 확인할 수 있다.
도착지에 도달하면 이처럼 클리어 문구가 나오고 이름을 입력할 수 있다.
메모장에 입력한 이름과 저장한시기를 확인할 수 있다.
'report' 카테고리의 다른 글
git 보고서 (0) | 2019.06.11 |
---|---|
리눅스 보고서 (0) | 2019.05.27 |
동적할당과 메모리구조 보고서 (0) | 2019.04.17 |
포인터 보고서 (0) | 2019.04.08 |
함수 보고서 (0) | 2019.04.08 |