기타 강좌

//함수의 선언부입니다 앞의 함수가 뒤의 함수를 호출하거나 선언부가 없으면 이리저리 꼬여서 잘 동작안해요~
void gotoxy(int x, int y);
void FileToArray(char * filename, int map[][45]);
void ArrayToScreen(int map[][45]);
void input(int map[][45]);
POINT getheroxy(int map[][45]);
int heroUp(int map[][45]);
int heroDown(int map[][45]);
int heroRight(int map[][45]);
int heroLeft(int map[][45]);
void move(int map[][45],POINT src,int direction);
int clear(int map[][45]);

//콘솔 커서의 좌표를 옮기는 함수입니다. 그냥 그렇구나 하고 외워서 씁니당
void gotoxy(int x, int y)
{
COORD Cur;
Cur.X=x;
Cur.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Cur);
}

//파일읽어서 배열에 넣기
//선행학습 : 2차원 배열을 인수로 전달
// 파일 입출력 함수
// 무한루프와 무한루프 푸는 방법
// 문자와 문자열의 차이

void FileToArray(char * filename, int map[][45])
{
FILE * fp;
int ch,x,y;
fp = fopen(filename,"rt");

x=0,y=0;
while(1){
if((ch = fgetc(fp))!=EOF)
{
if(ch != '\n')
{
map[y][x]=ch;
x++;
}else if(ch =='\n')
{
map[y][x]=EndOfLine;
y++;
x=0;
}
}else if(ch == EOF)
{
map[y][x]=EndOfArray;
break;
}
}
}

//배열읽어서 화면에 출력
//선행학습 : 2차원 배열 인수로 받기
// 문자열과 문자의 차이알기
// switch문 알기
void ArrayToScreen(int map[][45])
{
int x,y;
x=0,y=0;
gotoxy(0,0);
while(1)
{
if(map[y][x]==EndOfLine)
{
y++;
x=0;
   putc('\n',stdout);
}else if(map[y][x]==EndOfArray)
{
break;
}
else
{
switch(map[y][x])
{
case hero_over_air: printf("★"); break;
case stone_over_air: printf("●"); break;
case wall_over_air: printf("■"); break;
case stone_over_holl: printf("●"); break;
case hero_over_holl: printf("★"); break;
case air: printf(" "); break;
case holl: printf("◎"); break;
}

x++;
}
}
}
//입력받아서 적절한 함수 실행
//선행학습 : GetAsyncKeyState사용법
// static 변수와 printf는 디버깅용으로 써놨음 몰라도됨;
void input(int map[][45])
{
static int a=0;
printf("\n  %d  \r",a++);
if(GetAsyncKeyState(VK_LEFT))
heroLeft(map);
if(GetAsyncKeyState(VK_RIGHT))
heroRight(map);
if(GetAsyncKeyState(VK_UP))
heroUp(map);
if(GetAsyncKeyState(VK_DOWN))
heroDown(map);
}

//주인공 찾아서 해당 좌표 리턴
//선행학습 : POINT구조체 사용법
// 2차원배열 인수로 받기
// 무한루프
// 무한루프 나가기

POINT getheroxy(int map [][45])
{
int x,y;
POINT p;
x=0;y=0;
while(1)
{
if(map[y][x]==EndOfLine)
{
x=0;
y++;
}
if(map[y][x]==hero_over_air || map[y][x]==hero_over_holl)
{
p.x=x;
p.y=y;
return p;
}
if(map[y][x]==EndOfArray)
{
break;
}
x++;
}
printf("error: found no hero");
p.x=0;
p.y=0;
return p;
}
//주인공을 위로 아래로 왼쪽으로 오른쪽으로 움직이기 전 움직일수있나 보고 움직이는함수부르기
int heroUp(int map[][45])
{
POINT xy = getheroxy(map);
if(map[xy.y-1][xy.x]==air || map[xy.y-1][xy.x]==holl)
{
move(map,xy,direction_up);
return 1;//성공
}
if(map[xy.y-1][xy.x]==stone_over_air || map[xy.y-1][xy.x]==stone_over_holl)
{
if(map[xy.y-2][xy.x]==air || map[xy.y-2][xy.x]==holl)
{
xy.y--;
move(map,xy,direction_up);
xy.y++;

move(map,xy,direction_up);
return 1;//성공
}
}
return 0;//실패
}
int heroDown(int map[][45])
{
POINT xy = getheroxy(map);
if(map[xy.y+1][xy.x]==air || map[xy.y+1][xy.x]==holl)
{
move(map,xy,direction_down);
return 1;//성공
}
if(map[xy.y+1][xy.x]==stone_over_air || map[xy.y+1][xy.x]==stone_over_holl)
{
if(map[xy.y+2][xy.x]==air || map[xy.y+2][xy.x]==holl)
{
xy.y++;
move(map,xy,direction_down);
xy.y--;

move(map,xy,direction_down);
return 1;//성공
}
}
return 0;//실패
}

