Recent Posts
Recent Comments
Link
12-25 10:44
동글동글 라이프
C언어로 구현한 빙고게임 본문
어릴때 친구들과 열심히 했던 빙고게임을 C언어로 만들어 봤습니다.
국민적인 게임이라 빙고게임을 대부분 알고 계실 것이라 생각됩니다.
하지만 빙고게임의 방식이 각 나라나 지역에 따라 다르기 때문에
저는 제가 알고 있는 빙고 게임대로 만들어 보도록 하겠습니다 ^^
빙고게임을 만들기 위해서는 크게 3가지를 주의해서 만드시면 됩니다.
1. 숫자 섞기
5x5 판에서 1 ~ 25까지 순서대로만 숫자를 나열하면 재미가 없으니
두 숫자를 뽑아서 서로 바꿔주는 식으로 숫자를 섞으면 됩니다.
위와 같이 랜덤으로 좌표를 2개를 설정 한다음 두 값을 바꿔주는 형태로
사용자가 원하는 만큼 또는 적절한 양만큼 섞어주면 랜덤된 빙고 판이 완성되게 됩니다.
2. 숫자 설정
선택한 숫자를 임의의 숫자( 0 또는 다른 수) 로 바꿔줌으로써
출력도 다른 문자로 출력 되게 합니다.
이것은 내가 숫자를 부른 부분에 대해서 색칠을 하는 효과와 동일 합니다.
이미 숫자가 설정되어 있다면 다시 설정하게 하는 부분도 예외사항으로 잘 설정해야 합니다.
3. 빙고 개수 체크
빙고 개수 체크는 총 4가지 입니다.
행,열, 각 대각선으로 빙고 개수를 체크하면 됩니다.
( 2중 for 문 단 한번으로 이 빙고 개수를 모두 체크 할 수 있습니다.)
5x5 빙고판일 경우 5번이 먼저 Check 될 경우에
게임을 끝나게 설정 합니다.
아래는 컴퓨터와 플레이어가 직접 번호를 주고받으며
빙고게임을 할 수 있도록 만들어 보았습니다.
즐겜 하세요~~
원문 링크 : http://pastebin.com/NwmhyPtC
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <windows.h>
- #define MAX 5
- #define WHITE 15
- #define YELLOW 14
- void textcolor(int color_number); // 텍스트 칼라 출력
- void gotoxy(int x, int y); // 좌표 이동
- int baserand(int x, int y); // 랜덤 범위 지정
- // 초기값 설정
- void InitCount(int Player[MAX][MAX] , int Com[MAX][MAX]);
- // MAP 설정
- void MixMAP(int Player[MAX][MAX]);
- int SearchMAP(int Player[MAX][MAX] ,int Num);
- void printMAP(int Player[MAX][MAX]);
- int CheckMAP(int Player[MAX][MAX]);
- // 승리조건
- void Winner(int flag , int Player[MAX][MAX],int Com[MAX][MAX]);
- int main(void){
- int Player[MAX][MAX];
- int Com[MAX][MAX];
- int playerChk,comChk;
- int Num;
- InitCount(Player,Com);
- MixMAP(Player);
- while(1){
- gotoxy(0,0);
- // 컴퓨터들 출력
- textcolor(WHITE);
- printf(" ====== Player ====== \n");
- printMAP(Player);
- textcolor(WHITE);
- printf(" ===== Computer ===== \n");
- printMAP(Com);
- textcolor(WHITE);
- printf(" > ");
- scanf("%d",&Num);
- if( SearchMAP(Player,Num) == 0){
- printf("잘못입력하셨습니다. \n");
- system("pause");
- system("cls");
- continue;
- }
- SearchMAP(Com,Num);
- // 컴퓨터 턴
- while( 1 ){
- Num = baserand(1,MAX*MAX);
- if(SearchMAP(Com, Num) ==1 ){
- SearchMAP(Player, Num);
- break;
- }
- }
- playerChk = CheckMAP(Player);
- comChk = CheckMAP(Com);
- printf("Player Check = %d \n",playerChk);
- printf("Com Check = %d \n",comChk);
- if(playerChk >= MAX && comChk >= MAX){
- if( playerChk > comChk){
- Winner(0,Player,Com); // 내가 이겼을 때
- }else if( playerChk < comChk) {
- Winner(1,Player,Com); // 내가 졌을 때
- }else{
- Winner(2,Player,Com); // 배겼을 때
- }
- }else if(playerChk >= MAX){
- Winner(0,Player,Com); // 내가 이겼을 때
- }else if(comChk >= MAX){
- Winner(1,Player,Com); // 내가 졌을 때
- }
- system("pause");
- system("cls");
- }
- return 0;
- }
- // 텍스트 칼라 출력
- void textcolor(int color_number)
- {
- SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color_number);
- };
- // 좌표 이동
- void gotoxy(int x, int y)
- {
- COORD Cur;
- Cur.X=x;
- Cur.Y=y;
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Cur);
- }
- // 랜덤 범위 지정
- int baserand(int x, int y){
- static int z = 0;
- int tmp;
- if(z==0){
- srand((int)time(NULL));
- rand();rand();rand();rand();
- srand(rand());
- z=1;
- }
- tmp = rand()%(y-x+1)+x;
- return tmp;
- }
- void printMAP(int Player[MAX][MAX]){
- int i,j;
- for(i=0;i<MAX;i++){
- for(j=0;j<MAX;j++){
- if(Player[i][j] == 0){
- textcolor(YELLOW);
- printf("%4s","♥");
- }else{
- textcolor(WHITE);
- printf("%4d",Player[i][j]);
- }
- }
- printf("\n");
- }
- }
- void MixMAP(int Player[MAX][MAX]){
- int i;
- int x1,y1;
- int x2,y2;
- int tmp;
- printMAP(Player);
- for(i=0;i< 10*MAX ;i++){
- x1 = baserand(0,MAX-1);
- y1 = baserand(0,MAX-1);
- x2 = baserand(0,MAX-1);
- y2 = baserand(0,MAX-1);
- // 두 값을 서로 바꾸는 코드
- tmp = Player[x1][y1];
- Player[x1][y1] = Player[x2][y2];
- Player[x2][y2] = tmp;
- gotoxy(0,0);
- printMAP(Player);
- Sleep(10);
- }
- system("pause");
- system("cls");
- }
- int SearchMAP(int Player[MAX][MAX] ,int Num){
- int i,j;
- int flag = 0;
- for(i=0;i<MAX;i++){
- for(j=0;j<MAX;j++){
- if(Player[i][j] == Num){
- flag = 1;
- Player[i][j] = 0;
- }
- }
- }
- return flag;
- }
- int CheckMAP(int Player[MAX][MAX]){
- int i,j;
- int rowsFlag = 0;
- int columnFlag = 0;
- int crossleftFlag = 0;
- int crossrightFlag = 0;
- int check = 0;
- for(i=0;i<MAX;i++){
- rowsFlag = 0;
- columnFlag = 0;
- for(j=0;j<MAX;j++){
- if(Player[i][j] == 0){
- rowsFlag++;
- }
- if(Player[j][i] == 0){
- columnFlag++;
- }
- }
- // 가로체크
- if(rowsFlag == MAX){
- check++;
- }
- // 세로체크
- if(columnFlag == MAX){
- check++;
- }
- // 대각선 왼쪽에서 오른쪽
- if(Player[i][i] == 0){
- crossleftFlag++;
- }
- // 대각선 오른쪽에서 왼쪽
- if(Player[MAX-1-i][i] == 0){
- crossrightFlag++;
- }
- }
- if(crossleftFlag == MAX){
- check++;
- }
- if(crossrightFlag == MAX){
- check++;
- }
- return check;
- }
- void Winner(int flag , int Player[MAX][MAX],int Com[MAX][MAX]){
- gotoxy(0,0);
- textcolor(WHITE);
- printf(" ====== Player ====== \n");
- printMAP(Player);
- textcolor(WHITE);
- printf(" ===== Computer ===== \n");
- printMAP(Com);
- gotoxy(0,MAX*2+5);
- switch(flag){
- case 0:
- printf("당신이 이겼습니다. \n");
- break;
- case 1:
- printf("당신이 졌습니다. \n");
- break;
- case 2:
- printf("비겼습니다. \n");
- break;
- }
- exit(0);
- }
- void InitCount(int Player[MAX][MAX] , int Com[MAX][MAX]){
- int i,j;
- int count =1 ;
- for(i=0;i<MAX;i++){
- for(j=0;j<MAX;j++){
- Player[i][j] = count;
- Com[i][j] = count;
- count++;
- }
- }
- }
앞으로 잔잔한 게임들을 소스공개 및 설명과 함께 올리도록 하겠습니다.
'개발자 이야기 > C 언어로 게임 만들기' 카테고리의 다른 글
게임을 만들면서 배우는 C언어 강좌 시작!! (2) | 2019.01.08 |
---|---|
Console User Interface ( CUI ) - 1 (1) | 2013.07.11 |
목차 (3) | 2013.07.11 |
Funny C ( 게임을 만들면서 C언어 공부하기 ) - 서문 (2) | 2013.07.11 |
C언어로 구현한 사다리 게임 ( Ladder Game ) (8) | 2011.06.04 |
Comments