복피지 코드 > 마을맵,던전맵 추가 ver

2025. 3. 22. 21:17·C언어
/* -----------------------메세지----------------------- */

// 추가해야될 변수, 함수 등등
// 위치 어디에 추가해야되는지 상세하게
// 어떤 용도인지도 주석 자세하게



/* -----------------------헤더----------------------- */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdint.h>

#include <time.h>
#define SIZE 50 // 맵싸이즈

#define STR_BASIC 10 //스텟을 초기화해도 STR, DEX, INT는 10 고정
#define DEX_BASIC 10
#define INT_BASIC 10


/* 터미널을 설정해서 엔터없이 입력받기 */
#include<unistd.h>
#include<termios.h>
int getch() // 엔터없이 입력
{
    int c;
    struct termios oldattr, newattr;

    tcgetattr(STDIN_FILENO, &oldattr);           // 현재 터미널 설정 읽음
    newattr = oldattr;
    newattr.c_lflag &= ~(ICANON | ECHO);         // CANONICAL과 ECHO 끔
    newattr.c_cc[VMIN] = 1;                      // 최소 입력 문자 수를 1로 설정
    newattr.c_cc[VTIME] = 0;                     // 최소 읽기 대기 시간을 0으로 설정
    tcsetattr(STDIN_FILENO, TCSANOW, &newattr);  // 터미널에 설정 입력
    c = getchar();                               // 키보드 입력 읽음
    tcsetattr(STDIN_FILENO, TCSANOW, &oldattr);  // 원래의 설정으로 복구
    return c;
}
/* 터미널을 설정해서 엔터없이 입력받기 */




/* -----------------------구조체----------------------- */ //(붕어빵틀)
//스킬 만드는 틀
struct made_skill
{   
    char skill_name[30];
    int skill_type;
    int need_level;
    int magic_rate;
    int minus_mp;
};

//장비 아이템 구조체
typedef struct 
{
    char name[50];
    int type; // 0: 장비 1: 소비 2: 재료
    int tier; // 등급
    int attack; //공격력
    int a_magic; //마법공격력
    int critical; //치명타율
    int avoid; //회피율
    int defense; //방어력       
    int price; //가격
} EquipmentItem; //자료형이름

// 소비 아이템 구조체
typedef struct 
{
    char name[50];
    int tier;
    int effectype;  // 0: HP 회복, 1: MP 회복, 2: 상태 이상 회복
    int effectvalue;
    int price;
} ConsumableItem; //자료형이름

// 재료 아이템 구조체
typedef struct 
{
    char name[50];
    int tier;
    int price;
} MaterialItem; //자료형이름

// 몬스터 특성 구조체
typedef struct {
    char name[50];
    int maxhp;
    int minhp;
    int maxatt;
    int minatt;
    int maxdf;
    int mindf;
    int weak;
    int strong;
} Monster; //


/* -----------------------초기값----------------------- */

// 선택값
int tmp=0; // 엔터 누르면 넘어감
int village_num; /*마을에서 5개 중 어디로 갈지 결정*/
int click = 0; /*장비 구매할지 아이템 구매할지 */
int tools, weapon, cloth, shoe, cloak, head; /*무기 고르기, 무기, 갑옷, 신발, 망토, 투구*/
int medicine, health_med, magic_med, condition, move;/*약 고르기, 체력 물약, 마나 물약, 상태 회복 아이템, 이동 주문서*/
int heal, heal_3; /*성소에서 힐, 상태회복, 스탯 초기화 중 고르는 것 , 스탯 초기화 할지 고르는 것 */
int out; // 모든 행동 후 나갈지 말지 (예솜)
int find, choice, pick, bank_count; /*은행에서 물건을 찾을 것인지 보관할 것인지, 은행에서 몇 번 물건을 보관건지, 몇 번 물건을 찾을건지, 보관함이 얼마나 차있는지*/

// 용사복이 상태창 (능력치)
int STR, DEX, INT; /*보너스 스탯 포인트를 하면 올릴 수 있음*/
int power, magic_power, aviod_rate, critical; // 공,마공,회피,치명타
int LEVEL = 1;
int HP = 100, MP = 10 ;
int money = 100;
int overdose, curse; /* 중독, 저주*/
int bonus_point = 0; /*보너스 스텟 포인트*/
int nam_exp=0, max_exp=100, exp=0; // 남은 경험치, 경험치통 최대크기, 얻는 경험치 


// 몬스터 관련 초기값
int hard = 1; // 전역변수로 놔두고 보스를 잡을때마다 ++ 
int hard_mode = 1;   // 하드모드 몬스터 설정값
int named_mode = 1;  // 네임드 몬스터 설정값

// 마을 맵 관련 초기값
char input; // 마을에서 입력받는 변수

