1580, 4/79 회원가입  로그인  
   whqkdnf000
   http://hack-ing.ohpy.com
   C로 만든 사격게임(주석달아놨음)

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=916 [복사]


#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
/*
* < 사격게임 >
*
* 호환성
* 이 프로그램은 Borland C++ 5.5 에서 컴파일하고 시험되었습니다.
*
* 게임설명
* 사격장은 각각 하나씩의 화살을 포함하고 있는 아홉개의 레인으로 만들어져 있습니다.
* 프로그램이 시작되면 레인의 오른쪽에 한개의 타겟(X)이 나타납니다.
* 당신의 과제는 화살들 중의 하나로 타겟을 맞추는 것 입니다.
* 화살을 쏘려면 레인 번호를 누르면 됩니다.
* 25개의 타겟이 나타난 후에, 게임은 끝나고, 최종점수가 출력됩니다.
*
* 난이도 변경하기
* 난이도를 변경하려면 ShootArrow(int)함수의 두번째 for루프를 변경해서 화살의 속도를 변경하면 됩니다.
* 화살이 천천히 나갈수록 맞추기까지의 시간을 소비하므로 난이도는 높아집니다.
* PlayGame(void)함수의 TIME_LIMIT값을 2초로 맞추어 놓았기 때문에
* 화살이 발사되는데 2초가 걸린다면 게임이 안되죠. 역시 제한시간도 마음대로 수정하세요.
*/

#define true 1
#define false 0
typedef int bool;

void ShowScore(int);
int PlayGame(void);
void EraseTarget(int);
void ShootArrow(int);
int ShowTarget(void);
void DrawScreen(void);

int main(void) {
        int score;
        srand((unsigned) time(NULL));
        DrawScreen();
        score = PlayGame();
        ShowScore(score);
        
        return 0;
}

void DrawScreen(void) {
        int x;
        clrscr();
        gotoxy(20, 11);
        printf("게임을 시작하려면 아무키나 누르세요.");
        getch();
        clrscr();
        
        for (x = 1; x <= 10; x++) {      // 루프는 한번에 한 개의 헤인벽과 한개의 화살을 그린다.
                gotoxy(1, x * 2 + 2);
                printf("-----------------------------------");
                if (x < 10) {
                        gotoxy(1, x * 2 + 3);
                        printf("%d%s", x, "  >>-->");
                }
        }
}

void EraseTarget(int target_position) {
        gotoxy(60, target_position * 2 + 3);
        printf(" ");
}

int PlayGame(void) {
        int score = 0;
        int target_position;
        long start_time;
        bool shot_fired;
        int num;          // 값으로 저장하는 숫자키
        const int TIME_LIMIT = 2;   // 한 타겟당 제한시간 2초
        
        int x;
        for (x = 1; x <= 20; x++) {         // 이 루프는 25개의 타겟을 부여한다.
                target_position = ShowTarget();
                start_time =  time(NULL);      // 여기에서 시작시간이 저장된다.
                shot_fired = false;
                
                // 제한시간과 남은 화살개수를 알려줌
                gotoxy(44, 2);
                printf("%s%d%s", "남은 화살: ", 21 - x, " ");
                gotoxy(10, 2);
                printf("%s%d%s", "한 타겟 당 시간제한 ", TIME_LIMIT, "초");
                
                do {            // 선수가 사격을 할 때까지 키 입력을 기다린다.
                        num = getch() - '0';
                        if (num >= 1 && num <= 9) {
                                ShootArrow(num);
                                shot_fired = true;
                        }
                } while (!shot_fired);  
                
                // 시간 안에(2초) 타겟을 맞추었을 때 실행된다.
                if ((time(NULL) < start_time + TIME_LIMIT) && num == target_position) {  
                        putchar('\a');
                        ++score;
                }
                EraseTarget(target_position);
        }
        return score;
}

void ShootArrow(int a) {   // 파라미터 a는 발사한 화살의 번호
        int x;
        long delay;
        for (x = 4; x <= 60; x++) {
                gotoxy(x, a * 2 + 3);     // 루프의 매 회마다 화살을 1문자씩 오른쪽으로 움직인다.
                printf(">>-->");
                for (delay = 0; delay < 3999999; delay++)  // 이 코드로 화살의 속도조절을 한다. 시스템의 성능에 따라 다르다.
                        continue;
                gotoxy(x, a * 2 + 3);
                printf("     ");
        }
        gotoxy(4, a * 2 + 3);
        printf(">>-->");
}

