본문 바로가기

IT STUDY/Language

[C 응용] 고급스런 Bingo게임 만들기

반응형

 

 

 

 

 

빙고게임 만들기입니다.

배열과, 난수 등 모든걸 다양하게 사용해서 만들었습니다.

+ 난수로의 빙고판 생성
+ 숫자 매칭시 카운터 공격수 적용함
+ 없는 숫자 입력시 Error 표시를 내며 다시 입력하라고 설정
+ 한줄 완성시 ☆가 ★로 변함
+ ★개가 되면 게임이 끝나게 설정

 

 

 

사용되는 헤더 파일

헤더 설명 함수
studio.h 표준 입출력 라이브러리 함수 정의 printf, scanf, fopen,getc 등
stdlib.h 정수형의 범위를 나타내는 상수들을 정의 int atol, rand, malloc 등
time.h  난수를 사용하기 위한 헤더파일  time_t time, ctime 
windows.h  text 색깔또는 헤더파일 SetConsoleTextAttribute 등

 

빙고게임 C 코드

+ bingo.c

#include <stdio.h> // 입,출력 함수를 사용하기 위한 헤더파일
#include <stdlib.h> // EXIT_SUCCESS를 사용하기 위한 헤더파일
#include <time.h> //난수를 사용하기 위한 헤더파일
#include <windows.h> //text 색깔 넣는 헤더파일

void textcolor(int color_number); // 텍스트에 색 입히는 함수
void bingomake(int bingo[5][5]); // 빙고 판을 만드는 함수
void play(int bingo[5][5]); // 빙고 게임 실행 함수
int sumbingo(int bingo[5][5], int sum[12]); // 빙고 확인 함수



main()
{
    int bingo[5][5];

	//게임 규칙 및 진행 방법
	textcolor(14);
	printf("===== 보성 Bingo게임방법 =====\n");
	printf("1. 1~25까지 정수만 입력하세요\n");
	printf("2. 같은 숫자 입력시도 공격인정\n");
	printf("3. 문자입력시 에러가 생깁니다.\n");
	printf("4. 빙고가 5개가 되면 승리\n");
	printf("5. 게임에서 지면 음료수사세요\n");
	system("pause"); //키입력시 진행
	system("cls"); //화면을 지운
	
    textcolor(27);
	printf("      Are you Ready?      \n");
	bingomake(bingo); //빙고판을 만듬
    play(bingo); //게임 실행

    return EXIT_SUCCESS; //정상 종료
}


/*******빙고 판을 만드는 함수*******/
void bingomake(int bingo[5][5])
{

    long seed;
    int i=0,j=0;
    int temp[50];
    int tem; 

    seed = time(NULL) ;
    srand(seed) ; //난수 발생

   


	//빙고판 0으로 초기화
	for(i = 0 ; i<5; i++)
	{	
		for(j = 0 ; j<5; j++)
			bingo[i][j] = 0 ;
	}

	//temp 0으로 초기화 
	for(i = 0 ; i <50 ; i++)
		temp[i] = 0 ;

	//빙고판 1-25 까지 난수 발생
	for(i = 0 ; i<5; i++)
	{
		for(j = 0 ; j<5; j++)
		{
			while(1)
			{
				tem = rand()%25+1; 
				if(temp[tem] == 0 )
				{
					bingo[i][j] = tem;
					temp[tem] = 1;
					break ;
				}
			}		
		}
	}

	//빙고판 출력
	for(i=0;i<5;i++)
	{
		for(j=0;j<5;j++)
		{
			textcolor(14);
			printf("%5d",bingo[i][j]);
		}
		printf("\n");
	}
}