int z = 0;
int map[6][SIZE][SIZE] = {0};  // 전체맵
int v_me[2] = {25, 25};         // 마을에서 좌표

// 던전 맵 관련
int me[2] = {1, 1};         // 던전에서 좌표
int seed = 1;   // 난수의 변하는값. 던전층이 올라가면 ++
int mosnter_seed = 1;   // 왜 사용안해도 랜덤이 되는거지?
//int z = 1;  // 내 현재 층수
int portal_i, portal_j, monster_i, monster_j; // 포탈과 몬스터 좌표 변수

/* -----------------------아이템----------------------- */

// 1. 장비
// (1.타입 2.등급 3.공격력 4.마법배율 5.치명타율 6.회피율 7.방어력 8.가격)
// 타입 = 용복이 착용 상태 (1~5)
EquipmentItem EquipmentItems[] = 
{  
    //무기
    {"맨손", 0, 0, 0, 0, 0, 0, 0, 0},
    {"기본검", 0, 1, 2, 0, 0, 0, 50},
    {"장검", 0, 2, 10, 0, 0, 0, 0, 500},
    {"일본도", 0, 3, 20, 0, 0, 0, 0,10000},
    {"싸울아비 장검", 0, 4, 40, 0, 0, 0, 0, 0},
    {"혼돈의 검", 0, 5, 50, 0, 30, 0, 0, 0},
    {"천사천하제일 무쌍도", 0, 5, 100, 0, 0, 0, 0},
    {"마왕을 멸하는 마검", 0, 5, 50, 5, 0, 0, 0, 0},
    {"운영자검", 0, 6, 1111, 0, 0, 0, 0, 0},
    
    //갑옷
    {"가죽갑옷", 0, 1, 0, 0, 0, 0, 2, 50},
    {"철갑옷", 0, 2, 0, 0, 0, 0, 6, 600},
    {"강철갑옷", 0, 3, 0, 0, 0, 0, 12, 0},
    {"미스릴갑옷", 0, 4, 0, 0, 0, 0, 20, 0},
    {"진격하는자의갑옷", 0, 5, 0, 20, 0, 0, 20, 0}, 
    {"정화의갑주", 0, 5, 0, 0, 0, 0, 20, 0}, // 상태 이상 안걸림 해결 안됨
    
    //신발
    {"가죽신발", 0, 1, 0, 0, 0, 0, 1, 50},
    {"철신발", 0, 2, 0, 0, 0, 0, 3, 600},
    {"미스릴신발", 0, 4, 0, 0, 0, 0, 8, 0},
    {"포세이돈의신발", 0, 5, 0, 0, 0, 0, 8, 0}, //상태 이상 안걸림 해결 안됨
    {"헤르메스의 신발", 0, 5, 0, 0, 0, 20, 8, 0}, 
    {"하데스의 신발", 0, 5, 10, 0, 0, 8, 0}, 

    //망토
    {"천망토", 0, 1, 0, 0, 0, 0, 1, 50},
    {"면망토", 0, 2, 0, 0, 0, 0, 3, 600},
    {"비단망토", 0, 3, 0, 0, 0, 0, 6, 0},
    {"마법망토", 0, 4, 0, 0, 0, 0, 8, 0},
    {"순백의망토", 0, 5, 0, 0, 0, 0, 20, 0},
    {"용기의망토", 0, 5, 10, 0, 0, 0, 8, 0},  
    {"진홍의망토", 0, 5, 0, 0, 20, 0, 8, 0}, 
    
    //투구
    {"가죽투구", 0, 1, 0, 0, 0, 0, 1, 50},
    {"철투구", 0, 2, 0, 0, 0, 0, 3, 600},
    {"강철투구", 0, 3, 0, 0, 0, 0, 6, 0},
    {"미스릴투구", 0, 4, 0, 0, 0, 0, 8, 0},
    {"용사의투구", 0, 5, 0, 0, 0, 0, 8, 0},  //받는 데미지 감소 +10% 누락
    {"용기사투구", 0, 5, 10, 0, 0, 0, 8, 0}, 
    {"기묘한두건", 0, 5, 0, 0, 0, 30, 1, 0},

    {"빈 칸", 0, 0, 0, 0, 0, 0, 0, 0}, // 게임 중에 비어있음 처리할때 비어있음만 신경쓰면된다.

    //장갑
    {"가죽 장갑", 6, 1, 0, 0, 0, 0, 1, 50 },
    {"철 장갑", 6, 2, 0, 0, 0, 0, 3, 600 },
    {"강철 장갑", 6, 3, 0, 0, 0, 0, 6, 0 },
    {"미스릴 장갑", 6, 4, 0, 0, 0, 0, 8, 0 },
    {"죄악의 마수 ", 6, 5, 10, 0, 0, 0, 8, 0 },
    {"요정의 팔찌", 6, 5, 0, 0, 0, 0, 8, 0 }, //받는 데미지 +10% 감소
    {"혼돈의 수갑", 6, 5, 0, 0, 20, 0, 8, 0 }

    //현재 보완할 점 : 소비 아이템 "체력 회복", "마나 회복", "HP,MP 회복", "중독상태","저주상태" 회복
    // 강화재료 장비 강화시 아이템별 강화 장비 등급당 사용할 수 있는 재료 분류와 인챈트 사용 부분 
};