int heroLeft(int map[][45])
{
POINT xy = getheroxy(map);
if(map[xy.y][xy.x-1]==air || map[xy.y][xy.x-1]==holl)
{
move(map,xy,direction_left);
return 1;//성공
}
if(map[xy.y][xy.x-1]==stone_over_air || map[xy.y][xy.x-1]==stone_over_holl)
{
if(map[xy.y][xy.x-2]==air || map[xy.y][xy.x-2]==holl)
{
xy.x--;
move(map,xy,direction_left);
xy.x++;
move(map,xy,direction_left);
return 1;//성공
}
}
return 0;//실패
}
int heroRight(int map[][45])
{
POINT xy = getheroxy(map);
if(map[xy.y][xy.x+1]==air || map[xy.y][xy.x+1]==holl)
{
move(map,xy,direction_right);
return 1;//성공
}
if(map[xy.y][xy.x+1]==stone_over_air || map[xy.y][xy.x+1]==stone_over_holl)
{
if(map[xy.y][xy.x+2]==air || map[xy.y][xy.x+2]==holl)
{
xy.x++;
move(map,xy,direction_right);
xy.x--;
move(map,xy,direction_right);
return 1;//성공
}
}
return 0;//실패
}





//돌이나 주인공 움직이기
//선행학습 : switch문
// 매크로(#define)
//
void move(int map[][45],POINT tomove,int direction)//움직일 목표칸이 비어있을때에만 호출
{
switch(direction)
{
case direction_up:
if(map[tomove.y][tomove.x]== stone_over_air)
{

map[tomove.y][tomove.x]=air;
if(map[tomove.y-1][tomove.x]==air)
map[tomove.y-1][tomove.x]=stone_over_air;
if(map[tomove.y-1][tomove.x]==holl)
map[tomove.y-1][tomove.x]=stone_over_holl;
}else if(map[tomove.y][tomove.x]== hero_over_air)
{
map[tomove.y][tomove.x]=air;
if(map[tomove.y-1][tomove.x]==air)
map[tomove.y-1][tomove.x]=hero_over_air;
if(map[tomove.y-1][tomove.x]==holl)
map[tomove.y-1][tomove.x]=hero_over_holl;
}
//
if(map[tomove.y][tomove.x]== stone_over_holl)
{

map[tomove.y][tomove.x]=holl;
if(map[tomove.y-1][tomove.x]==air)
map[tomove.y-1][tomove.x]=stone_over_air;
if(map[tomove.y-1][tomove.x]==holl)
map[tomove.y-1][tomove.x]=stone_over_holl;
}else if(map[tomove.y][tomove.x]== hero_over_holl)
{
map[tomove.y][tomove.x]=holl;
if(map[tomove.y-1][tomove.x]==air)
map[tomove.y-1][tomove.x]=hero_over_air;
if(map[tomove.y-1][tomove.x]==holl)
map[tomove.y-1][tomove.x]=hero_over_holl;
}
//
break;

case direction_down:
if(map[tomove.y][tomove.x]== stone_over_air)
{

map[tomove.y][tomove.x]=air;
if(map[tomove.y+1][tomove.x]==air)
map[tomove.y+1][tomove.x]=stone_over_air;
if(map[tomove.y+1][tomove.x]==holl)
map[tomove.y+1][tomove.x]=stone_over_holl;
}else if(map[tomove.y][tomove.x]== hero_over_air)
{
map[tomove.y][tomove.x]=air;
if(map[tomove.y+1][tomove.x]==air)
map[tomove.y+1][tomove.x]=hero_over_air;
if(map[tomove.y+1][tomove.x]==holl)
map[tomove.y+1][tomove.x]=hero_over_holl;
}
//
if(map[tomove.y][tomove.x]== stone_over_holl)
{

map[tomove.y][tomove.x]=holl;
if(map[tomove.y+1][tomove.x]==air)
map[tomove.y+1][tomove.x]=stone_over_air;
if(map[tomove.y+1][tomove.x]==holl)
map[tomove.y+1][tomove.x]=stone_over_holl;
}else if(map[tomove.y][tomove.x]== hero_over_holl)
{
map[tomove.y][tomove.x]=holl;
if(map[tomove.y+1][tomove.x]==air)
map[tomove.y+1][tomove.x]=hero_over_air;
if(map[tomove.y+1][tomove.x]==holl)
map[tomove.y+1][tomove.x]=hero_over_holl;
}
//
break;

case direction_left:
if(map[tomove.y][tomove.x]== stone_over_air)
{

map[tomove.y][tomove.x]=air;
if(map[tomove.y][tomove.x-1]==air)
map[tomove.y][tomove.x-1]=stone_over_air;
if(map[tomove.y][tomove.x-1]==holl)
map[tomove.y][tomove.x-1]=stone_over_holl;
}else if(map[tomove.y][tomove.x]== hero_over_air)
{
map[tomove.y][tomove.x]=air;
if(map[tomove.y][tomove.x-1]==air)
map[tomove.y][tomove.x-1]=hero_over_air;
if(map[tomove.y][tomove.x-1]==holl)
map[tomove.y][tomove.x-1]=hero_over_holl;
}
//
if(map[tomove.y][tomove.x]== stone_over_holl)
{

map[tomove.y][tomove.x]=holl;
if(map[tomove.y][tomove.x-1]==air)
map[tomove.y][tomove.x-1]=stone_over_air;
if(map[tomove.y][tomove.x-1]==holl)
map[tomove.y][tomove.x-1]=stone_over_holl;
}else if(map[tomove.y][tomove.x]== hero_over_holl)
{
map[tomove.y][tomove.x]=holl;
if(map[tomove.y][tomove.x-1]==air)
map[tomove.y][tomove.x-1]=hero_over_air;
if(map[tomove.y][tomove.x-1]==holl)
map[tomove.y][tomove.x-1]=hero_over_holl;
}
//
break;

case direction_right:
if(map[tomove.y][tomove.x]== stone_over_air)
{

map[tomove.y][tomove.x]=air;
if(map[tomove.y][tomove.x+1]==air)
map[tomove.y][tomove.x+1]=stone_over_air;
if(map[tomove.y][tomove.x+1]==holl)
map[tomove.y][tomove.x+1]=stone_over_holl;
}else if(map[tomove.y][tomove.x]== hero_over_air)
{
map[tomove.y][tomove.x]=air;
if(map[tomove.y][tomove.x+1]==air)
map[tomove.y][tomove.x+1]=hero_over_air;
if(map[tomove.y][tomove.x+1]==holl)
map[tomove.y][tomove.x+1]=hero_over_holl;
}
//
if(map[tomove.y][tomove.x]== stone_over_holl)
{

map[tomove.y][tomove.x]=holl;
if(map[tomove.y][tomove.x+1]==air)
map[tomove.y][tomove.x+1]=stone_over_air;
if(map[tomove.y][tomove.x+1]==holl)
map[tomove.y][tomove.x+1]=stone_over_holl;
}else if(map[tomove.y][tomove.x]== hero_over_holl)
{
map[tomove.y][tomove.x]=holl;
if(map[tomove.y][tomove.x+1]==air)
map[tomove.y][tomove.x+1]=hero_over_air;
if(map[tomove.y][tomove.x+1]==holl)
map[tomove.y][tomove.x+1]=hero_over_holl;
}
//
break;

}
}