void ShowScore(int score) {
        gotoxy(60, 20);
        printf("-----------------");
        gotoxy(60, 21);
        printf("%s%d", " Your score is ", score);
        gotoxy(60, 22);
        printf("-----------------");
}

int ShowTarget(void) {
        int p = rand() % 9 + 1;         // 이 난수는 타겟이 나타날 레인번호이다. 1 ~ 9
        gotoxy(60, p * 2 + 3);
        printf("X");
        return p;
}

  Hit : 16126     Date : 2008/01/15 07:29



    
aloe 우와!! 대단하시다.. 이거저도 플레이해보고싶은데 어떡해하나요? 2008/01/15  
whqkdnf000 컴파일해서 하시던가, 컴파일러 없으면 해쿨 ftz에서 컴파일해서 쓰시면 됍니다^-. 2008/01/16  
k1rha 컴파일후 실행하려니 에러가 3개뜨네요 2008/01/16  
whqkdnf000 아마 헤더파일이 없어서 그런것같은데요. 볼랜드C에서는 컴파일잘됍니다., 2008/01/16  
qkreoghks00 윈도우용 gcc에서는 안되나요? (아직안해봤음) 2008/01/23  
lvson1004 비쥬얼스튜디오로 돌려보니 안되네요 ㅠㅠ 2008/02/22  
marin5318 터보에서 안돼네요.......ㅠㅠ 2008/03/24  
flsnrtm 볼랜드C로 어떻게 컴파일해요? 2008/04/18  
Min-Q 컴파일 에러나면 gotoxy함수를 만들어주시면 되요 2008/04/29
Min-Q 함수 본체는 네이버에서 gotoxy 검색하시면 많이 나온답니다. 2008/04/29
ahdudqh 어머머 ㅋ 짱이시네여 2008/08/22  
lit02 윈도우gcc안돼 2009/05/24  
1520   [펌+편집] [C언어] TEXT에 색을 입히자!! TEXT COLOR SET !!![7]     U_SoRang
12/15 18033
1519   네 트 워 크 강 좌[17]     소유
10/05 17896
1518   * 윈도우 해킹의 기본원리 *     HackerMapia
02/21 17832
1517   [정리] 해커스쿨 F.T.Z trainer 정리 6 ~ 10[2]     초콜렛나인
03/01 17813
1516   [간단] WireShark - 간단한 패킷에서 파일 추출 방법입니다.[1]     푸른하늘
05/08 17534
1515   OpenVMS Tutorial[4]     x90c
02/23 17100
1514   텔넷 에서 FTP 리눅스 명령어정리[5]     괴도js
08/02 16910
1513   시스템 리소스 99%에 도전하자!![18]     DarkSlayer
09/10 16795
1512   리눅스 명령어 마스터 3[13]     소유
09/04 16681
1511   webhacking.kr 2번[1]     프라이드
09/28 16618
1510   chenkim4의 중국해킹 기법 8가지 편[1]     chenkim4
08/28 16485
1509   정보통신 인터넷 용어..(모르시는 분들만..+참고..)[19]     H.R.T
12/29 16429
1508   리눅스 Mysql 설치하기. centos6.4 - minimal // mysql 5.6.11 소스      nsh009
05/10 16332
1507   리눅스 명령어 마스터 4[13]     소유
09/05 16306
1506   소켓 프로그래밍[5]     소유
09/11 16296
1505   윈도우xp관리자 비밀번호 간단히 해킹하기![14]     whqkdnf000
02/26 16283
1504   초짜를 위한 파이썬[2]     asdzxc301
12/18 16251
1503   라우터 간단한 명령어 및 기본설정[2]     Mach
04/29 16191
  C로 만든 사격게임(주석달아놨음)[12]     whqkdnf000
01/15 16125
1501   [정리] 해커스쿨 F.T.Z trainer 정리 1 ~ 5[11]     초콜렛나인
03/01 15920
[1][2][3] 4 [5][6][7][8][9][10]..[79]

Copyright 1999-2023 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org & Wowhacker.com