// 2. 소비
// (1.티어, 2.종류(HP회복, MP회복, 상태이상회복, 주문서) 3.회복율 4.가격)
ConsumableItem consumableItems[] = 
{
    {"빨간물약", 1, 0, 30, 30},
    {"주황물약", 2, 0, 60, 200},
    {"맑은물약", 3, 0, 80, 1000},
    {"파란물약", 1, 1, 30, 50},
    {"하얀물약", 2, 1, 60, 300},
    {"무지개물약", 3, 1, 80, 1500},
    {"엘릭서", 4, 2, 100, 0},
    {"해독제", 2, 2, 0, 500},
    {"축복 주문서", 3, 2, 0, 2000},
    {"만병통치약", 4, 2, 0, 0},
    {"마을이동주문서", 1, 0, 0, 200},
    {"순간이동주문서", 2, 0, 0, 1000}
};

// 3. 재료  
// 특성 추가 필요
MaterialItem materialItems[] =
{
    {"작은 화염 조각", 1, 0},
    {"푸른 화염 조각", 2, 0},
    {"강렬한 화염 조각", 3, 0},
    {"미친 화염 조각", 4, 0},
    {"마력 응축석", 3, 0}
};


/* -----------------------스킬----------------------- */
// 스킬속성
char type_name[3][20] = {"Fire", "Aqua", "Nature"}; // 0.1.2

// 스킬
struct made_skill skills[12] = 
{{"Fireball", 0,1,2,2}, {"Firespear", 0,25,6,50}, {"Blast", 0,50,10,150}, {"Meteor", 0,65,15,200}, //불
{"WaterSpear", 1,5,5,30}, {"WaterBomb", 1,20,5,30}, {"Iceball", 1,20,5,50}, {"Blizard", 1,60,15,200}, //물
{"ThunderBolts", 2,10,3,15}, {"Stoneshower", 2,10,3,15}, {"WindCutter", 2,10,3,15}, {"Tornado",2,10,3,15}, //자연
}; 


/* -----------------------몬스터----------------------- */

Monster monster[8] = {
    {"오크전사", 120, 80, 20, 10, 0, 0, 0, 1},
    {"좀비", 120, 80, 40, 25, 0, 0, 1, 2},
    {"구울", 200, 120, 80, 50, 10, 5, 1, 2},
    {"해골", 400, 250, 110, 70, 30, 15, 2, 3},
    {"리치", 350, 300, 300, 230, 15, 10, 2, 3},
    {"바실리스크", 900, 600, 130, 100, 50, 30, 0, 3},
    {"마왕(보스)", 500, 0, 350, 250, 0, 0, 2, 3},
    {"이동녀크(찐보스)", 1000, 0, 600, 500, 0, 0, 3, 3},
};

Monster meet[1] = {0}; // 내가 만난 몬스터 배열


/* -----------------------가방----------------------- */
//인벤토리 창
EquipmentItem Inventory[20] ={{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0},{"비어있음", 0, 0, 0, 0, 0, 0, 0, 0}};

// 아이템창
ConsumableItem Item_pocket[1300]; // 12x99개

// 재료창
MaterialItem Material_Pocket[1000];

// 은행창
EquipmentItem Bank[100] ;


/* -----------------------함수이름----------------------- */

void village();

void market();
void hospital();
void repair_shop();
void exchant();
void bank();
void dungeon();

void show_inven();
void show_bank();

void meet_monster();
void make_monster();
void c(); // 중독,저주

void dungeon_();    // 던전 전체 변수
void dungeon_map(); // 던전만드는 변수
void dungeon_map_print();    // 던전맵 출력하는 함수
void dungeon_move_();    // 이동하는 함수
void event();   // 던전에서 무언가 만났을때 함수

void village_map_print();
void move_();
void village_move();


