2012. 7. 13. 14:45

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

#define MAX 4
#define UP 72
#define DOWN 80
#define RIGHT 77
#define LEFT 75
#define ESC 27
#define SWAP(x,y,t) ((t)=(x),(x)=(y),(y)=(t))


void check_bingo(int puzzle[][MAX]) {
        int cnt;
        if(puzzle[0][0]==0) {
                cnt=0;
                for(int i=0;i<MAX;i++) {
                        for(int j=0;j<MAX;j++) {
                                if(puzzle[i][j]==cnt)
                                        cnt++;
                        }
                }
        }
        else {
                cnt=1;
                for(int i=0;i<MAX;i++) {
                        for(int j=0;j<MAX;j++) {
                                if(puzzle[i][j]==cnt)
                                        cnt++;
                        }
                }
        }
        if(cnt==MAX*MAX) {
                printf("\n축하 성공");
        }
}

void find_zero(int puzzle[][MAX],int *x,int *y) {
        int i,j;
        for( i = 0; i < MAX; i++ ) {
                for( j = 0; j < MAX; j++) {
                        if(puzzle[i][j]==0) {
                                *x = i;
                                *y = j;                                
                        }
                }
        }
}

void show_puzzle(int puzzle[][MAX]) {
        system("cls");
        for(int i=0;i<MAX;i++) {
                for(int j=0;j<MAX;j++) {
                        printf("\t%d\t",puzzle[i][j]);
                        if(j==MAX-1) printf("\n\n\n");
                }
        }
}

int check_same_num(int puzzle[][MAX],int num) {
        for(int i=0;i<MAX;i++) {
                for(int j=0; j<MAX;j++) {
                        if(puzzle[i][j]==num) return 0;
                }
        }
        return 1;
}

void set_puzzle(int puzzle[][MAX]) { //랜덤하게 퍼즐을 구성
        int num,p;
        for(int i=0;i<MAX;i++) {
                for(int j=0;j<MAX;j++) {
                        num=((unsigned int)time(NULL)*rand())%(MAX*MAX);
                        p=check_same_num(puzzle,num);
                        if(p==1) {//같은수 체크
                                puzzle[i][j]=num;
                        }
                        else j--;
                }
        }
}

void start_puzzle(int puzzle[][MAX]) {
        int x,y; //0의 위치
        int ch;
        int tmp;
        set_puzzle(puzzle);
        show_puzzle(puzzle);
        find_zero(puzzle,&x,&y);
        while(1) {
                printf("0을 기준으로 움지이시오(종료ESC)");
                ch=getch();
                if(ch==ESC) break;
                switch(ch) {
                case LEFT :        //왼쪽이동
                        if(y-1<0) break;
                        SWAP(puzzle[x][y-1],puzzle[x][y],tmp);
                        y=y-1;
                        break;
                case RIGHT : //오른쪽이동
                        if(y+1>=MAX) break;
                        SWAP(puzzle[x][y+1],puzzle[x][y],tmp);
                        y=y+1;
                        break;
                case UP : //위로 이동
                        if(x-1<0) break;
                        SWAP(puzzle[x-1][y],puzzle[x][y],tmp);
                        x=x-1;
                        break;
                case DOWN : //아래로 이동
                        if(x+1>=MAX) break;
                        SWAP(puzzle[x+1][y],puzzle[x][y],tmp);
                        x=x+1;
                        break;
                }
                check_bingo(puzzle);//다 맞추어쓴지 검사
                show_puzzle(puzzle);
        }
}

int main() {
        int puzzle[MAX][MAX];
        char ch;
        while(1) {
                start_puzzle(puzzle);
                printf("\n계속 할 까요?(Y or N)");
                ch=getch();
                if(ch=='N' || ch=='n') break;
        }
        return 0;
}

Posted by 몰라욧