SteffenLee

[C언어]게임 만들기 - 숫자야구 본문

Progamming/C,C++

[C언어]게임 만들기 - 숫자야구

SteffenLee 2017. 9. 22. 18:47

제가 예전에 처음으로 만들었던 게임입니다.


헤더나 함수의 설명은 주석으로 간략하게 적었으나 함수 부분을 설명할 때 따로 설명하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>//기본 라이브러리
#include<stdlib.h>//난수 생성 및 시스템 함수 사용
#include<windows.h>//Sleep과 gotoxy 사용
#include<time.h>//난수 생성에서 시드값 사용
#include <conio.h>//getch 사용
#define XX 23//선택 항목 x값
 
void gotoxy();//커서 위치 변경(20번째 줄)
void map();//맵핑(67번째 줄)    
void title();// 상단 제목(94번째 줄)
void name();//이름 (213번째 줄)
void numberingandgame();// 넘버링과 게임 시작 (99번째 줄)
void yeah();//선택지(217번째 줄)
void explain();//설명충 (224번째 줄)
 
               //2차원 배열용
const int max_x = 30;
const int max_y = 12;
cs


gotoxy함수 부분입니다. 
1
2
3
4
5
6
7
void gotoxy(int x, int y) {
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
 
}
cs

메인함수 부분입니다.
메뉴 부분을 담당하기도하는 메인함수 부분입니다. 이곳에서 게임시작과 게임설명과 게임종료를 선택할 수 있습니다.
이때는 지금보다 C언어를 잘 못했고 그래서 goto문을 사용하였습니다.
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
int main() {
    title();
a:
    map();
    name();
    yeah();
    int select;
    gotoxy(299); scanf_s("%d"&select);
 
    if (select == 1) {
        system("cls");
        map();
        gotoxy(96); printf("4자리의 무작위 숫자를 생성중입니다...");
        Sleep(3000);
        system("cls");
        printf("게임 시작\n");
        numberingandgame();
    }
 
    else if (select == 2) {
        system("cls");
        map();
        explain();
        goto a;
    }
 
    else if (select == 3) {
        return 0;
    }
 
    else {
        system("cls");
        map();
        gotoxy(213); printf("다시 입력하세요.");
        Sleep(1000);
        goto a;
    }
}
cs


map함수 부분입니다. 이 함수에서는 맵을 생성합니다.
이 이 코드는 친구의 도움을 많이 받았습니다.
그리고 system을 사용하여 콘솔창의 크기를 조절합니다.
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
void map() {
    system("mode con: cols=63 lines=13");//콘솔창 조절
 
                                         //맵 디자인
    int i, j;
    int fuck[max_y][max_x];
    for (i = 0; i < max_y; i++) {
        for (j = 0; j < max_x; j++) {
            if (i == 0 || i == max_y - 1 || j == 0 || j == max_x - 1)
                fuck[i][j] = 1;
            else
                fuck[i][j] = 0;
        }
    }
 
    //맵 생성
    for (i = 0; i < max_y; i++) {
        for (j = 0; j < max_x; j++) {
            if (fuck[i][j])
                printf("★");
            else
                printf("  ");
        }
        printf("\n");
    }
}
cs


title이라는 함수인데 이 부분에서는 콘솔창에 제목을 바꾸어 줍니다.
1
2
3
4
void title() {
    //프로그램창의 제목
    system("title 숫자야구 number baseball! 1.0.0");
}
cs