/* -----------------------메인----------------------- */
int main()
{   
    // for (int i=0; i<20; i++) {
    //     Inventory[i] = EquipmentItems[35];
    // } // 인벤토리 0~19칸까지 비어있음으로 채워놓음

    // 스킬 불러오는 법
    // printf("스킬의 이름:%s\n", skills[0].skill_name);
    // printf("스킬의 속성:%s\n", type_name[skills[0].skill_type]);

    // 상점에서 물건 사고, 인벤토리에 넣는법

    // 상점에서 물건 사고, 인벤토리에 넣는법
    // Inventory[0] = EquipmentItems[1]; //인벤토리 0번에 장비아이템 구조체에서 1번 값 대입
    // printf("inventory Status: %s\n", Inventory[0].name); //인벤토리 상태 출력 인벤토리 0번에 장비명 출력!
    // printf("inventory Status: %s\n", Inventory[1].name); // 인벤토리 빈 칸 출력

    village();
}


/* -----------------------함수----------------------- */

void level_up()
{

    exp += 20+ nam_exp;
    if (exp >= max_exp)
    {
        nam_exp = exp - max_exp;
        exp = 0 + nam_exp;
        LEVEL = LEVEL + 1;
        max_exp = max_exp + 10;
        HP = HP + 20;
        MP = MP + 10;
        bonus_point += 1;
    }
    printf("level : %d\nHP :%d\nMP :%d\nexp = %d/%d\n", LEVEL, HP, MP, exp, max_exp);
}

void show_inven() // 인벤토리 조회 함수
{

    for (int i = 0; i < 10; i++)
    {
        printf("[ %d]:%s ", i ,Inventory[i].name);
    }
    printf("\n");
    for (int i = 10; i < 20; i++)
    {
        printf("[%d]:%s ", i ,Inventory[i].name);
        
    }
    printf("\n");
}

void show_bank_all() /*은행 보관함에 뭐가 있는지 보여줌*/
{
    for (int i = 0; i < 20; i++)
    {
        printf("[ %d]:%s ", i ,Bank[i].name);
    }
    printf("\n");
    for (int i = 20; i < 101; i++)
    {
        printf("[%d]:%s ", i ,Bank[i].name);

    }
}

void show_bank() // 있는것만 출력
{
    // if 뱅크에 1개라도 있을 때

    if (bank_count > 0)
    {
        for (int i = 0; i < 100; i++) /*보관함 중에서*/
        {   
            if (Bank[i].tier > 0)/*현재 있는 것만 출력*/
            {
                printf("[%d]: %s\n ", i ,Bank[i].name);
                bank_count += 1;/*현재 보관함에 몇 개 있는지 카운트*/
            }  
        }
    }

    // else 뱅크에 아무것도 없을 때
    // 아무것도 없습니다 < 출력
    else
    {
        
        printf("현재 보관함에 아무것도 없습니다.\n");
        printf("마을로 돌아갑니다(enter)\n");
        do
        {   char tmp;
            scanf("%c", &tmp);
        } while (getchar() != '\n'); // 엔터 누르면 넘어감
        

    }


    // 뱅크에 뭐가 있는지 없는지 판별하려면? 길이? 카운트 보면될듯?!
    // 뱅크카운트=0 으로 초기화하고 조건식 써보자!
}

/* --------------------마을 관련 함수-------------------- */

void village()
{
    // 대업님 마을맵 코드
    while (input != 'q')
    {   
        village_map_print();
        input = getch();

        move_();
        village_move();

    }
}

void market()   // 잡화상 함수
{
    printf("잡화상입니다.\n");
    printf("1번: 장비템 / 2번: 소비템\n");
    scanf("%d", &click);
};

void hospital()
{
    while (1)
    {
        printf("성소에 오신 것을 환영합니다 !");
        printf("HP와 MP 100프로 회복하시려면 : 1\n 모든 상태 이상을 회복하시려면 : 2\n모든 스텟을 초기화 하시려면 :3\n");
        printf("계속 회복 하려면 :0\n마을로 돌아가고 싶으면 : 1\n");
        scanf("%d", &out);
        if (out == 0)
        {
            continue;
        }

        else if (out == 1)
            break;
    }
};

void repair_shop()
{
    while (1)
    {
        printf("음하하! 나는 드워프라고 한다!\n내 제련소엔 왜 왔지? 혹시 무기를 강화할건가?\n");
        printf("계속 도전한다고 ㅋ ? 하려면 :0\n마을로 돌아가고 싶으면 : 1\n");
        scanf("%d", &out);
        if (out == 0)
        {
            continue;
        }

        else if (out == 1)
            break;
    }
};

void exchant()
{
    while (1)
    {
        printf("무기에 인챈트를 하러 왔나?\n 랜덤인건 각오하고 왔겠지?\n");
        printf("계속 하려면 :0\n마을로 돌아가고 싶으면 : 1\n");
        scanf("%d", &out);
        if (out == 0)
        {
            continue;
        }

        else if (out == 1)
        break;

    }
};

