2012. 7. 13. 14:44

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

#define MAX 5
#define ESC 27

void start_metrix();
void restart_end_metrix();
void exit_function(char metrix[][MAX]);
void user_end(char metrix[][MAX]);

void sleep(int nbr_seconds) {
        clock_t goal;
        goal = (nbr_seconds*CLOCKS_PER_SEC) + clock();
        while(goal>clock()){;}
}

void sleep_computer() {
        for(int p=0;p<1;p++) {
                printf("\nComputer Thinking >");
                sleep((int)1);
        }
}

void user_end(char metrix[][MAX]) {//user가 끝나는 경우를 조사
        int i,j;
        int cnt=0;
        for(i=0;i<MAX;i++) {
                for(j=0;j<MAX;j++) {
                        if(metrix[i][j]=='O') {
                                cnt++; //가로로 conut
                        }
                        if(cnt==MAX) {
                                printf("\nUser1 win");
                                restart_end_metrix();
                        }
                }
                cnt=0;
        }
        
        cnt=0;
        for(j=0;j<MAX;j++) {
                for(i=0;i<MAX;i++) {
                        if(metrix[i][j]=='O') {
                                cnt++; //세로로 conut
                        }
                        if(cnt==MAX) {
                                printf("\nUser2 win");
                                restart_end_metrix();
                        }
                }
                cnt=0;
        }

        cnt=0;
        for(i=0 ;i<MAX;i++) {
                for(j=0;j<MAX;j++) {
                        if(i==j) {
                                if(metrix[i][j]=='O') cnt++; {//오른족 대각선 count
                                        if(cnt==MAX) {
                                                printf("\nUser3 win");
                                                restart_end_metrix();
                                        }
                                }
                        }
                }
        }

        i=0;
        j=MAX-1;
        cnt=0;

        while(i!=MAX && j!=-1) {
                if(metrix[i][j]=='O') cnt++; {//왼쪽 대각선 count
                        if(cnt==MAX) {
                                printf("\nUser4 win");
                                restart_end_metrix();
                        }
                }
                i++;
                j--;
        }

}


void display_metrix(char metrix[][MAX]) {
        system("cls");
        for (int i=0;i<MAX;i++) {
                for(int j=0;j<MAX;j++) {
                        printf("\t%c",metrix[i][j]);
                        if(j==(MAX-1)) printf("\n");
                }
        }
        exit_function(metrix);
        user_end(metrix);
}

void bingo_com_leftline(char metrix[][MAX]) {//컴퓨터가 빙고 하기 위해 왼쪽대각선 조사
        int i=0,j=MAX-1,cnt=0;  
        while(i!=MAX && j!=-1) {
                if(metrix[i][j]=='X') cnt++; {//왼쪽 대각선 count
                        if(cnt==MAX-1) {
                                i=0;//
                                j=MAX-1;
                                while(i!=MAX && j!=-1) {
                                        if(metrix[i][j]=='-') {
                                                metrix[i][j]='X';
                                                display_metrix(metrix);
                                                printf("\n\t Computer Win");
                                                restart_end_metrix(); //빙고
                                        }
                                i++;
                                j--;
                                }
                        }
                        
                }
                i++;
                j--;
        }
}

