/* -----------------------메세지----------------------- */
// 추가해야될 변수, 함수 등등
// 위치 어디에 추가해야되는지 상세하게
// 어떤 용도인지도 주석 자세하게
/* -----------------------헤더----------------------- */
#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 village_num; /*마을에서 5개 중 어디로 갈지 결정*/
int click = 0; /*장비 구매할지 아이템 구매할지 */
int tools, weapon, cloth, shoe, cloak, head, glove; /*무기 고르기, 무기, 갑옷, 신발, 망토, 투구, 장갑*/
int medicine, health_med, magic_med, condition, move; /*약 고르기, 체력 물약, 마나 물약, 상태 회복 아이템, 이동 주문서*/
int heal, heal_3; /*성소에서 힐, 상태회복, 스탯 초기화 중 고르는 것 , 스탯 초기화 할지 고르는 것 */
int out, find, choice, pick, count, bank_count; /*모든 행동 후 나갈지 말지, 은행에서 물건을 찾을 것인지 보관할 것인지, 은행에서 몇 번 물건을 보관건지, 몇 번 물건을 찾을건지, 보관함이 얼마나 차있는지*/
int k_out, take_off; /*k에 들어가서 장비 확인하고 나갈건지, 무기 해제*/
int tmp=0; // 엔터 누르면 넘어감
int att_fir_choice;
// 소비템 관련
int red = 0, orange = 0, pure = 0; /*빨간 물약, 주황 물약, 맑은 물약*/
int blue, white, rainbow; /*파란 물약, 하얀 물약, 무지개 물약*/
int all_heal; /*엘릭서*/
int haedock, blessing, manbung; /* 해독제, 축복 주문서, 만병 통치약*/
int move_to_town, sungan_idong; /*마을 이동 주문서, 순간 이동 주문서*/
int item_choice; /* 아이템 고르는 변수*/
// 용사복이 상태창 (능력치)
int money = 100;
int LEVEL = 1;
int hp = 100, mp = 10;
int max_hp = 100, max_mp = 140;
int power = 20, magic_power, aviod_rate, critical, defen; // 공,마공,회피,치명타, 방어
int STR=STR_BASIC, DEX=DEX_BASIC, INT=INT_BASIC; // 보너스 스탯 포인트를 하면 올릴 수 있음/
int overdose, curse; // 중독, 저주
int bonus_point = 0; // 보너스 스텟 포인트*/
int max_exp = 100, exp = 10, nam_exp; // 경험치통 최대크기, 얻는 경험치
int inv_count = 0, inv_out, inv_see, wearing, change; //인벤토리에 장비가 몇 개 있는지, 인벤토리에서 나갈건지, 인벤토리에서 장비 착용, 장비 변경
// 몬스터 관련 초기값
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 portal_i, portal_j, monster_i, monster_j; // 포탈과 몬스터 좌표 변수
// 전투 관련
int att_choice; // 어떤 공격할건지
/* -----------------------아이템 목록----------------------- */
// 1. 장비
// (1.타입 2.등급 3.공격력 4.마법배율 5.치명타율 6.회피율 7.방어력 8.가격)
// 타입 = 용복이 착용 상태 (1~5)
EquipmentItem EquipmentItems[] =
{
//무기
{"맨손", 1, 0, 0, 0, 0, 0, 0, 0},
{"기본검", 1, 1, 2, 0, 0, 0, 0, 50},
{"장검", 1, 2, 10, 0, 0, 0, 0, 500},
{"일본도", 1, 3, 20, 0, 0, 0, 0,10000},
{"싸울아비 장검", 1, 4, 40, 0, 0, 0, 0, 0},
{"혼돈의 검", 1, 5, 50, 0, 30, 0, 0, 0},
{"천사천하제일 무쌍도", 1, 5, 100, 0, 0, 0, 0},
{"마왕을 멸하는 마검", 1, 5, 50, 5, 0, 0, 0, 0},
{"운영자검", 1, 6, 1111, 0, 0, 0, 0, 0},
//갑옷
{"가죽갑옷", 2, 1, 0, 0, 0, 0, 2, 50},
{"철갑옷", 2, 2, 0, 0, 0, 0, 6, 600},
{"강철갑옷", 2, 3, 0, 0, 0, 0, 12, 0},
{"미스릴갑옷", 2, 4, 0, 0, 0, 0, 20, 0},
{"진격하는자의갑옷", 2, 5, 0, 20, 0, 0, 20, 0},
{"정화의갑주", 2, 5, 0, 0, 0, 0, 20, 0}, // 상태 이상 안걸림 해결 안됨
//신발
{"가죽신발", 3, 1, 0, 0, 0, 0, 1, 50},
{"철신발", 3, 2, 0, 0, 0, 0, 3, 600},
{"미스릴신발", 3, 4, 0, 0, 0, 0, 8, 0},
{"포세이돈의신발", 3, 5, 0, 0, 0, 0, 8, 0}, //상태 이상 안걸림 해결 안됨
{"헤르메스의 신발", 3, 5, 0, 0, 0, 20, 8, 0},
{"하데스의 신발", 3, 5, 10, 0, 0, 8, 0},
//망토
{"천망토", 4, 1, 0, 0, 0, 0, 1, 50},
{"면망토", 4, 2, 0, 0, 0, 0, 3, 600},
{"비단망토", 4, 3, 0, 0, 0, 0, 6, 0},
{"마법망토", 4, 4, 0, 0, 0, 0, 8, 0},
{"순백의망토", 4, 5, 0, 0, 0, 0, 20, 0},
{"용기의망토", 4, 5, 10, 0, 0, 0, 8, 0},
{"진홍의망토", 4, 5, 0, 0, 20, 0, 8, 0},
//투구
{"가죽투구", 5, 1, 0, 0, 0, 0, 1, 50},
{"철투구", 5, 2, 0, 0, 0, 0, 3, 600},
{"강철투구", 5, 3, 0, 0, 0, 0, 6, 0},
{"미스릴투구", 5, 4, 0, 0, 0, 0, 8, 0},
{"용사의투구", 5, 5, 0, 0, 0, 0, 8, 0}, //받는 데미지 감소 +10% 누락
{"용기사투구", 5, 5, 10, 0, 0, 0, 8, 0},
{"기묘한두건", 5, 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}; // 내가 만난 몬스터 배열
/* -----------------------가방----------------------- */
// 아이템창 i
ConsumableItem Item_pocket[1300]; // 12x99개
//인벤토리 창 j
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}};
EquipmentItem temp[1] = {{0}};
// 장비창 k
// 1 : 무기, 2: 갑옷, 3 : 신발, 4: 망토, 5: 투구 6 : 장갑
EquipmentItem now_wear[] = {{"비어있음", 1, 0, 0, 0, 0, 0, 0, 0}, {"비어있음", 2, 0, 0, 0, 0, 0, 0, 0}, {"비어있음", 3, 0, 0, 0, 0, 0, 0, 0}, {"비어있음", 4, 0, 0, 0, 0, 0, 0, 0}, {"비어있음", 5, 0, 0, 0, 0, 0, 0, 0}, {"비어있음", 6, 0, 0, 0, 0, 0, 0, 0}};
// 재료창 m
MaterialItem Material_Pocket[1000];
// 은행창
EquipmentItem Bank[100] = {{"비어있음", 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}, {"비어있음", 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}, {"비어있음", 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}, {"비어있음", 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}, {"비어있음", 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}};
/* -----------------------함수이름----------------------- */
void village();
// 마켓
void market();
void hospital();
void repair_shop();
void exchant();
void bank();
void dungeon();
void show_inven();
void show_bank();
void show_now();
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();
void key_key_();
/* -----------------------메인----------------------- */
int main()
{
village();
}
/* -----------------------함수----------------------- */
void key_key_() // I J K M 눌렀을 때
{
if ((input == 'I') || (input == 'i')) // 아이템사용
{
system("clear");
printf("아이템사용!!\n");
// 아이템창
while (getchar() == '\n')
{
continue;
}
}
else if ((input == 'J') || (input == 'j'))
{
system("clear");
printf("인벤토리!!\n");
show_inven();
while (getchar() == '\n')
{
continue;
}
}
else if ((input == 'K') || (input == 'k'))
{
system("clear");
printf("착용 중인 장비 확인!!\n");
show_now();
while (getchar() == '\n')
{
continue;
}
}
else if ((input == 'M') || (input == 'm'))
{
system("clear");
printf("재료창!!\n");
while (getchar() == '\n')
{
continue;
}
}
else if ((input == 'B') || (input == 'b'))
{
system("clear");
printf("스텟창!!\n");
stat_point();
while (getchar() == '\n')
{
continue;
}
}
}
// void level_up()
// {
// exp += ( 20 + nam_exp);
// if (exp >= max_exp) // 얻은 exp가 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 stat_point()
{
// 작성중 - 예솜
}
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() // 있는것만 출력
{
printf("[ 현재 보관함 현황 ]\n\n");
// 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'); // 엔터 누르면 넘어감
}
printf("\n");
// 뱅크에 뭐가 있는지 없는지 판별하려면? 길이? 카운트 보면될듯?!
// 뱅크카운트=0 으로 초기화하고 조건식 써보자!
}
void show_now()
{
// k를 누른 뒤 현재 장비 착용 현황을 보여줌
while (99)
{
// k 누르면 착용중인 장비 보여주고
for (int i = 0; i < 6; i++)
{
printf("현재 착용중인 장비는 %s\n", now_wear[i].name);
}
printf("\n(k) 나가기\n");
scanf("%d", &inv_out);
if (inv_out == 1) //나가기
{
break;
}
else
break;
}
}
void show_inven() /*인벤토리 창*/
{
while (1)
{
printf("\n[보유 장비템 목록]\n\n"); /*인벤토리에 보유중인 장비템 출력*/
for (int i = 0; i < 10; i++)
{
printf(" [% d]:%s\n", i, Inventory[i].name);
}
for (int i = 10; i < 20; i++)
{
printf(" [%d]:%s\n", i, Inventory[i].name);
}
printf("\n");
printf("1 : 나가기\n2 : 장비 자세히 보기");
scanf("%d", &inv_out);
if (inv_out == 1) //나가기
break;
else if (inv_out == 2) /*장비 자세히 보기*/
{
printf("\n몇 번 장비를 보시겠습니까?\n");
scanf("%d", &inv_see);
for (int i = 0; i < 21; i++) // 현재 인벤토리 뭐있는지 보여줌
{
if ((Inventory[i].tier > 0) && (inv_see == i)) /*인벤토리 i번의 장비의 티어가 0이상이고, 몇번인지 선택한 숫자와 i가 같을 때*/
{
printf("1. 장비 : %s\n2. 등급 : %d\n3. 공격력 : %d\n4. 마법배율: %d\n5. 치명타율 : %d\n6. 회피율 : %d\n7. 방어력 : %d\n", Inventory[i].name, Inventory[i].tier, Inventory[i].attack, Inventory[i].a_magic, Inventory[i].critical, Inventory[i].avoid, Inventory[i].defense);
printf("\n(1) 장비착용 (2) 나가기\n");
scanf("%d", &wearing); // 1,2번 중 선택
if (wearing == 1) /*착용을 선택했을 때*/
{
for (int j = 0; j <= 6; j++)//now wear가 6개 있으므로 6번 반복
{
if (strcmp(now_wear[j].name, "비어있음") == 0) /*now_wear 가 비어있을 때 */
{
for ( int k = 0; k <=42; k++)/*장비의 개수만큼 k로 훑는다*/
{
if (Inventory[i].type == EquipmentItems[k].type) // 내가 고른 장비템의 타입이 EquipmentItems와 타입이 같을 때
{ // 무갑신망투장 123456
temp[0] = now_wear[j]; /*temp를 사용해서 장비 - 현재 입은 것 바꾸기*/
now_wear[j] = Inventory[i];
Inventory[i] = temp[0];
power = power + now_wear[k].attack; // 장비에 따른 공격력 업그레이드
magic_power = magic_power + now_wear[k].a_magic; // 마법 공격력 업그레이드
aviod_rate = aviod_rate + now_wear[k].avoid; // 회피율 얻그레이드
critical = critical + now_wear[k].critical; // 치명타율 업그레이드
defen = defen + now_wear[k].defense; // 방어력 업그레이드
break;
}
}
printf("현재 착용중인 장비: [%s]\n", now_wear[j].name);
break;
}
//현재 착용중인 장비의 타입과 입력한 값이 같고 now_wear가 비어있지 않을 때
else if ((now_wear[j].type == Inventory[i].type) && (strcmp(now_wear[j].name, "비어있음") != 0))
{
printf("이미 %s 착용중인 상태입니다.\n", now_wear[j].name);
printf("[%s]로 변경하시려면 0번 나가려면 1번을 눌러주세요.\n", Inventory[i].name);
scanf("%d", &change);
if (change == 0) //변경한다
{
temp[0] = now_wear[j]; /*temp를 사용해서 장비 - 현재 입은 것 바꾸기*/
now_wear[j] = Inventory[i];
Inventory[i] = temp[0];
printf("현재 착용중인 장비는 %s\n", now_wear[j].name); // 현재 내가 착용하고있는거
break;
}
}
}
}
//나가기
else if (wearing == 2)
{
break;
}
}
}
}
else // 오입력
{
printf("다시 입력해주세요.\n");
break;
}
}
}
void show_stat()
{
printf("[ 현재 용복이의 능력치 ]\n");
printf("공격력 : %d\n", power);
printf("마법공격력: %d\n", magic_power);
printf("방어력 : %d\n", defen);
printf("회피율 : %d\n", aviod_rate);
printf("치명타 : %d\n", critical);
printf("\n");
printf("STR : %d\n", STR);
printf("INT : %d\n", INT);
printf("DEX : %d\n", DEX);
}
/* --------------------마을 관련 함수-------------------- */
void village()
{
// 대업님 마을맵 코드
while (input != 'q')
{
village_map_print();
printf("\n");
// 🥚미래에 상태창이될 알들🥚
printf("🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚\n");
printf("🥚 🥚 [B] 스텟 확인 🥚 🥚\n");
printf("🥚 ");print_hp();
printf(" 🥚 [I] 아이템 확인 🥚 🥚\n");
printf("🥚 ");print_mp();
printf(" 🥚 [J] 인벤토리 확인 🥚 🥚\n");
printf("🥚 ");print_exp();
printf(" 🥚 [K] 착용장비 확인 🥚 🥚\n");
printf("🥚 🥚 [M] 재료창 확인 🥚 🥚\n");
printf("🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚\n");
input = getch();
move_(); // 이동
village_move(); // 어딘가에 도착했을 때
}
}
void market() // (사용x) 장비 종류별로 나눠놓은거
{
while (1)/*상점으로 이동*/
{
printf("잡화상입니다.\n");
printf("1번: 장비템 / 2번: 소비템 / 3번: 나가기\n");
scanf("%d", &click);
if (click == 1)/*장비 구매로 넘어감*/
{
for (int i = 0; i <= 42; i++) /* 구매가능 장비 리스트 */
{
if ((EquipmentItems[i].price) > 0) // 가격이 0원 이상인것만 출력
printf("%d번: %s(%d)\n",
i, EquipmentItems[i].name, EquipmentItems[i].price);
}
printf("\n몇 번을 구매하시겠습니까? ");
scanf("%d", &tools); // 번호 입력받기
for (int i = 0; i < 42; i++) // 뭐 구매했는지 알려줌
{
if (tools == i)
{
printf("\n%s를 구매하셨습니다. %d원입니다.\n",EquipmentItems[i].name,EquipmentItems[i].price);
money = (money - EquipmentItems[i].price);
printf("남은 돈은 %d입니다.\n",money);
for (int j = 0; j < 20; j++)
{
if (Inventory[j].tier == 0) // 내인벤토리 i인덱스의 티어값이 0이면 아이템이 없다!
{
Inventory[j] = EquipmentItems[i]; // 내가 i 번 아이템을 샀을때 인벤토리에 넣는다
break;
}
}
}
}
}
else if (click == 2)/*아이템(소모품) 구매한다고 함*/
{
printf("=소비메뉴판=\n");
for (int i = 0; i <= 12; i++) /*체력 물약의 메뉴판 */
{
if ((consumableItems[i].price) > 0)
printf("%s(%d) : %d\n", consumableItems[i].name, consumableItems[i].price, i);
}
printf("\n몇 번을 구매하시겠습니까? ");
scanf("%d",&medicine);
// for (int i = 0; i <= 12; i++)
// {
// if (health_med == i)
// {
// printf("%s를 구매하셨습니다. %d원입니다.\n",consumableItems[i].name,consumableItems[i].price);
// money = (money - consumableItems[i].price);
// printf("남은 돈은 %d입니다.\n",money);
// }
// for (int j = 0; j <= 12; j++)
// {
// if (strcmp(Item_pocket[j].name, "비어있음") == 0) // 아이템 포켓의 네임이 비어있음 이면 넣는다!
// {
// Item_pocket[j] = consumableItems[i]; // 내가 i 번 아이템을 샀을때 아이템 포켓에 넣는다
// if (i == 0)
// {
// red = red + 1;
// }
// if (i == 1)
// {
// orange = orange + 1;
// }
// if (i == 2)
// {
// pure += 1;
// }
// break;
// }
// }
// }
// printf(" 계속 구매 하려면 :0\n마을로 돌아가고 싶으면 : 1\n");
// scanf("%d", &out);
// if (out == 0)
// continue;
// else if (out == 1)
// break;
if (medicine == 1)/*체력 물약을 산다고 선택 */
{
for (int i = 0; i <= 2; i++) /*체력 물약의 메뉴판 */
{
if ((consumableItems[i].price) > 0)
printf("%s(%d) : %d\n", consumableItems[i].name, consumableItems[i].price, i);
}
scanf("%d",&health_med);
for (int i = 0; i <= 2; i++)/*체력 물약 구매 후 출력*/
{
if (health_med == i)
{
printf("%s를 구매하셨습니다. %d원입니다.\n",consumableItems[i].name,consumableItems[i].price);
money = (money - consumableItems[i].price);
printf("남은 돈은 %d입니다.\n",money);
}
}
printf(" 계속 구매 하려면 :0\n마을로 돌아가고 싶으면 : 1\n");
scanf("%d", &out);
if (out == 0)
continue;
else if (out == 1)
break;
}
if (medicine == 2)/*마법 물약을 산다고 선택 */
{
for (int i = 1; i <= 3; i++) /*마법 물약의 메뉴판 */
{
if ((consumableItems[i+2].price) > 0)
printf("%s(%d) : %d\n", consumableItems[i+2].name, consumableItems[i+2].price, i);
}
scanf("%d+2",&magic_med);
for (int i = 1; i <= 3; i++)/*마법 물약 구매 후 출력*/
{
if (magic_med == i)
{
printf("%s를 구매하셨습니다. %d원입니다.\n",consumableItems[i+2].name,consumableItems[i+2].price);
money = (money - consumableItems[i+2].price);
printf("남은 돈은 %d입니다.\n",money);
}
}
printf(" 계속 구매 하려면 :0\n마을로 돌아가고 싶으면 : 1\n");
scanf("%d", &out);
if (out == 0)
continue;
else if (out == 1)
break;
}
if (medicine == 3)/*상태 회복서를 산다고 선택 */
{
for (int i = 1; i <= 3; i++) //*상태 회복서 메뉴 보여주기 */
{
if ((consumableItems[i+6].price) > 0)
printf("%s(%d) : %d\n", consumableItems[i+6].name, consumableItems[i+6].price, i);
}
scanf("%d+6",&condition);
for (int i = 1; i <= 3; i++)/*상태 회복서 구매 후 출력*/
{
if (condition == i)
{
printf("%s를 구매하셨습니다. %d원입니다.\n",consumableItems[i+6].name,consumableItems[i+6].price);
money = (money - consumableItems[i+6].price);
printf("남은 돈은 %d입니다.\n",money);
}
}
printf(" 계속 구매 하려면 :0\n마을로 돌아가고 싶으면 : 1\n");
scanf("%d", &out);
if (out == 0)
continue;
else if (out == 1)
break;
}
if (medicine == 4)/*이동서를 산다고 선택 */
{
for (int i = 1; i <= 2; i++) /*이동서 메뉴판 */
{
if ((consumableItems[i+9].price) > 0)
printf("%s(%d) : %d\n", consumableItems[i+9].name, consumableItems[i+9].price, i);
}
scanf("%d+9",&move);
for (int i = 1; i <= 3; i++)/*이동서 구매 후 출력*/
{
if (move == i)
{
printf("%s를 구매하셨습니다. %d원입니다.\n",consumableItems[i+9].name,consumableItems[i+9].price);
money = (money - consumableItems[i+9].price);
printf("남은 돈은 %d입니다.\n",money);
}
}
printf(" 계속 구매 하려면 :0\n마을로 돌아가고 싶으면 : 1\n");
scanf("%d", &out);
if (out == 0)
continue;
else if (out == 1)
break;
}
}
else
break;
}
}
void market_() // 종류 안나누고 전체출력
{
while (99) /*상점으로 이동*/
{
printf("잡화상입니다.\n");
printf("1번: 장비템 / 2번: 소비템 / 3번: 나가기 \n");
scanf("%d", &click);
if (click == 1) // 장비를 선택 했을 때
{
for (int i = 0; i <= 42; i++) /* 구매가능 장비 리스트 */
{
if ((EquipmentItems[i].price) > 0) // 가격이 0원 이상인것만 출력
printf("%d번: %s(%d)\n",
i, EquipmentItems[i].name, EquipmentItems[i].price);
}
printf("\n몇 번을 구매하시겠습니까? ");
scanf("%d", &tools); // 번호 입력받기
for (int i = 0; i < 42; i++) // 뭐 구매했는지 알려줌
{
if (tools == i)
{
printf("%s를 구매하셨습니다. %d원입니다.\n",EquipmentItems[i].name,EquipmentItems[i].price);
money = (money - EquipmentItems[i].price);
printf("남은 돈은 %d입니다.\n",money);
for (int j = 0; j < 20; j++)
{
if (Inventory[j].tier == 0) // 내인벤토리 i인덱스의 티어값이 0이면 아이템이 없다!
{
Inventory[j] = EquipmentItems[i]; // 내가 i 번 아이템을 샀을때 인벤토리에 넣는다
break;
}
}
}
}
}
else if (click == 2) // 소비를 선택 했을 때
{
// 구매가능한 소비 리스트 출력
printf("몇 번을 구매하시겠습니까? ");
scanf("%d",&medicine); // 번호 입력받기
}
else // 나가기
break;
}
}
void hospital()
{
while (99)/*성소로 가는 것을 선택*/
{
printf("성소에 오신 것을 환영합니다!\n");
printf("현재 나의 hp는 %d\nmp는 %d입니다.",hp,mp);
printf("hp와 mp 100프로 회복하시려면 : 1\n모든 상태 이상을 회복하시려면 : 2\n모든 스텟을 초기화 하시려면 :3\n");
scanf("%d",&heal);
if (heal == 1) /*hp, mp 100%회복*/
{
hp = 100 + ((LEVEL-1) * 20) + ((STR - STR_BASIC) * 5); /*hp = 기본 체력 + ((내 레벨 -1 )*20) + ((STR-10)*5)*/
mp = 10 + ((LEVEL-1) * 10) + ((INT - INT_BASIC) * 1); /*mp = 기본 체력 + ((내 레벨 -1)*10) + ((INT -10)*1)*/
printf("현재 나의 hp는 %d\nmp는 %d입니다.\n",hp,mp);
}
if (heal == 2) /*모든 상태 이상을 회복하려면*/
{
overdose = 0; /*중독 = 0*/
curse = 0; /*저주 = 0*/
printf("상태이상을 회복합니다.\n");
}
if (heal == 3) // 스텟 초기화
{
printf("1.스텟 초기화\n2.나가기\n");
scanf("%d",&heal_3);
if (heal_3 == 1) /*스텟 초기화 STR,DEX, INT는 10으로 고정 */
{
STR = STR_BASIC;
DEX = DEX_BASIC;
INT = INT_BASIC;
bonus_point = LEVEL - 1;
printf("%d",bonus_point); /*초기화 후 쌓을 수 있는 스텟 포인트, 추후에 스텟을 쌓을 때 사용 */
}
if (heal_3 == 2)
{
continue;
}
}
printf("성소에 더 있으려면 :0\n마을로 돌아가고 싶으면 : 1\n"); /*계속 성소에 남아 있을지, 마을로 돌아갈지 물어봄*/
scanf("%d", &out);
if (out == 0)
continue;
else if (out == 1)
break;
else
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 (99)/*은행을 선택했을때*/
{
printf("은행입니다.\n");
show_bank();
printf("1.보관 / 2.찾기 / 3.나가기\n");
scanf("%d", &find);
if (find == 1)/*물건을 보관*/
{
printf("인벤토리에서 보관할 물건의 번호를 선택해주세요.");
scanf("%d",&choice);
for (int i = 0; i <21 ;i++) /*인벤토리를 0-20까지 for문으로 체크*/
{
if (choice == i) /*인벤토리에서 보관할 물건의 번호*/
{
printf("%s을 보관하셨습니다. \n",Inventory[i].name);
for (int j = 0; j < 100; j++)/* j로 0~100까지 반복해서 i와 같은지 체크*/
{
if (Bank[j].tier == 0) // 내 인벤토리 i인덱스의 티어값이 0이면 아이템이 없다!
{
Bank [j] = Inventory[i]; // inventory[i]번에 있는 아이템을 은행 보관함에 넣는다
Inventory[i] = EquipmentItems[35]; /*인벤토리에서 아이템 빠진 자리를 빈칸으로 */
break;
}
}
}
}
}
if (find == 2)/*물건을 찾으러 옴*/
{
printf("보관함을 보여드릴게요!\n");
for (int i = 0; i < 100; i++) /*보관함 출력*/
{
if (Bank[i].tier > 0)/*현재 있는 것만 출력*/
{
printf("[%d]: %s\n ", i ,Bank[i].name);
count += 1;/*현재 몇 개 있는지 카운트*/
}
}
printf("현재 %d/100개 있습니다.",count);
printf("몇 번 물건이 필요하신가요?\n");/*pick을 사용해서 필요한 물건의 번호를 받는다*/
scanf("%d", &pick);
for (int j = 0; j < 100; j++)/*0~101까지 반복한다*/
{
for (int k = 0; k < 20; k++)/*인벤토리를 20번 반복해서 티어값이 있는지 확인, 티어값이 0이면 넣는다*/
{
if ((Inventory[k].tier == 0) && (Bank[j].tier > 0) && (pick == j))/*(인벤토리 티어가 0 즉, 비어있으면), (뱅크에 있는 무기 티어가 0이상 ), (픽 = 원하는 번호 일 때)*/
{
printf("%s를 돌려드릴게요! 1000원입니다.\n", Bank[j].name);
Inventory[k] = Bank [j]; /*인벤토리에 bank j번호 에 있는 물건을 넣는다.*/
Bank [j]= EquipmentItems[35]; /*보관함 j를 비워준다 */
break;
}
}
}
money = (money - 1000);/*돈 차감*/
}
else // 3.나가기
break;
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 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 == 'w'))) && (v_me[0] > 0)) // w를 입력받고 내 y좌표(반복문에서 i)가 0보다 클때
{
v_me[0]--;
}
else if((((input == 'S') || (input == 's'))) && (v_me[0] < SIZE - 1)) // s를 입력받고 내 y좌표(반복문에서 i)가 SIZE보다 작을때
{
v_me[0]++;
}
else if((((input == 'A') || (input == 'a'))) && (v_me[1] > 0)) // a를 입력받고 내 x좌표(반복문에서 j)가 0보다 클때
{
v_me[1]--;
}
else if((((input == 'D') || (input == 'd'))) && (v_me[1] < SIZE - 1)) // d를 입력받고 내 x좌표(반복문에서 j)가 SIZE보다 작을
{
v_me[1]++;
}
key_key_(); // 단축키
};
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(); // 잡화점 함수 실행!
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;
// }
}
};
/* ------------------던전 관련 함수------------------ */
void dungeon_()
{
z = 1;
dungeon_map();
while (1)
{
dungeon_map_print();
// 🥚미래에 상태창이될 알들🥚
printf("🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚🥚\n");
printf("🥚 🥚 [I] 아이템 확인 🥚\n");
printf("🥚 ");print_hp();
printf(" 🥚 [J] 인벤토리 확인 🥚\n");
printf("🥚 ");print_mp();
printf(" 🥚 [K] 착용장비 확인 🥚\n");
printf("🥚 ");print_exp();
printf(" 🥚 [M] 재료창 확인 🥚\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') || (input == 'w'))) && (map[z][me[0] - 1][me[1]] != 1)) // w를 입력받고 내 y좌표(반복문에서 i)가 0보다 클때
{
me[0]--;
}
else if((((input == 'S') || (input == 's'))) && (me[0] < SIZE - 2) && (map[z][me[0] + 1][me[1]] != 1)) // s를 입력받고 내 y좌표(반복문에서 i)가 SIZE보다 작을때
{
me[0]++;
}
else if((((input == 'A') || (input == 'a'))) && (me[1] > 1) && (map[z][me[0]][me[1] - 1] != 1)) // a를 입력받고 내 x좌표(반복문에서 j)가 0보다 클때
{
me[1]--;
}
else if((((input == 'D') || (input == 'd'))) && (me[1] < SIZE - 2) && (map[z][me[0]][me[1] + 1] != 1)) // d를 입력받고 내 x좌표(반복문에서 j)가 SIZE보다 작을
{
me[1]++;
}
};
void print_exp() // 경험치를 상태창에 출력하는 함수
{
printf("EXP : ");
int exp_ten = max_exp / 10; // 경험치의 10프로를 저장
int exp_print = 0; // 내가 출력해줄 🟨 갯수 정하기
if ((0 < exp) && (exp < exp_ten)) // 현재 경험치가 0 보다크고 10프로보다 같거나 작을때
{
exp_print = 0; // 출력할 🟨 갯수를 + 1
}
else if ((exp < exp_ten * 2))
{
exp_print = 1;
}
else if ((exp < exp_ten * 3))
{
exp_print = 2;
}
else if ((exp < exp_ten * 4))
{
exp_print = 3;
}
else if ((exp < exp_ten * 5))
{
exp_print = 4;
}
else if ((exp < exp_ten * 6))
{
exp_print = 5;
}
else if ((exp < exp_ten * 7))
{
exp_print = 6;
}
else if ((exp < exp_ten * 8))
{
exp_print = 7;
}
else if ((exp < exp_ten * 9))
{
exp_print = 8;
}
else
{
exp_print = 9;
}
for (int i = 0; i < 10; i++)
{
if(exp_print > 0) // 내가 출력해줄 🟨 갯수가 있는지 확인
{
printf("🟨"); // 출력해주기
exp_print --; // 갯수 차감
}
else
{
printf("⬜"); // 나머지는 하양색
}
}
};
void print_hp()
{
printf("H P : ");
int hp_ten = max_hp / 10; // 경험치의 10프로를 저장
int hp_print = 0; // 내가 출력해줄 🟥 갯수 정하기
if ((0 < hp) && (hp <= hp_ten)) // 현재 경험치가 0 보다크고 10프로보다 같거나 작을때
{
hp_print = 1; // 출력할 🟥 갯수를 + 1
}
else if ((hp <= hp_ten * 2))
{
hp_print = 2;
}
else if ((hp <= hp_ten * 3))
{
hp_print = 3;
}
else if ((hp <= hp_ten * 4))
{
hp_print = 4;
}
else if ((hp <= hp_ten * 5))
{
hp_print = 5;
}
else if ((hp <= hp_ten * 6))
{
hp_print = 6;
}
else if ((hp <= hp_ten * 7))
{
hp_print = 7;
}
else if ((hp <= hp_ten * 8))
{
hp_print = 8;
}
else if ((hp < hp_ten * 10))
{
hp_print = 9;
}
else
{
hp_print = 10;
}
for (int i = 0; i < 10; i++)
{
if(hp_print > 0) // 내가 출력해줄 🟥 갯수가 있는지 확인
{
printf("🟥"); // 출력해주기
hp_print --; // 갯수 차감
}
else
{
printf("⬜"); // 나머지는 하양색
}
}
};
void print_mp()
{
printf("M P : ");
int mp_ten = max_mp / 10; // 경험치의 10프로를 저장
int mp_print = 0; // 내가 출력해줄 🟦 갯수 정하기
if ((0 < mp) && (mp <= mp_ten)) // 현재 경험치가 0 보다크고 10프로보다 같거나 작을때
{
mp_print = 1; // 출력할 🟦 갯수를 + 1
}
else if ((mp <= mp_ten * 2))
{
mp_print = 2;
}
else if ((mp <= mp_ten * 3))
{
mp_print = 3;
}
else if ((mp <= mp_ten * 4))
{
mp_print = 4;
}
else if ((mp <= mp_ten * 5))
{
mp_print = 5;
}
else if ((mp <= mp_ten * 6))
{
mp_print = 6;
}
else if ((mp <= mp_ten * 7))
{
mp_print = 7;
}
else if ((mp <= mp_ten * 8))
{
mp_print = 8;
}
else if ((mp < mp_ten * 10))
{
mp_print = 9;
}
else
{
mp_print = 10;
}
for (int i = 0; i < 10; i++)
{
if(mp_print > 0) // 내가 출력해줄 🟦 갯수가 있는지 확인
{
printf("🟦"); // 출력해주기
mp_print --; // 갯수 차감
}
else
{
printf("⬜"); // 나머지는 하양색
}
}
};
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;
}
key_key_();
}
void battle_() // 전투 함수
{
// 작성중 - 대업
}