void bank()
{
    while (1)
    {
    printf("환영합니다! 현재 100개 중 00개의 보관함이 비어있어용 !\n");
    printf("보관하려면 1번, 물건을 찾으러 왔으면 2번을 눌러주세용!\n");
    // scanf()
    printf("계속 은행 거래를 하려면 :0\n마을로 돌아가고 싶으면 : 1\n");
        scanf("%d", &out);
            if (out == 0)
            {
            continue;
            }

            else if (out == 1)
            break;
    }
};

void dungeon()
{
    input = 'q';
    printf("던전에 입장합니다 !\n");
    
    // me[2] = {1, 1};
    dungeon_();
    printf("야호");
};




/* ------------------던전 관련 함수------------------ */

void dungeon_()
{
    z = 1;
    // me[2] = {1, 1}
    dungeon_map();

    while (1)
    {
        dungeon_map_print();

        // 🥚미래에 상태창이될 알들🥚
        printf("🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚\n");
        printf("🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚\n");
        printf("🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚\n");
        printf("🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚\n");
        printf("🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚\n");
        printf("🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚\n");
        input = getch();
        //가로 44 세로 44
        dungeon_move_();
        event();
    }
};

void dungeon_map()  // 던전맵을 만드는 함수
{
    srand(seed);
    
    // 맵초기화 
    for (int i = 0; i < (SIZE); i++)
    {
        for (int j = 0; j < ( SIZE ); j++)
        {    
            map[z][i][j] = 0;
        }
    }

    // 벽생성   (수정필요)
    for (int i = 0; i < (SIZE); i++)
    {
        for (int j = 0; j < (SIZE); j++)
        {    
            if (rand()%65 > (SIZE))
            {
                map[z][i][j] = 1;
            }
        }
    }

    // 맵 테두리 생성
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {             
            map[z][0][j] = 2;
            map[z][49][j] = 2;
            map[z][i][0] = 2;
            map[z][i][49] = 2;
        }
    }

    // 포탈 좌표값 지정해주기

    portal_i = rand()%9 + 40;
    portal_j = rand()%9 + 40;
    map[z][portal_i][portal_j] = 3;

    // 몬스터 생성

    int monster_count = 20;
    int monster_count2 = 0;
    while(monster_count >= monster_count2)
    {
        // srand(mosnter_seed); // 필요가 없음 . 왜 없어도 돌아가지 ?
        monster_i = (rand()%46 + 2);    // 몬스터의 i 값을 2 ~ 47 랜덤으로 초기화
        monster_j = (rand()%46 + 2);    // 몬스터의 j 값을 2 ~ 47 랜덤으로 초기화

        // 초기화된 몬스터 좌표가 벽이아니거나 포탈이 아니면 합격!
        if ((z == 1) && (map[z][monster_i][monster_j] != 1) && ((map[z][monster_i][monster_j]) != (map[z][portal_i][portal_j]))) 
        {
            (map[z][monster_i][monster_j]) = (rand()%1 + 5);

            // monster_count --;
            monster_count2++;
        }
        else if ((z == 2) && (map[z][monster_i][monster_j] != 1) && ((map[z][monster_i][monster_j]) != (map[z][portal_i][portal_j]))) 
        {
            (map[z][monster_i][monster_j]) = (rand()%2 + 5);

            // monster_count --;
            monster_count2++;
        }
        else if ((z == 3) && (map[z][monster_i][monster_j] != 1) && ((map[z][monster_i][monster_j]) != (map[z][portal_i][portal_j]))) 
        {
            (map[z][monster_i][monster_j]) = (rand()%2 + 6);

            // monster_count --;
            monster_count2++;
        }
        else if ((z == 4) && (map[z][monster_i][monster_j] != 1) && ((map[z][monster_i][monster_j]) != (map[z][portal_i][portal_j]))) 
        {
            (map[z][monster_i][monster_j]) = (rand()%2 + 7);

            // monster_count --;
            monster_count2++;
        }
        else if ((z == 5) && (map[z][monster_i][monster_j] != 1) && ((map[z][monster_i][monster_j]) != (map[z][portal_i][portal_j]))) 
        {
            (map[z][monster_i][monster_j]) = (rand()%3 + 8);

            // monster_count --;
            monster_count2++;
        }
    }
    
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {             
            // map[z][i][j] = 2;

        }
    }

};