void bingo_com_rightline(char metrix[][MAX]) {
        int i=0,j=0,cnt=0;
        for(i=0 ;i<MAX;i++) {
                for(j=0;j<MAX;j++) {
                        if(i==j) {
                                if(metrix[i][j]=='X') cnt++; {//오른족 대각선 count
                                        if(cnt==MAX-1) {
                                                for(i=0;i<MAX;i++) {
                                                        for(j=0;j<MAX;j++) {
                                                                if(i==j) {
                                                                        //while(j!=MAX && i!=MAX) { //빈곳을 찾아서 찍음
                                                                        if(metrix[i][j]=='-') {
                                                                                metrix[i][j]='X';
                                                                                display_metrix(metrix);
                                                                                printf("\n\t Computer Win");
                                                                                restart_end_metrix(); //빙고
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
}

void bingo_com_length(char metrix[][MAX]) { //세로조사
        int i,j,k;
        int cnt=0;
        for(j=0;j<MAX;j++) {
                for(i=0;i<MAX;i++) {
                        if(metrix[i][j]=='X') cnt++; //세로로 conut
                        if(cnt==MAX-1) {
                                for(k=0;k<MAX;k++) { //
                                        if (metrix[k][j]=='-') {//Computer가 빙고가 가능하면
                                                metrix[k][j]='X';
                                                display_metrix(metrix);
                                                printf("\n%d %d %d",i,j,k);
                                                printf("\n\t Computer Win");
                                                restart_end_metrix(); //빙고
                                        }
                                }
                        }
                        if(i==MAX-1) cnt=0; //한줄을 다 찾으면
                }
        }
}

void bingo_com_width(char metrix[][MAX]) {
        int i,j,k;
        int cnt=0;
        for(i=0;i<MAX;i++) {
                for(j=0;j<MAX;j++) {
                        if(metrix[i][j]=='X') cnt++; //가로로 conut
                        if(cnt==MAX-1) {
                                for(k=0;k<MAX;k++) {
                                        if (metrix[i][k]=='-') {//Computer가 빙고가 가능하면
                                                metrix[i][k]='X';
                                                display_metrix(metrix);
                                                printf("\n\t Computer Win");
                                                restart_end_metrix(); //빙고
                                        }
                                }
                        }
                        if(j==MAX-1) cnt=0; //한줄을 다 찾으면
                }
        }
}

int select_computer(char metrix[][MAX]) {
        static int cnt=0;
        int x,y;
        if(metrix[MAX/2][MAX/2]=='-') { //중간지점이 비었는으면 먼저 선점
                metrix[MAX/2][MAX/2]='X';
        }
        else {
                bingo_com_width(metrix);
                bingo_com_length(metrix);
                bingo_com_rightline(metrix);
                bingo_com_leftline(metrix);
                for (int i=0;i<10;i++) {
                        for(int j=0;j<MAX;j++) {//랜덤으로 찍어줌
                                x=(unsigned int)time(NULL)*rand()%MAX;
                                y=(unsigned int)time(NULL)*rand()%MAX;
                                }
                        if(metrix[x][y]=='-') {
                                metrix[x][y]='X';
                                break;
                        }
                }
        }
        return cnt++;
}

void select_person(char metrix[][MAX]) {
        int count=0;
        int x,y;
        printf("\n행의 값을 입력하시오(0~%d) ",MAX-1);
        scanf("%d",&x);
        printf("\n열의 값을 입력하시오(0~%d) ",MAX-1);
        scanf("%d",&y);
        
        if(metrix[x][y]!='-') {
                printf("\n다시 입력하시오");
                select_person(metrix);
        }
        else {
                metrix[x][y]='O';
        }
}


void first_computer(char metrix[][MAX]) {
        for(int i=0;i<MAX*MAX/2+1;i++) {
                sleep_computer();
                select_computer(metrix); //컴퓨터가 찍음
                display_metrix(metrix);
                select_person(metrix); //사람이 찍음
                display_metrix(metrix);
        }
}

void first_person(char metrix[][MAX]) {
        for(int i=0;i<MAX*MAX/2+1;i++) {
                select_person(metrix); //사람이 찍음
                display_metrix(metrix);
                sleep_computer();
                select_computer(metrix); //컴퓨터가 찍음
                display_metrix(metrix);
        }
}

void inital(char metrix[][MAX]) {
        for (int i=0;i<MAX;i++) {
                for(int j=0;j<MAX;j++) {
                        metrix[i][j]='-';
                }
        }
}

void exit_function(char metrix[][MAX]) {
        int count=0;
        char ch;
        for (int i=0;i<MAX;i++) {
                for(int j=0;j<MAX;j++) {
                        if (metrix[i][j]=='O' || metrix[i][j]=='X') {
                                count = count + 1;
                        }
                        if (count==MAX*MAX-1) {
                                printf("\n계속하시겠습니까?(y or n or ESC(종료))");
                                ch=getch();
                                if (ch=='N' || ch=='n') exit(1);
                                else if (ch==ESC) exit(1);
                                else start_metrix();
                        }

                }
        }

}
void start_metrix() {
        char metrix[MAX][MAX];
        int com;
        int per;
        char ch;
        while(1) {
                inital(metrix);
                com=((unsigned int)time(NULL)*rand())%2;
                printf("\n(0 또는 1의 임의의 수를 입력하시오)");
                scanf("%d",&per);
                if (com==per) {
                        printf("\n먼저 공격하시오");
                        first_person(metrix);
                        printf("\n계속하시겠습니까?(y or n or ESC(종료))");
                        ch=getch();
                        if (ch=='N' || ch=='n') break;
                        else if (ch==ESC) exit(1);
                        else ;
                }
                else {
                        printf("\nComputer 먼저 공격합니다");
                        first_computer(metrix);
                        printf("\n계속하시겠습니까?(y or n or ESC(종료))");
                        ch=getch();
                        if (ch=='N' || ch=='n') break;
                        else if (ch==ESC) exit(1);
                        else ;
                }
        }
}

void restart_end_metrix() {
        char ch;
        printf("\n계속하시겠습니까?(y or n or ESC(종료))");
        ch=getch();
        if (ch=='N' || ch=='n') exit(1);
        else if (ch==ESC) exit(1);
        else start_metrix();
}

int main() {
        start_metrix();
        return 0;
}

Posted by 몰라욧