int clear(int map[][45])
{
int x,y;
x=0;y=0;
while(1)
{
if(map[y][x]==EndOfLine)
{
y++;
x=0;
}
if(map[y][x]==EndOfArray)
{
return 1;//clear
}
if(map[y][x]==hero_over_holl || map[y][x]==holl)
{
return 0;//clear false
}
x++;
}
return -1;//can't reach
}

Who's 정체불명

profile

두팔과 의지가 있는데 무엇을 못 하겠는가!

< http://mpnp.tistory.com >


List of Articles
분류 제목 글쓴이 날짜 조회 수
Vegas Pro 베가스 강좌 목록 아방스 2017.09.28 886
파이널컷X 파컷 강좌 목록 아방스 2017.06.18 757
C언어 c언어로 구구단 프로그래밍 하는 영상 1 정체불명 2014.11.02 740
C언어 C# 병렬처리! 스레드 사용하기 1 file 꿈달 2012.11.08 4129
C언어 소코반 실행파일+소스+스크린샷 file 정체불명 2012.01.25 3520
C언어 func.h함수소개 정체불명 2012.01.25 2357
C언어 푸쉬푸쉬 func.h파일 file 정체불명 2012.01.25 2868
C언어 푸쉬푸쉬 data structure.h 의 내용 file 정체불명 2012.01.25 2596
C언어 소코반 리팩토링 푸쉬푸쉬 file 정체불명 2012.01.25 2573
C언어 소코반(푸쉬푸쉬) 구조 정체불명 2012.01.21 2858
C언어 파일읽어서 배열에 넣고 다시배열에서 읽어서 화면에 출력 정체불명 2012.01.21 2701
C언어 소코반 따라만들기 준비 파일읽어배열에담기 정체불명 2012.01.21 2990
C언어 소코반 따라하기 준비 1 파일에서 읽어와서 출력 정체불명 2012.01.21 2856
C언어 한글자씩 출력하기 file 정체불명 2012.01.21 3729
C언어 사각형 테두리 그리기를 연습해봐요 3 file 정체불명 2012.01.21 5701
C언어 같은 그림맞추기 오타정정과 약간 수정한 최종 버전입니다. 3 file 정체불명 2012.01.19 2917
C언어 같은 그림맞추기 구현 체크와 엔딩 정체불명 2012.01.19 2251
C언어 같은 그림 맞추기 구현 - 출력,입력 정체불명 2012.01.19 2171
C언어 같은그림찾기 구현 2 초기화 정체불명 2012.01.19 2405
C언어 같은 그림 찾기를 구현 1 정체불명 2012.01.19 2604
C언어 c언어로 같은그림 찾기 만들기 -기획편 1 정체불명 2012.01.18 2707
C언어 정체불명의 프로그래밍 입문 중간체크 file 정체불명 2012.01.18 1611
Board Pagination Prev 1 2 3 4 5 Next
/ 5