void dungeon_map_print()    // 던전맵 출력하는 함수
{

    system("clear");

    for (int i = me[0] - 22; i < me[0] + 22; i++)
    // for (int i = 0; i < SIZE; i++)
    {
        for(int j = me[1] - 22; j < me[1] + 22; j++)
        // for(int j = 0; j < SIZE; j++)
        {
            if((me[0] == i) && (me[1] == j)) // 내위치를 😃로 표시
            {
                printf("😃");
            }
            // 맵 밖을 벽으로 바꾸기
            else if((((i < 0) || SIZE <= i)) || ((j < 0) || (SIZE <= j))) // || (map[z][i][j] = -1)
            // else if((map[z][i][j] = -1))
            {
                printf("🟫");       // 좌표가 맵을 벗어나면 🟫벽으로 바꾸기
            }
            else if(map[z][i][j] == 1)   // 좌표값이 1번이면 🟫벽으로 바꾸기
            {
                printf("🟫");
            }
            else if(map[z][i][j] == 2)  // 좌표값이 2번이면 🟪
            {
                printf("🟪");
            }
            else if(map[z][i][j] == 3)  // 좌표값이 3번이면 🟪
            {
                if (z != 5)
                {
                    printf("🌕");
                }
                else
                {
                    printf("⬛");

                }
            }

            /* 던전 층수에 따른 몬스터 출력 조건문 */

            else if((z == 1)  && (map[1][i][j] == 5))  // 1 ~ 2층일때 등장
            {
                printf("🐶");  // 오크전사
            }
            else if((z == 2)  && (map[2][i][j] == 5))  // 1 ~ 2층일때 등장
            {
                printf("🐶");  // 오크전사
            }
            else if((2 == z)  && (map[2][i][j] == 6))  // 2 ~ 3층일때 등장
            {
                printf("🦁");  // 좀비
            }
            else if(((z == 3))  && (map[3][i][j] == 6))  // 2 ~ 3층일때 등장
            {
                printf("🦁");  // 좀비
            }
            else if(((3 == z))  && (map[3][i][j] == 7))  // 3 ~ 4 층일때 등장
            {
                printf("🐻");  // 구울
            }
            else if(((z == 4))  && (map[4][i][j] == 7))  // 3 ~ 4 층일때 등장
            {
                printf("🐻");  // 구울
            }
            else if((4 == z)  && (map[4][i][j] == 8))  // 4 ~ 5층일때 등장
            {
                printf("🐘");  // 해골
            }
            else if(((z == 5))  && (map[5][i][j] == 8))  // 4 ~ 5층일때 등장
            {
                printf("🐘");  // 해골
            }
            else if((5 == z) && (map[5][i][j] == 9))  // 5층일때 등장
            {
                printf("🐵");  // 리치
            }
            else if((5 == z) && (map[5][i][j] == 10))  // 5층일때 등장
            {
                printf("🐯");  // 바실리스크
            }
            else if((5 == z) && (map[5][i][j] == 11))  // 5층일때 등장
            {
                printf("🐸");  // 마왕(보스)
            }
            else if((5 == z) && (map[5][i][j] == 12))  // 5층일때 등장
            {
                printf("🦍");  // 이동녀크(찐보스)
            }
            /* 맵 밖을 나갔을때 출력할 문자 */
            else
            {
                printf("⬛");  // 나머지는 ⬛
            }
        }
        printf("\n");
    }
};

void dungeon_move_()    // 이동하는 함수
{
    if((input == 'w') && (me[0] > 1) && (map[z][me[0] - 1][me[1]] != 1))  // w를 입력받고 내 y좌표(반복문에서 i)가 0보다 클때
    {
        me[0]--;
    }
    else if((input == 's') && (me[0] < SIZE - 2) && (map[z][me[0] + 1][me[1]] != 1))  // s를 입력받고 내 y좌표(반복문에서 i)가 SIZE보다 작을때
    {
        me[0]++;
    }
    else if((input == 'a') && (me[1] > 1) && (map[z][me[0]][me[1] - 1] != 1))  // a를 입력받고 내 x좌표(반복문에서 j)가 0보다 클때
    {
        me[1]--;
    }
    else if((input == 'd') && (me[1] < SIZE - 2) && (map[z][me[0]][me[1] + 1] != 1))  // d를 입력받고 내 x좌표(반복문에서 j)가 SIZE보다 작을
    {
        me[1]++;
    }
};

void meet_monster() // 내가 만난 몬스터 데이터를 생성
{

    srand(time(NULL));
    int named = rand()%101;

    /*      하드모드일때        */

    if (hard == 1)
    {
        hard_mode = 1;
    }
    else    // hard가 1이아니면 하드모드
    {
        hard_mode = 5;
    }

    /*      네임드 만났을떄     */

    if(named > 50)
    {
        named_mode = 2;
        printf("네입드?");
    }
    else
    {
        named_mode = 1;
    }
    int my_locate = map[z][me[0]][me[1]]; // 현제 좌표를 숫자로 알려주는 변수

    make_monster();
    if (named_mode == 2)
    {
        printf("엄청강한 ");
    }
    printf("%s %d %d %d %d %d\n", meet[0].name, meet[0].maxhp, meet[0].maxatt, meet[0].maxdf, meet[0].weak, meet[0].strong);
};

