빙고게임

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

void bingo_rand(int (*ptr)[5]); // 빙고판 입력
void bingo_print(int (*ptr)[5], int user); // 빙고판 출력
void bingo_game(int (*ptr)[5], int (*ptr2)[5]); // 빙고 게임 시작
int bingo_check(int (*ptr)[5]); // 빙고 확인
void bingo_sign(int (*ptr)[5], int (*ptr2)[5], int user); // 빙고 숫자 체크
int bingo_win(int user, int bingo, int win); // 빙고 승자 판별


/*--메인------------------------------------------------------*/
void main()
{
    int user1[5][5], user2[5][5], menu, flag=0;
    char prt;
   
    srand((unsigned)time(NULL));   
    do {
        system("cls");
        printf("\n\t< Bingo Game >\n\n");
        printf("  1. 빙고판 입력\n  2. 빙고판 출력\n  3. 게임 시작\n  4. 나가기\n  -> [ ]\b\b");
        scanf("%d", &menu);
        fflush(stdin);
       
        switch(menu)
        {
        case 1 :    // 빙고판 입력
            bingo_rand(user1);
            bingo_rand(user2);
            flag = 1;
            printf("\n\n\t\tuser1과 user2의 빙고판 입력이 완료 되었습니다!\n\n\n\t\t아무키나 누르면 메뉴로 돌아갑니다.\n");
            getchar();
            break;
        case 2 :    // 빙고판 출력
            if(flag==0)
                printf("\n\n\t\t아직 빙고판 입력을 안하셨습니다.\n");
            else {
                system("cls");
                printf("\n  어떤 사용자의 빙고판을 출력 하시겠습니까?\n\n");
                printf("    A. user1\n    B. user2\n    -> [ ]\b\b");
                scanf("%c", &prt);
                fflush(stdin);           
                if(prt=='a' || prt=='A')
                    bingo_print(user1, 1);
                else if(prt=='b' || prt=='B')
                    bingo_print(user2, 2);
                else
                    printf("\n\n\t\t잘못 입력 하셨습니다.\n");
            }
            printf("\n\n\t\t아무키나 누르면 메뉴로 돌아갑니다.\n");
            getchar();
            break;
        case 3 :    // 게임 시작
            if(flag==0) {
                printf("\n\n\t\t아직 빙고판 입력을 안하셨습니다.\n\n\n\t\t아무키나 누르면 메뉴로 돌아갑니다.\n");
                getchar();
            }           
            else if(flag==1) {
                bingo_game(user1, user2);
                flag = 2;
            }
            else if(flag==2) {
                printf("\n\n\t\t이미 게임을 하셨습니다.\n\n\n\t\t빙고판을 새로 입력하시고 시작하세요.\n");
                printf("\n\n\t\t아무키나 누르면 메뉴로 돌아갑니다.\n");
                getchar();
            }
            break;
        default : break;
        }
    } while(menu!=4);
}

 

/*--빙고판 입력-----------------------------------------------*/
void bingo_rand(int (*ptr)[5])
{
    int temp[25];
    int i, j, cnt=0, flag=0;
   
    for(i=0; i<5; i++) {
        for(j=0; j<5; j++) {          
            cnt = i * 5 + j; // temp[]에 들어갈 위치
            ptr[i][j] = rand() % 50 + 1; // 랜덤 숫자
            temp[cnt] = ptr[i][j]; // 복사
           
            while(cnt) // 중복 값 확인
                if(ptr[i][j] == temp[--cnt]) 
                    flag++;
        }
        if(flag) i--; // 중복 값 존재          
        flag = 0;
    }
}

 

/*--빙고판 출력-----------------------------------------------*/
void bingo_print(int (*ptr)[5], int user)
{
    int i, j;
    system("cls");
    printf("\n\n\t   <user%d>\n", user);
    printf("\n  --------------------------\n");
    for(i=0; i<5; i++) {
        printf("  |");
        for(j=0; j<5; j++) {
            if(ptr[i][j] == 0) // 선택한 칸은 '*' 출력
                printf("  * |");
            else
                printf("%3d |", ptr[i][j]);
        }
        printf("\n  --------------------------\n");
    }
}

 

