본문 바로가기
C,C++/코드정리

[C/C++] 빙고 게임 구현

by 마두식 2022. 9. 7.
반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <time.h>
#include <conio.h>
 
int main() {
    int bingoMap[25];
    int playerInputNum;
    int idx1, idx2, tmp;
    int rowStar, colStar;
    int bingoCount = 0;
    bool isDuplicate = true;
    srand((unsigned int)time(NULL));
 
    for (int i = 0; i < 25++i) {
        bingoMap[i] = i + 1;
    }
 
    for (int i = 0; i < 100++i) {
        idx1 = rand() % 25;
        idx2 = rand() % 25;
 
        tmp = bingoMap[idx1];
        bingoMap[idx1] = bingoMap[idx2];
        bingoMap[idx2] = tmp;
    }
 
    while (true) {
        system("cls");
 
        for (int i = 0; i < 5++i) {
            for (int j = 0; j < 5++j) {
                if (bingoMap[i * 5 + j] == INT_MAX)    std::cout << "*\t";
                else    std::cout << bingoMap[i * 5 + j] << "\t";
            }
            std::cout << std::endl;
        }
        std::cout << std::endl << "Bingo Count : " << bingoCount << std::endl;
 
        if (bingoCount >= 5) {
            std::cout << std::endl << "5줄 빙고 완성 ! " << std::endl;
            break;
        }
 
        bingoCount = 0;
 
        std::cout << std::endl << "1~25 사이의 숫자를 입력하세요(0 : 종료) : ";
        std::cin >> playerInputNum;
 
        if (playerInputNum == 0)        break;
 
        if (playerInputNum < 0 || playerInputNum>25)    continue;
 
        isDuplicate = true;
 
        for (int i = 0; i < 25++i) {
            if (playerInputNum == bingoMap[i]) {
                bingoMap[i] = INT_MAX;
                isDuplicate = false;
            }
        }
 
        if (isDuplicate)        continue;
 
        //가로 세로 빙고 확인
        for (int i = 0; i < 5++i) {
            rowStar = colStar = 0;
            for (int j = 0; j < 5++j) {
                if (bingoMap[i * 5 + j] == INT_MAX)    ++rowStar;
                if (bingoMap[j * 5 + i] == INT_MAX)    ++colStar;
            }
            if (rowStar == 5)    ++bingoCount;
            if (colStar == 5)    ++bingoCount;
        }
 
        //좌측 상단 대각선 빙고 확인
        rowStar = 0;
        for (int i = 0; i < 25; i += 6) {
            if (bingoMap[i] == INT_MAX)        ++rowStar;
        }
        if (rowStar == 5)    ++bingoCount;
 
        //우측 상단 대각선 빙고 확인
        rowStar = 0;
        for (int i = 4; i <= 20; i += 4) {
            if (bingoMap[i] == INT_MAX)        ++rowStar;
        }
        if (rowStar == 5)    ++bingoCount;
 
 
    }
 
    std::cout << std::endl << "게임을 종료합니다" << std::endl;
 
    return 0;
}
cs

 

빙고 게임 전체 코드입니다. 1 ~ 25까지 작성된 5 x 5 맵을 출력하고 사용자가 입력하는 숫자들을 하나씩 지워서 *로 변경합니다. 빙고가 5줄 이상 나오면 게임이 클리어됩니다.

 

 

6 번째 라인은 5 x 5 맵을 저장할 배열

7 번째 라인은 사용자가 입력할 숫자를 받을 변수

9 번째 라인은 가로 세로 각각 *의 개수를 카운트해서 저장할 변수

10 번째 라인은 현재까지 빙고 개수를 저장할 변수

11 번째 라인은 이전 값과 중복된 숫자를 입력하였는지 체크하기 위한 변수

 

나머지 부분은 셔플 알고리즘을 구현한 코드입니다.

- 참고 링크 : [C/C++] 로또 구현 (tistory.com)

 

 

system("cls") 함수를 통해 콘솔 창을 정리하고 5x5 배열을 출력합니다.

빙고 개수가 5개 이상이라면 게임을 클리어 합니다. 그렇지 않다면 빙고 개수를 0으로 다시 초기화합니다.

 

 

사용자로부터 1 ~ 25 사이 임의의 숫자를 입력받습니다.

0이 입력된다면 프로그램 종료, 0 ~ 25 범위 밖의 숫자를 입력하면 재입력, 이전에 입력했던 값을 또 입력했다면 중복으로 인해 재입력을 처리합니다.

 

 

5 x 5 맵에서 가로와 세로의 * 개수를 카운트하여 빙고 줄 개수를 증가시키는 코드입니다.

 

 

대각선 빙고를 확인하기 위한 코드입니다. 아래는 5x5 맵의 배열 인덱스를 나타낸 것입니다.

아래를 천천히 확인하며 규칙을 찾기 바랍니다.

 

  0   1   2   3   4

  5   6   7   8   9

10 11 12 13 14

15 16 17 18 19

20 21 22 23 24

 

 

 

잘못된 부분이나 개선 사항은 언제나 편하게 댓글로 지적해주세요.

감사합니다.

 

출처

(7) C언어/C++ 강의 17화 빙고게임 2 [어소트락 게임아카데미] - YouTube

반응형

댓글