numberingandgame함수 입니다. 거의 이 프로그램에 절반 이상을 기능을 차지하는 가장 중요한 부분입니다.
처음에 선언된 fuck이라는 변수에 첫 자리가 0이 아닌 숫자로 4개의 난수를 겹치지 않게 생성합니다.
그리고 temp라는 곳에 숫자의 순서를 바꾸어 저장해서 나중에 점수 비교를 할때 편하게 해줍니다.
그 후 4자리의 수를 입력받고 for문을 돌려 하나하나 분리하고 저장합니다.
저장이 끝나면 숫자의 중복 유무, 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
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
void numberingandgame() {
    system("mode con: cols=63 lines=22");//콘솔창 조절
rst://게임 재시작
    int i, j;
    int tmp;
    static int fuck[4= { rand() % 9 + 1000 };
    for (i = 0; i < 4++i) {
        srand((unsigned int)time(NULL));
        while (1) {
            // 난수를하나생성
            fuck[i] = rand() % 9 + 1;
            // 이미있는값인지확인하기위해플래그설정
            tmp = 0;
            for (j = 0; j < i; ++j) {
                if (fuck[j] == fuck[i]) {
                    tmp = 1;
                    break;
                }
            }
            if (!tmp)
                break;
        }
    }
 
    //결과출력
    for (i = 0; i < 4++i) {
        printf("%2d", fuck[i]);
    }
    printf("\n");
    int temp[4];//순서바꾸기용
    temp[0= fuck[3];
    temp[1= fuck[2];
    temp[2= fuck[1];
    temp[3= fuck[0];
 
    //바꾼거 확인하기
    /*printf("\n");
    for (i = 0; i < 4; ++i) {
        printf("%2d", temp[i]);
    }*/
    /*printf("\n");*/
 
    // 실제 게임이 실행되는 부분
    while (1) {
        char yn;
        int num;//플레이어가 입력할 4자리수
        int shit[4];//입력한 4자리수를 분리하기위한 배열
    rt:
        printf("숫자를 입력하세요 : ");
        scanf("%d"&num);
        for (i = 0; i < 4; i++) {
            shit[i] = num % 10;
            num = num / 10;
        }
 
        //입력된 숫자 중복확인
        for (i = 0; i < 4++i) {
            for (j = i + 1; j < 4++j) {
                if (shit[i] == shit[j]) {
                    printf("중복된 숫자가 있습니다. 다시 입력하세요\n");
                    printf("\n");
                    goto rt;
                }
            }
        }
 
        //0이 있는지 검사
        for (i = 0; i < 4; i++) {
            if (shit[i] == 0) {
                printf("0이 입력되었습니다. 다시 입력하세요\n");
                printf("\n");
                goto rt;
            }
        }
 
        /*숫자 확인
        for (i = 0; i < 4; i++) {
        printf("%2d", shit[i]);
        }*/
 
        //점수 카운트
        int ball = 0;
        int st = 0;
        static int con = 1;//횟수 카운트
        for (i = 0; i < 4; i++) {
            for (j = 0; j < 4; j++) {
                if (temp[i] == shit[j] && i == j)
                    st++;
                if (temp[i] == shit[j] && i != j)
                    ball++;
 
            }
        }
        if (st == 4) {
            printf("%d번째 시도의 결과는: OUT\n", con);
        select:
            printf("다시 하시겠습니까?[Y/N]");
            yn = getch();
            if (yn == 'Y' || yn == 'y') {
                system("cls");
                con = 1;//카운트 초기화
                goto rst;
            }
            if (yn == 'N' || yn == 'n') {
                break;
                system("exit");
            }
            else {
                printf("\n\n");
                goto select;
            }
        }
        printf("%d번째 시도는 %d Strike %d Ball\n", con, st, ball);
        printf("\n");
        con++;
        st = 0;
        ball = 0;
    }
}
cs



name, yeah, explain함수 부분입니다.
name함수는 제목을 띄우는 역할
yeah함수는 메뉴를 띄우는 역할
explain함수는 설명을 하는 부분입니다.
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
void name() {
    gotoxy(202); printf("숫    자    야    구\n");
}
 
void yeah() {
    gotoxy(XX, 5); printf("1. 게임 시작");
    gotoxy(XX, 6); printf("2. 게임 방법");
    gotoxy(XX, 7); printf("3. 끝내기");
    gotoxy(169); printf("입력하세요 : ");
}
 
void explain() {
 
    gotoxy(53); printf("숫자야구 야구는 4자리의 숫자를 맞추는 게임입니다.");
    system("pause > null");
    gotoxy(54); printf("4자리의 숫자는 중복되지 않습니다.(0 제외)");
    system("pause > null");
    gotoxy(55); printf("4자리의 숫자를 입력한 숫자 안에");
    system("pause > null");
    gotoxy(56); printf("숫자가 있으면 볼, 자릿수까지 맞으면 스트라이크");
    system("pause > null");
    gotoxy(57); printf("숫자를 맞추시면 아웃(게임 끝)입니다.");
    system("pause > null");
 
}
cs


이때는 지금보다 실력이 부족해서 goto문을 사용하였습니다. 그 부분을 이해해 주시면 감사하겠습니다. 

마지막으로 구동 영상입니다.

bgm -  Alan Walker - Fade [NCS Release]





Comments