/*--빙고 게임 시작--------------------------------------------*/
void bingo_game(int (*ptr)[5], int (*ptr2)[5])
{
    int bingo1=0, bingo2=0, win1=0, win2=0;
   
    while(1) { // 승리한 사람이 있을 때까지
        //--------------------------------------------- user1 //
        system("cls");
        bingo_print(ptr, 1); // 현재 빙고판 출력           
        bingo_sign(ptr, ptr2, 1); // 숫자 선택
        bingo1 = bingo_check(ptr); // 빙고 확인       
        win1 = bingo_win(1, bingo1, win1); // 승리 확인
        if(win1) break;
        printf("\n\n\t\t아무키나 누르면 상대방의 순서로 넘어갑니다.\n");
        getchar();
       
        //--------------------------------------------- user2 //
        system("cls");
        bingo_print(ptr2, 2); // 현재 빙고판 출력
        bingo_sign(ptr2, ptr, 2); // 숫자 선택
        bingo2 = bingo_check(ptr2); // 빙고 확인
        win2 = bingo_win(2, bingo2, win2); // 승리 확인
        if(win2) break;
        printf("\n\n\t\t아무키나 누르면 상대방의 순서로 넘어갑니다.\n");
        getchar();
    }  
}

 

/*--빙고 확인-------------------------------------------------*/
int bingo_check(int (*ptr)[5])
{
    int i, j, cnt1=0, cnt2=0, cnt3=0, cnt4=0, bingo=0, line=0;
   
    for(i=0; i<5; i++) {
        for(j=0; j<5; j++) {
            if(ptr[i][j]==0) // 가로 빙고 
                cnt1++;
            if(ptr[j][i]==0) // 세로 빙고
                cnt2++;
        }
        if(cnt1==5) bingo++;
        if(cnt2==5) bingo++;
        cnt1=0; cnt2=0;
    }
   
    for(i=0; i<5; i++) {
        if(ptr[i][i]==0)    // 대각선 빙고 (왼쪽->오른쪽)
            cnt3++;
        if(ptr[i][4-i]==0)  // 대각선 빙고 (오른쪽->왼쪽)
            cnt4++;
    }
    if(cnt3==5) bingo++;
    if(cnt4==5) bingo++; 
   
    printf("\n\n\t\t현재 빙고 [%d] 입니다.", bingo);  
    return bingo;   
}

 

/*--빙고 숫자 체크--------------------------------------------*/
void bingo_sign(int (*ptr)[5], int (*ptr2)[5], int user)
{
    int i, j, num, flag=0;
   
    while(1) {
        printf("\n  숫자를 선택 하세요 -> [  ]\b\b\b");
        scanf("%d", &num);
        fflush(stdin);
       
        if(num) { // 숫자 0은 제외
            for(i=0; i<5; i++) { // 선택한 숫자 '*' 표시
                for(j=0; j<5; j++) {
                    if(ptr[i][j] == num) { // 현재 user
                        ptr[i][j] = 0;
                        flag = 1;
                    }       
                }
            }
        }
       
        if(!flag)
            printf("\n  빙고판에 없는 숫자입니다. 다시 입력하세요!\n");
        else { // 현재 user에게 있는 숫자일때만 '*' 표시     
            for(i=0; i<5; i++) {
                for(j=0; j<5; j++) {
                    if(ptr2[i][j] == num) // 상대 user
                        ptr2[i][j] = 0;
                }
            }
            break;
        }
    }   
    bingo_print(ptr, user); // '*' 체크 된 빙고판 출력    
}

 

/*--빙고 승자 판별--------------------------------------------*/
int bingo_win(int user, int bingo, int win)
{
    if(bingo>=5) {
        win = 1;
        printf("\n\n\t\t<user%d> 승리 !!!!!!!!!!!!!!!", user);
        printf("\n\n\t\t아무키나 누르면 메뉴로 돌아갑니다.\n");
        getchar();       
    }
    return win;
}


 

'삽질 > Com' 카테고리의 다른 글

트리  (0) 2009.12.06
이중연결리스트  (0) 2009.12.06
빙고게임  (0) 2009.12.06
주석 삭제 프로그램  (0) 2009.12.06
행맨게임  (0) 2009.10.24
프로그래밍 전문가가 되기 위한 Dicajohn의 7가지 방법  (0) 2009.10.24