U E D R S I H C RSS
ID
Password
Join
당신 자신이 되어라. 그러면 당신보다 더 나은 적격자가 어디 있겠는가 ―F.G.



Contents

1 강의요약
2 몬스터 때려잡기!
2.1 소스
3 수정 2 : switch 문을 적용한 동일한 예제
4 시도해볼것!

1 강의요약 #

  • 전반적인 C 기초 키워드의 용도와 프로그램 흐름을 익히기 위한 예제입니다.

2 몬스터 때려잡기! #

  • 아래 예제는 다음과 같은 순서로 실행됩니다.
    1. 몬스터 체력과 플레이어 체력 중 하나가 0 이하가 되었는지 검사하고, 둘중 하나라도 0 이하면 누가 승리했는지 표시하고 게임을 종료합니다.
    2. 우선 몬스터의 체력과 플레이어의 체력을 표시합니다.
    3. 주먹, 권총, 수류탄중에서 공격할 무기를 선택합니다.
    4. 난수발생기를 사용하여 몬스터가 입은 데미지를 계산하고 그 결과를 출력합니다.
    5. 난수발생기를 사용하여 플레이어가 입은 데미지를 계산하고 그 결과를 출력합니다.
    6. 1번으로 돌아가 계속 반복합니다.
  • 우선 기본 소스입니다.

2.1 소스 #

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int monster_hp = 100;
int player_hp = 100;

void main()
{
    srand((unsigned)time(NULL));
    
    while(1) // 무한히 반복합니다. 
    {
        int attack_type;
        
        // 만약에 몬스터가 죽었으면 플레이어가 이긴 것을 출력.
        if (monster_hp <= 0) {
            printf("몬스터가 죽었습니다! 축하합니다!\n");
            break; 
        }
        
        // 만약에 플레이어가 죽었으면 게임 오버 표시. 
        if (player_hp <= 0) {
            printf("당신은 죽었습니다...Game Over.\n"); 
            break; 
        }
        
        // 우선 현재 몬스터와 플레이어의 상태를 출력합니다.
        printf("몬스터HP : %d, 플레이어HP : %d\n", monster_hp, player_hp);
        
        // 공격형태를 묻습니다.
        printf("어떻게 공격하시겠습니까? (0=주먹, 1=권총, 2=수류탄) : ");
        scanf("%d", &attack_type);
        
        // 주먹일 경우 처리 
        if ( attack_type == 0 ) {
            int attack_point = rand() % 5;
            if (attack_point > 0)
                printf("몬스터에게 %d만큼의 데미지를 입혔습니다.\n", attack_point);
            else
                printf("몬스터가 꿈적도 하지 않네요. -_-;\n");
            monster_hp = monster_hp - attack_point;
        }
        // 권총일 경우 처리 
        else if ( attack_type == 1 ) {
            int attack_point = rand() % 10;
            if (attack_point > 0)
                printf("몬스터에게 %d만큼의 데미지를 입혔습니다.\n", attack_point);
            else
                printf("몬스터가 꿈적도 하지 않네요. -_-;\n");
            monster_hp = monster_hp - attack_point;
        }
        // 수류탄일 경우 처리 
        else if ( attack_type == 2 ) {
            int attack_point = rand() % 40;
            if (attack_point > 0)
                printf("몬스터에게 %d만큼의 데미지를 입혔습니다.\n", attack_point);
            else
                printf("몬스터가 꿈적도 하지 않네요. -_-;\n");
            monster_hp = monster_hp - attack_point;
        }
        
        // 몬스터가 공격할 차례.
        {
            int monster_attack_point = rand() % 20;
            if (monster_attack_point > 0)
                printf("몬스터가 때려서 %d만큼의 데미지를 입었습니다. 아, 아프다~\n", monster_attack_point);
            else
                printf("몬스터가 공격했지만 간만의 차이로 피했습니다.\n");
            player_hp = player_hp - monster_attack_point;
        }
    }
    system("PAUSE");	
}

3 수정 2 : switch 문을 적용한 동일한 예제 #

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int monster_hp = 100;
int player_hp = 100;

void main()
{
    // 난수발생기 초기화 
    srand((unsigned)time(NULL));
    
    while(1) // 무한히 반복합니다. 
    {
        int attack_type, attack_point;
        
        // 만약에 몬스터가 죽었으면 플레이어가 이긴 것을 출력.
        if (monster_hp <= 0) {
            printf("몬스터가 죽었습니다! 축하합니다!\n");
            break; 
        }
        
        // 만약에 플레이어가 죽었으면 게임 오버 표시. 
        if (player_hp <= 0) {
            printf("당신은 죽었습니다...Game Over.\n"); 
            break; 
        }
        
        // 우선 현재 몬스터와 플레이어의 상태를 출력합니다.
        printf("몬스터HP : %d, 플레이어HP : %d\n", monster_hp, player_hp);
        
        // 공격형태를 묻습니다.
        printf("어떻게 공격하시겠습니까? (0=주먹, 1=권총, 2=수류탄) : ");
        scanf("%d", &attack_type); // &를 반드시 붙여야합니다! 

        switch (attack_type) 
        {
            case 0 : // 주먹일 경우 처리 
                attack_point = rand() % 5; 
                break;
            case 1 : // 권총일 경우 처리
                attack_point = rand() % 10;
                break;
            case 2 : // 수류탄일 경우 처리 
                attack_point = rand() % 40;
                break;
        }
        if (attack_point > 0)
            printf("몬스터에게 %d만큼의 데미지를 입혔습니다.\n", attack_point);
        else
            printf("몬스터가 꿈적도 하지 않네요. -_-;\n");
        monster_hp = monster_hp - attack_point;
        
        // 몬스터가 공격할 차례.
        {
            int monster_attack_point = rand() % 20;
            if (monster_attack_point > 0)
                printf("몬스터가 때려서 %d만큼의 데미지를 입었습니다. 아, 아프다~\n", monster_attack_point);
            else
                printf("몬스터가 공격했지만 간만의 차이로 피했습니다.\n");
            player_hp = player_hp - monster_attack_point;
        }
    }
    system("PAUSE");
}

4 시도해볼것! #

  1. 주먹, 권총, 수류탄의 최대 데미지를 외부 변수로 선언하여 수정하기 쉽게 해볼 것! (전역변수 또는 #define문)
  2. 박카스(회복제) 기능 추가해볼 것.
  3. 수류탄 개수, 권총 개수 한정해볼 것.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:52
Processing time 0.3430 sec