void make_monster() // 몬스터의 데이터를 랜덤으로 생성하기
{
    int my_locate = map[z][me[0]][me[1]]; // 현제 좌표를 숫자로 알려주는 변수
    
    strcpy(meet[0].name, monster[my_locate - 5].name); // meet[0].name = monster[my_locate - 5].name;
    
    meet[0].maxhp = (rand()%((monster[my_locate - 5].maxhp - monster[my_locate - 5].minhp) + 1) + monster[my_locate - 5].minhp) * hard_mode * named_mode;
    /* 순서대로 / 내가만난 몬스터의 배열의 체력 = 랜덤(만난 몬스터의) % (최대채력 - 최소체력) + 최소체력    // ((최대채력 - 최소체력) + 최소체력) = 체력범위 */
    meet[0].maxatt = (rand()%((monster[my_locate - 5].maxatt - monster[my_locate - 5].minatt) + 1) + monster[my_locate - 5].minatt) * hard_mode * named_mode;
    meet[0].maxdf = (rand()%((monster[my_locate - 5].maxdf - monster[my_locate - 5].mindf) + 1) + monster[my_locate - 5].mindf) * hard_mode * named_mode;
    meet[0].weak = (monster[my_locate - 5].weak);
    meet[0].strong = (monster[my_locate - 5].strong);
};

void event()    // 만나는함수?
{
    // 내가 포탈에 들어갔을때
    if((me[0] == portal_i) && (me[1] == portal_j) && (z != 5))
    {
        me[0] = 1; // 내위치 초기화
        me[1] = 1;
        z++;    // 층수 ++
        seed++; // 랜덤값 ++
        dungeon_map();
    }
    // 몬스터를 만났을때

    else if ((map[z][me[0]][me[1]] >= 5) && (12 >= map[z][me[0]][me[1]]))
    {
        system("clear");

        meet_monster();
        while (getchar() == '\n')
        {
            continue;
        }
        // 전투를 이긴후 몬스터 자리를 길로 바꾸기
        map[z][me[0]][me[1]] = 0;
    }

    else if ((input == 'I') || (input == 'ㅑ') || (input == 'i')) // 아이템사용
    {
        system("clear");
        printf("아이템사용!!\n");
        while (getchar() == '\n')
        {
            continue;
        }
    }

    else if ((input == 'J') || (input == 'j') || (input == 'ㅓ'))
    {
        system("clear");
        printf("인벤토리!!\n");
        while (getchar() == '\n')
        {
            continue;
        }
    }

    else if ((input == 'K') || (input == 'k') || (input == 'ㅏ'))
    {
        system("clear");
        printf("장비확인!!\n");
        while (getchar() == '\n')
        {
            continue;
        }
    }

    else if ((input == 'M') || (input == 'm') || (input == 'ㅡ'))
    {
        system("clear");
        printf("재료창!!\n");
        while (getchar() == '\n')
        {
            continue;
        }
    }
        
};





/* ------------------마을맵 관련 함수------------------ */

void village_map_print()    // 맵 출력하는 함수
{
    // 맵초기화 
    for (int i = 0; i < (SIZE); i++)
    {
        for (int j = 0; j < ( SIZE ); j++)
        {    
            map[z][i][j] = 0;
        }
    }
    system("clear");
    for (int i = v_me[0] - 20; i < v_me[0] + 20; i++)
    {
        for(int j = v_me[1] - 20; j < v_me[1] + 20; j++)
        {
            if((v_me[0] == i) && (v_me[1] == j)) // 내위치를 😃로 표시
            {
                printf("😃 ");
            }
            else if((z == 0)  && ((i <= 10) && (1 <= i)) && ((j <= 10) && (1 <= j)))
            {
                printf("🌼 ");
            }
            else if((z == 0)  && ((i <= 29) && (20 <= i)) && ((j <= 48) && (39 <= j)))
            {
                printf("⭐ ");
            }
            else if((z == 0)  && ((i <= 10) && (1 <= i)) && ((j <= 48) && (39 <= j)))
            {
                printf("🐞 ");
            }
            else if((z == 0)  && ((i <= 48) && (39 <= i)) && ((j <= 10) && (1 <= j)))
            {
                printf("🌸 ");
            }
            else if((z == 0)  && ((i <= 29) && (20 <= i)) && ((j <= 10) && (1 <= j)))
            {
                printf("🌈 ");
            }
            else if((z == 0)  && ((i <= 48) && (39 <= i)) && ((j <= 48) && (39 <= j)))
            {
                printf("🍁 ");
            }
            else if(((i < 0) || (50 < i)) || ((j < 0) || (50 < j)))

            {
                printf(" ");
            }
            else
            {
                printf("🌳 ");  // 나머지는 🌳ㅈ
            }
        }
        printf("\n");
    }

};