/*******빙고 게임 실행 함수*******/
void play(int bingo[5][5])
{
	int count=0,st=1 ;
	int data ;
	int i, j ;
	int sum[12];

	//count가 5가 될때까지 무한루프
	while(1)
	{
		//사용자의 입력을 받음
		textcolor(27);
		printf("        Bingo Game        \n");
		textcolor(47);
		printf("    1-25 까지 정수 선택   \n");
		textcolor(7);
		printf(">");
		scanf("%d", &data) ;
		system("cls");
		
		//1-25중 정수 입력시 그 값을 가진 bingo[i][j]을 초기화 시킴
		if(data>=1 && data<=25)
		{
			textcolor(27);
			printf("        %d번째 공격        \n",st);
			for(i=0;i<5;i++)
			{
				for(j=0;j<5;j++)
				{
					if(bingo[i][j]==data) // 입력한 값과 이중배열값이 같으면 
					{
						bingo[i][j] =0 ; //0으로 초기화
						break ;
					}
				}
			}
			st++; //공격 순서를 센다
		}
		
		else //1-25중 정수를 입력하지 않을시 
		{
			textcolor(27);
			printf("       Error 재입력       \n",st);
		}
	
		count = sumbingo(bingo,sum); //빙고의 수를 센다

		for(i = 0 ; i<5; i++) //모든 작업을 마친 빙고판을 출력한다
		{
		      for(j = 0 ; j<5; j++)
		      {
			   textcolor(14);	
			   printf("%5d", bingo[i][j]) ;
		      } 
		      putchar('\n') ;
		}
		
		//현재 빙고 개수를 보여준다
		if(count==0){ printf("빙고수: ☆ ☆ ☆ ☆ ☆\n");}
		else if(count==1) printf("빙고수: ★ ☆ ☆ ☆ ☆\n");
		else if(count==2) printf("빙고수: ★ ★ ☆ ☆ ☆\n");
		else if(count==3) printf("빙고수: ★ ★ ★ ☆ ☆\n");
		else if(count==4) printf("빙고수: ★ ★ ★ ★ ☆\n");
		else if(count==5) printf("빙고수: ★ ★ ★ ★ ★\n");
		
		if(count==5) //빙고수가 5개가 되면 승리
		{
			textcolor(27);
			printf("  ☞ (/^▽^)/ You Win ☜  \n");
			textcolor(2);
			exit(0); //게임종료 
		}
	}
}


/*******빙고확인 함수*******/ 
int sumbingo(int bingo[5][5], int sum[12]) 
{
	int i,j,  count=0 ;

	//  가로합 
	sum[0] = bingo[0][0] + bingo[0][1] + bingo[0][2] + bingo[0][3] + bingo[0][4] ;
	sum[1] = bingo[1][0] + bingo[1][1] + bingo[1][2] + bingo[1][3] + bingo[1][4] ;
	sum[2] = bingo[2][0] + bingo[2][1] + bingo[2][2] + bingo[2][3] + bingo[2][4] ;
	sum[3] = bingo[3][0] + bingo[3][1] + bingo[3][2] + bingo[3][3] + bingo[3][4] ;
	sum[4] = bingo[4][0] + bingo[4][1] + bingo[4][2] + bingo[4][3] + bingo[4][4] ;
	// 세로합
	sum[5] = bingo[0][0] + bingo[1][0] + bingo[2][0] + bingo[3][0] + bingo[4][0] ;
	sum[6] = bingo[0][1] + bingo[1][1] + bingo[2][1] + bingo[3][1] + bingo[4][1] ;
	sum[7] = bingo[0][2] + bingo[1][2] + bingo[2][2] + bingo[3][2] + bingo[4][2] ;
	sum[8] = bingo[0][3] + bingo[1][3] + bingo[2][3] + bingo[3][3] + bingo[4][3] ;
	sum[9] = bingo[0][4] + bingo[1][4] + bingo[2][4] + bingo[3][4] + bingo[4][4] ;
	// 대각선 합
	sum[10] = bingo[0][4] + bingo[1][3] + bingo[2][2] + bingo[3][1] + bingo[4][0] ;
	sum[11] = bingo[0][0] + bingo[1][1] + bingo[2][2] + bingo[3][3] + bingo[4][4] ;
	
	
	for(i = 0 ; i<12 ; i++) sum[i] = 0; // 0으로 다 초기화
	
	for(i = 0 ; i< 5 ; i++) 
	{
		for(j = 0 ; j < 5 ; j++) 
		{
			sum[i]=sum[i]+bingo[i][j]; 
			sum[i+5]=sum[i+5]+bingo[j][i]; 
		}

		sum[10] += bingo[i][4-i] ; //왼쪽 대각선의 합
		sum[11] += bingo[i][i] ;   //오른쪽 대각선의 합
	}


	for(i = 0 ; i<12 ; i++) //위에서 sum[i]이 0인 갯수만큼 count를 +1한다 (빙고수)
		if( sum[i] == 0) count ++ ;
	
	

	return count ; //count를 반환한다
}

/*******색깔을 입히기 위한 함수 (데코레이션 용)*******/
void textcolor(int color_number)
{
	 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color_number);
}

 

 

 

실행 결과

초기화면=  게임 Rule설명
난수를 이용한 빙고판
숫자입력시 0 표시, 없는 숫자시 Error 표시
한줄 완성시 ☆가 ★로 변함
5줄을 다 채우게 되면 You win

반응형