일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 자바스크립트
- 웹해킹
- webhacking.kr
- openCV
- 네트워크
- tcp
- 코딩테스트 연습
- 게임 프로그래밍
- C언어
- 자바
- 딥러닝
- 크레인 인형뽑기
- 5585
- 계단함수
- 신규 아이디 추천
- c++
- 10809
- 리버싱
- boj
- 코드엔진
- c언어 게임
- 웹케이알
- 퍼셉트론
- Old-14
- 백준
- 프로그래머스
- Old-17
- 소프트맥스 함수
- old-1
- JS
Archives
- Today
- Total
SteffenLee
[C언어]게임 만들기 - 숫자야구 본문
제가 예전에 처음으로 만들었던 게임입니다.
헤더나 함수의 설명은 주석으로 간략하게 적었으나 함수 부분을 설명할 때 따로 설명하겠습니다.
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(29, 9); scanf_s("%d", &select); if (select == 1) { system("cls"); map(); gotoxy(9, 6); 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(21, 3); 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 + 1, 0, 0, 0 }; 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(20, 2); printf("숫 자 야 구\n"); } void yeah() { gotoxy(XX, 5); printf("1. 게임 시작"); gotoxy(XX, 6); printf("2. 게임 방법"); gotoxy(XX, 7); printf("3. 끝내기"); gotoxy(16, 9); printf("입력하세요 : "); } void explain() { gotoxy(5, 3); printf("숫자야구 야구는 4자리의 숫자를 맞추는 게임입니다."); system("pause > null"); gotoxy(5, 4); printf("4자리의 숫자는 중복되지 않습니다.(0 제외)"); system("pause > null"); gotoxy(5, 5); printf("4자리의 숫자를 입력한 숫자 안에"); system("pause > null"); gotoxy(5, 6); printf("숫자가 있으면 볼, 자릿수까지 맞으면 스트라이크"); system("pause > null"); gotoxy(5, 7); printf("숫자를 맞추시면 아웃(게임 끝)입니다."); system("pause > null"); } | cs |
이때는 지금보다 실력이 부족해서 goto문을 사용하였습니다. 그 부분을 이해해 주시면 감사하겠습니다.
마지막으로 구동 영상입니다.
bgm - Alan Walker - Fade [NCS Release]
'Progamming > C,C++' 카테고리의 다른 글
[C++]STL vector (0) | 2018.04.07 |
---|---|
[C/C++]동적할당 연결리스트 (0) | 2018.04.05 |
[C++]decltype 타입 지정자 (0) | 2018.03.11 |
[C언어]게임 만들기 - 숫자야구.ver2(2인용) (1) | 2017.10.11 |
[C언어]게임 만들기 - 행맨[Hang Man](텍스트 기반) (5) | 2017.09.23 |
Comments