void move_()    // 이동하는 함수
{
    if(((input == 'W') || (input == 'ㅈ') || (input == 'w')) && (v_me[0] > 0))   // w를 입력받고 내 y좌표(반복문에서 i)가 0보다 클때
    {
        v_me[0]--;
    }
    else if((input == 's') && (v_me[0] < SIZE - 1))  // s를 입력받고 내 y좌표(반복문에서 i)가 SIZE보다 작을때
    {
        v_me[0]++;
    }
    else if((input == 'a') && (v_me[1] > 0))  // a를 입력받고 내 x좌표(반복문에서 j)가 0보다 클때
    {
        v_me[1]--;
    }
    else if((input == 'd') && (v_me[1] < SIZE - 1))  // d를 입력받고 내 x좌표(반복문에서 j)가 SIZE보다 작을
    {
        v_me[1]++;
    }
    // else
    // {
    //     printf("이동할수가없어요!\n");
    //     while (getchar() != '\n')
    //     {
    //         continue;
    //     }
    // }
    // getchar();
    
};

void village_move() // 내가 장소에 도착하면 확인해쥬는 함수
{
    // else if(((i <= 10) && (1 <= i)) && ((j <= 10) && (1 <= j)))w

    // 1.잡화접 갔을 때
    if((z == 0)  && ((v_me[0] <= 10) && (1 <= v_me[0])) && ((v_me[1] <= 10) && (1 <= v_me[1])))
    {
        system("clear");
        market();   // 잡화점 함수 실행!
        while (getchar() != '\n')
        {
            continue;
        }
    }
    
    // 2.성소 갔을 때
    else if((z == 0)  && ((v_me[0] <= 29) && (20 <= v_me[0])) && ((v_me[1] <= 48) && (39 <= v_me[1])))
    {
        system("clear");
        hospital();
        while (getchar() != '\n')
        {
            continue;
        }
    }

    // 3.제련소 갔을 때
    else if((z == 0)  && ((v_me[0] <= 10) && (1 <= v_me[0])) && ((v_me[1] <= 48) && (39 <= v_me[1])))
    {
        system("clear");
        repair_shop();
        while (getchar() != '\n')
        {
            continue;
        }
    }

    // 4.인첸트 갔을 때
    else if((z == 0)  && ((v_me[0] <= 48) && (39 <= v_me[0])) && ((v_me[1] <= 10) && (1 <= v_me[1])))
    {
        system("clear");
        exchant();
        while (getchar() != '\n')
        {
            continue;
        }
    }

    // 5.은행 갔을 때
    else if((z == 0)  && ((v_me[0] <= 29) && (20 <= v_me[0])) && ((v_me[1] <= 10) && (1 <= v_me[1])))
    {
        system("clear");
        bank();
        while (getchar() != '\n')
        {
            continue;
        }
    }

    // 6.던전 갔을 때
    else if((z == 0)  && ((v_me[0] <= 48) && (39 <= v_me[0])) && ((v_me[1] <= 48) && (39 <= v_me[1])))
    {
        system("clear");
        dungeon();
        // while (getchar() != '\n')
        // {
        //     continue;
        // }
    }
};

'C언어' 카테고리의 다른 글

복피지 3/24  (0) 2025.03.24
복피지에 필요한 함수들  (0) 2025.03.24
복피지 스킬 구조체  (0) 2025.03.19
복겟몬 리뷰  (0) 2025.03.19
로또 - 사용자가 뽑는 코드 - 숫자인지 아닌지 판별  (0) 2025.03.15
'C언어' 카테고리의 다른 글
  • 복피지 3/24
  • 복피지에 필요한 함수들
  • 복피지 스킬 구조체
  • 복겟몬 리뷰
joo_coding
joo_coding
2025.02.18~
  • joo_coding
    주코딩일지
    joo_coding
  • 전체
    오늘
    어제
    • 분류 전체보기 (161) N
      • 일지 (19)
      • 계획표 (7)
      • C언어 (35)
        • 연습장 (12)
      • 과제 (2)
      • C++ (3)
      • python (28)
        • 연습장 (11)
      • TCP IP (4)
      • DB (2)
      • ubuntu (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    c언어 #vscode #gcc #윈도우 #c언어윈도우 #gcc윈도우 #vscode윈도우 #c #c++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
joo_coding
복피지 코드 > 마을맵,던전맵 추가 ver
상단으로

티스토리툴바