3년전 대학교 1학년때, printf 와 scanf, gotoxy, int x 정도의 매우 기초적인 수준을 배우고 간단한 게임을 만들어오라고 과제를 내주셨습니다..(ㅂㄷㅂㄷ)
대부분 친구들이 선배들꺼 완성본 받아서 코드 짜집기하고 지우고 수정해서 조잡하게 만든다음에 냈는데,
저는 제가 만들고 싶었던 게임이 있었던지라 직접 만들었었습니다.
제가 구상한 게임은 사다리게임에서 시작됐는데, 사다리게임+팩맨? 이라고 생각하시면 됩니다.
처음 구상한 내용이, 사다리가 랜덤으로 그려진 뒤 위쪽에서 적이 일정 시간마다 사다리를 타고 내려옵니다.
그럼 저는 그걸 피해서 맨 윗쪽까지 도달하면 승리하는 게임입니다.
일단 기초중에 기초만 배웠던 터라 srand? 랜덤값 얻는 함수도 네이버 검색해서 수십번 시행착오 거쳐서 적용했었구요
적과의 충돌시 패배나 맵에따라 움직일수 있게 하기위해서 맵 전체 좌표를 다 지정해놨고, 사다리 ─,│,┤,├ 네가지 구성요소로 그렸는데 또 이부분에서 사다리 밖으로는 못움직이게, 좌측사다리에선 좌측으로 움직일 수있게 등등의 조건을 구현하면서 굉장히 많은 시행착오를 일일이 겪어가면서 만들었던 기억이 있네요.
문제는, 이제 군제대 후 복학해야하는 제가.. 우연히 프로그래밍 파일을 발견했는데, 최종 완성본인지도 모르겠는건 둘째치고
찬찬히 훑어봐도 쬐끔이나마 알던것도 다까먹고 백지가되서 도저히 이해가 안갑니다.. 제가쓴건데..
그래서 부탁드립니다.
제가 3년전 짰던 코딩을 봐주시고, 대충 어떤 구성인지, 어딜 어떻게 고치는것이 좋은지(사실 끝까지 만들어보고 싶습니다..) 조언 부탁드려요.
보시면 눈이 아프실만큼 굉장히 조잡하고, 또 짧게 쓸수 있는걸 쓸데없이 기이이이일게 써놓은곳도 많습니다.
제 기억으로는 아마 짧게 쓰기위해 반복문을 썼더니 어디선가 오류가 났는데, 해결을 못해서 그냥 일일이 길게 집어넣었던걸로 기억합니다.
적도 최대 4마리까지 구현하고싶었는데 적1을 구현했으니 2를해볼까 해서 똑같은걸 추가로 하나 더 집어넣었는데, 오류가 펑펑터져서 구현 못한걸로 기억합니다..ㄷㄷ...
아무튼간에, 다시한번 말씀드리지만, 전문적으로 프로그래밍을 배우신 분들께는 정말 눈이 썩을만큼의 발코딩도아닌 발톱때만도 못한 코딩입니다.
대학교 1학년 반년배운 새내기의 코딩이라 생각하시고 너그러운 마음으로 봐주세요 ㅠㅠ
코딩은 꼬릿로 올리겠습니다.
#include <windows.h> //Sleep(),gotoxy()함수에서 사용하는 자료형와 함수 
#include <stdio.h> 
#include <stdlib.h> //exit()
#include <conio.h> //getch()
#include<time.h>
// 기본값 가로 80, 세로 25
void moveX(int q); // 가로이동함수. 2칸씩 움직임
void moveY(int q); // 세로이동함수. 맨 윗칸에 도착하면 승리 
void BuildRail(); // 사다리 그리는 함수
void victory(); // 승리
void fail(); // 패배패
void e1(); // 적1 생성함수
//void e2(); // 적2 생성함수
void moveE1(); // 적1 이동함수
void moveE2(); // 적2 이동함수
void moveE1Left();
void moveE1Right();
//void e1Delete(); // 적1 제거함수
//void e2Delete(); // 적2 제거함수
void gotoxy(int x, int y)//(x,y)좌표로 커서를 이동
{  
COORD pos={x-1,y-1};  //콘솔 화면의 원점은 (0,0)  
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
int x, y, _x1, _y1, _x2, _y2;
int map[66][25]; // 배경 = 0 , 세로선 = 1, 오른쪽이동가능선 = 2, 왼쪽이동가능선 = 3 , 가로이동중선 = 4, 이동시작선 = 5, 적군 = 6
int flag, e1flag, e2flag;
int main(void)
{
BuildRail();
char key; 
x=33, y=23;
gotoxy(x,y); puts("○");
int i=0;
while(1)
{
if(i==0)
{
e1();
i++;
}
// e2();
if (kbhit())
{
fflush(stdin);
key=getch();        //문자저장 후 반드시 엔터가 입력된다.
switch(key)
{
case 77:            //방향키 (->)
if(map[x][y] == 1 || map[x][y] == 3 )
{
break;
}
moveX(2);
if(map[x][y] == 6)
{
fail();
return 0;
}
break;
case 75: //방향키 (<-)
if(map[x][y] == 1 || map[x][y] == 2)
{
break;
}
moveX(-2);
if(map[x][y] == 6)
{
fail();
return 0;
}
break;
case 72:            //방향키(↑)
if(map[x][y] == 4)
{
break;
}else if(map[x][y] == 6)
{
fail();
return 0;
}
moveY(-1);
if(y == 1)
{
victory();
return 0;
}
else if(map[x][y] == 6)
{
fail();
return 0;
}
break;
case 80:            //방향키 (↓)
if(map[x][y] == 4)
{
break;
}else if(map[x][y] == 6)
{
fail();
return 0;
}
moveY(1);
if(map[x][y] == 6)
{
fail();
return 0;
}
break;
case 27:            //Esc키 누르면 프로그램 종료 
gotoxy(25,24);
printf("- 게임이 끝났습니다 -\n");
_getch();
exit(0);
break;
default:            
break;
}//switch
}//if
moveE1();
//moveE2();
}//while()
     return 0;
 } 
void moveX(int q)//키보드 입력에 따라 커서 움직임(+1,-1 : 옆으로)
{
if(map[x][y] == 1)
{
gotoxy(x,y);
printf("┃");
}else if(map[x][y] == 2)
{
gotoxy(x,y);
printf("┣");
}else if(map[x][y] == 3)
{
gotoxy(x,y);
printf("┫");
}else if(map[x][y] == 4)
{
gotoxy(x,y);
printf("━");
}
gotoxy(x=x+(q),y);
  
if(x==66) 
x=65;       //1-75 사이의 값만 받음
if(x==0) 
x=1;
gotoxy(x,y);
printf("○");
}
void moveY(int q)//키보드 입력에 따라 커서 움직임(+1,-1 : 아래,위로)
{
if(map[x][y] == 1)
{
gotoxy(x,y);
printf("┃");
}else if(map[x][y] == 2)
{
gotoxy(x,y);
printf("┣");
}else if(map[x][y] == 3)
{
gotoxy(x,y);
printf("┫");
}
gotoxy(x,y=y+(q));   //이동하여 "○"그림
if(y==0)
y=1;       //1-27 사이의 값만 받음
if(y==24)
y=23;
gotoxy(x,y);
printf("○");
}
void BuildRail()
{
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
//사다리 생성
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
int num, i, j, a;   // 정수형 num, i,j,a 변수 선언
num = 5; // 사다리 갯수
 
//사다리 레일 그리기//
x = 1;
for(i=1; i<=num  i++)
{
for(y=1; y<24; y++)
{
gotoxy(x,y);
map[x][y] = 1;
printf("┃");
}
gotoxy(x,1);
printf(" %d",i);  //레일 번호 그리기
x = x + 16;
}
//가로줄긋기
srand((unsigned)time(NULL));
x=1;
while(x<=49)
{
for(j=0  j<5; j++)
{
y = (rand()%21)+3;
gotoxy(x,y);
if(map[x-6][y] == 4)
{
j--;
continue;
}
map[x][y] = 2;
map[x+16][y] = 3;
for(a = 2; a < 16; a++)
{
map[x+a][y] = 4;
}
printf("┣━━━━━━━┫"); //16 17
}
x = x + 16;
}
//가로줄긋기
//사다리 레일 그리기//
 //HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
//사다리 생성
 //HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
}
void victory()
{
gotoxy(25,24);
printf("- 게임에서 승리하셨습니다!! -\n");
_getch();
return;
}
void fail()
{
gotoxy(25,24);
printf("- 게임에서 패배하셨습니다.. -\n");
_getch();
return;
}
void e1()
{
int a;
//static int GCnt1;
//GCnt1++;
//if (GCnt1 < 140000) return; //생성속도 조절
//GCnt1 = 0;
srand((unsigned)time(NULL));
a = (rand()%5)+1;
_y1 = 2;
if(a == 1)
{
_x1 = 1;
gotoxy(_x1,_y1);
printf("※");
}else if(a == 2)
{
_x1 = 17;
gotoxy(_x1,_y1);
printf("※");
}else if(a == 3)
{
_x1 = 33;
gotoxy(_x1,_y1);
printf("※");
}else if(a == 4)
{
_x1 = 49;
gotoxy(_x1,_y1);
printf("※");
}else
{
_x1 = 65;
gotoxy(_x1,_y1);
printf("※");
}
map[_x1][_y1] = 6;
return;
}
//void e2()
//{
// int a;
// static int GCnt2;
//
// GCnt2++;
// if (GCnt2 < 180000) return; //생성속도 조절
// GCnt2 = 0;
//
// srand((unsigned)time(NULL));
// a = (rand()%5)+1;
// _y2 = 2;
//
// if(a == 1)
// {
// _x2 = 1;
// gotoxy(_x2,_y2);
// printf("▩");
// }else if(a == 2)
// {
// _x2 = 17;
// gotoxy(_x2,_y2);
// printf("▩");
// }else if(a == 3)
// {
// _x2 = 33;
// gotoxy(_x2,_y2);
// printf("▩");
// }else if(a == 4)
// {
// _x2 = 49;
// gotoxy(_x2,_y2);
// printf("▩");
// }else
// {
// _x2 = 65;
// gotoxy(_x2,_y2);
// printf("▩");
// }
// map[_x2][_y2] = 6;
// return;
//}
void moveE1()
{
int i;
static int MCnt1;
MCnt1++;
if (MCnt1 < 15000) return; //생성속도 조절
MCnt1 = 0;
_y1 = _y1 + 1;
if(map[_x1][_y1] == 1)
{
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1,_y1-1);
printf("┃");
map[_x1][_y1-1] = 1;
}else if(map[_x1][_y1] == 2)
{
moveE1Right();
}else if(map[_x1][_y1] == 3)
{
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1,_y1-1);
printf("┃");
map[_x1][_y1-1] = 1;
moveE1Left();
}
}
void moveE1Left()
{
_x1 = _x1 - 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1+2,_y1);
printf("┫");
map[_x1-2][_y1] = 3;
_x1 = _x1 - 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1+2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_x1 = _x1 - 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1+2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_x1 = _x1 - 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1+2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_x1 = _x1 - 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1+2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_x1 = _x1 - 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1+2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_x1 = _x1 - 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1+2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_x1 = _x1 - 2;
if(map[_x1][_y1+1] == 2)
{
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1+2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_y1++;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1,_y1-1);
printf("┣");
map[_x1][_y1-1] = 2;
moveE1Right();
}else if(map[_x1][_y1+1] == 3)
{
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1+2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_y1++;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1,_y1-1);
printf("┣");
map[_x1][_y1-1] = 2;
moveE1Left();
}
}
void moveE1Right()
{
_x1 = _x1 + 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1-2,_y1);
printf("┣");
map[_x1-2][_y1] = 2;
_x1 = _x1 + 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1-2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_x1 = _x1 + 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1-2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_x1 = _x1 + 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1-2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_x1 = _x1 + 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1-2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_x1 = _x1 + 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1-2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_x1 = _x1 + 2;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1-2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_x1 = _x1 + 2;
if(map[_x1][_y1+1] == 2)
{
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1-2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_y1++;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1,_y1-1);
printf("┣");
map[_x1][_y1-1] = 2;
moveE1Right();
}else if(map[_x1][_y1+1] == 3)
{
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1-2,_y1);
printf("━");
map[_x1-2][_y1] = 4;
_y1++;
gotoxy(_x1,_y1);
map[_x1][_y1] = 6;
printf("※");
gotoxy(_x1,_y1-1);
printf("┫");
map[_x1][_y1-1] = 2;
moveE1Right();
}
}
//배경 = 0 , 세로선 = 1, 오른쪽이동가능선 = 2, 왼쪽이동가능선 = 3 , 가로이동선 = 4, 이동시작부 = 5, 적군 = 6
====================================
여기까지입니다. 보시면 알겠지만 굉장히 조잡하고 쓸데없이 노가다로 만든 코딩입니다. 그래도 진짜 printf 수준만 배웠을때라, 나름 만들고도 꽤 흐뭇했던것 같네요..;
프로그래머 분들의 시력과 소중한 시간에 악영향을 준 점 굉장히 죄송합니다..ㅠㅠ