Top 34 C 언어 텍스트 Rpg Best 232 Answer

You are looking for information, articles, knowledge about the topic nail salons open on sunday near me c 언어 텍스트 rpg on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://chewathai27.com/to team, along with other related topics such as: c 언어 텍스트 rpg C 텍스트 RPG 게임, c언어 턴제게임, C언어 미니게임, C 텍스트 게임, 텍스트 RPG, 텍스트 RPG 만들기, C언어 소스 코드 모음, c언어 게임


C언어/C++강의 23화 TextRPG 1 [어소트락 게임아카데미]
C언어/C++강의 23화 TextRPG 1 [어소트락 게임아카데미]


C++로 Text RPG게임 처음부터만들기 : 네이버 블로그

  • Article author: m.blog.naver.com
  • Reviews from users: 8204 ⭐ Ratings
  • Top rated: 3.5 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about C++로 Text RPG게임 처음부터만들기 : 네이버 블로그 전에 간단하게 Text RPG게임을 만들었었습니다. 겉만 화려고 코딩은 지저분했었습니다. 이번에 함수를 배운 기념으로 …
  • Most searched keywords: Whether you are looking for C++로 Text RPG게임 처음부터만들기 : 네이버 블로그 전에 간단하게 Text RPG게임을 만들었었습니다. 겉만 화려고 코딩은 지저분했었습니다. 이번에 함수를 배운 기념으로
  • Table of Contents:

카테고리 이동

삘더떤더

이 블로그 
C++ 복습용TextRPG
 카테고리 글

카테고리

이 블로그 
C++ 복습용TextRPG
 카테고리 글

C++로 Text RPG게임 처음부터만들기 : 네이버 블로그
C++로 Text RPG게임 처음부터만들기 : 네이버 블로그

Read More

[C++] Text RPG :: devKid

  • Article author: hiphoon.tistory.com
  • Reviews from users: 7085 ⭐ Ratings
  • Top rated: 3.6 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [C++] Text RPG :: devKid C++ 강의를 들으면서 Text RPG를 만들어 보았다. · 아래는 게임 실행 화면의 일부이다. · 그리고 소스파일이다 한 500줄정도 되는거같다.. …
  • Most searched keywords: Whether you are looking for [C++] Text RPG :: devKid C++ 강의를 들으면서 Text RPG를 만들어 보았다. · 아래는 게임 실행 화면의 일부이다. · 그리고 소스파일이다 한 500줄정도 되는거같다.. C++로 간단하게 만든 Text RPG C++ 강의를 들으면서 Text RPG를 만들어 보았다. 아래는 게임 실행 화면의 일부이다. 그리고 소스파일이다 한 500줄정도 되는거같다.. 위 실행파일 외에도 상점기능, 인벤토리 기능…
  • Table of Contents:
[C++] Text RPG

C++로 간단하게 만든 Text RPG

티스토리툴바

[C++] Text RPG :: devKid
[C++] Text RPG :: devKid

Read More

Chapter 4. Text RPG – 평생 공부 블로그 : Today I Learned‍ 🌙

  • Article author: ansohxxn.github.io
  • Reviews from users: 9603 ⭐ Ratings
  • Top rated: 3.6 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about Chapter 4. Text RPG – 평생 공부 블로그 : Today I Learned‍ 🌙 Text RPG. Date: 2020.11.20 Updated: 2020.11.20. 카테고리: C Sharp. 태그: C Sharp Programming. 목차. ‍♀️ 직업 고르기; 플레이어 생성 … …
  • Most searched keywords: Whether you are looking for Chapter 4. Text RPG – 평생 공부 블로그 : Today I Learned‍ 🌙 Text RPG. Date: 2020.11.20 Updated: 2020.11.20. 카테고리: C Sharp. 태그: C Sharp Programming. 목차. ‍♀️ 직업 고르기; 플레이어 생성 … 인프런에 있는 Rookiss님의 강의 Part1: C# 기초 프로그래밍 입문 를 듣고 정리한 필기입니다. 😀
  • Table of Contents:

Skip links

👱‍♀️ 직업 고르기

👩🏼 플레이어 생성

👩🏼 몬스터 생성

👩🏼 전투

👩‍🦰 전체 코드

Chapter 4. Text RPG -  평생 공부 블로그 : Today I Learned‍ 🌙
Chapter 4. Text RPG – 평생 공부 블로그 : Today I Learned‍ 🌙

Read More

C/C++ 강의 : TextRPG (플레이어, 몬스터, 전투, 상점) [어소트락 유튜브] :: 코딩하는 까마귀

  • Article author: crobbit-kent.tistory.com
  • Reviews from users: 12440 ⭐ Ratings
  • Top rated: 4.9 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about C/C++ 강의 : TextRPG (플레이어, 몬스터, 전투, 상점) [어소트락 유튜브] :: 코딩하는 까마귀 특징 : 1. 강의 20화에서 했던 메뉴 구현을 적용시켜서 턴제 Text RPG를 구현. 2. 상점에서 무기 팔기 기능은 아직 구현 … …
  • Most searched keywords: Whether you are looking for C/C++ 강의 : TextRPG (플레이어, 몬스터, 전투, 상점) [어소트락 유튜브] :: 코딩하는 까마귀 특징 : 1. 강의 20화에서 했던 메뉴 구현을 적용시켜서 턴제 Text RPG를 구현. 2. 상점에서 무기 팔기 기능은 아직 구현 … 날짜 : 190517 주제 : TextRPG (플레이어, 몬스터, 전투, 상점) 특징 : 1. 강의 20화에서 했던 메뉴 구현을 적용시켜서 턴제 Text RPG를 구현. 2. 상점에서 무기 팔기 기능은 아직 구현하지 않음 3. 지도 eas..게임 개발 프로그래머 지망생……

    공부 중인 것들 = < Unity3D>, < WinAPI >, < C++ >, < C >

    GitHub : https://github.com/crobbit-kent

  • Table of Contents:
C/C++ 강의 : TextRPG (플레이어, 몬스터, 전투, 상점) [어소트락 유튜브] :: 코딩하는 까마귀
C/C++ 강의 : TextRPG (플레이어, 몬스터, 전투, 상점) [어소트락 유튜브] :: 코딩하는 까마귀

Read More

C++ Text RPG

  • Article author: s-w-von.tistory.com
  • Reviews from users: 41369 ⭐ Ratings
  • Top rated: 3.1 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about C++ Text RPG C++ Text RPG · 개발 공부/C++. 2020. 10. 8. 00:37. #include using namespace std; typedef struct tagInfo { char szName[16]; int iAtt; int iMaxHp; …
  • Most searched keywords: Whether you are looking for C++ Text RPG C++ Text RPG · 개발 공부/C++. 2020. 10. 8. 00:37. #include using namespace std; typedef struct tagInfo { char szName[16]; int iAtt; int iMaxHp; #include using namespace std; typedef struct tagInfo { char szName[16]; int iAtt; int iMaxHp; int iHp; }INFO; INFO* Create_Object(char* _pName, int _iAtt, int _iMaxHp); INFO* Select_Playe..공부 정리용 블로그
  • Table of Contents:

C++ Text RPG

티스토리툴바

C++ Text RPG
C++ Text RPG

Read More

9일 : 다형성을 이용해 간단한 텍스트 RPG 만들기

  • Article author: violetababel.tistory.com
  • Reviews from users: 32618 ⭐ Ratings
  • Top rated: 3.0 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 9일 : 다형성을 이용해 간단한 텍스트 RPG 만들기 9일 : 다형성을 이용해 간단한 텍스트 RPG 만들기. Beabletoet 2018. 2. 20. 14:48 … w(3); b(1); s(2); w(3); s(1); w(15); b(1); w(1); c();. …
  • Most searched keywords: Whether you are looking for 9일 : 다형성을 이용해 간단한 텍스트 RPG 만들기 9일 : 다형성을 이용해 간단한 텍스트 RPG 만들기. Beabletoet 2018. 2. 20. 14:48 … w(3); b(1); s(2); w(3); s(1); w(15); b(1); w(1); c();. 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..
  • Table of Contents:

VioletaBabel

9일 다형성을 이용해 간단한 텍스트 RPG 만들기 본문

9일 : 다형성을 이용해 간단한 텍스트 RPG 만들기
9일 : 다형성을 이용해 간단한 텍스트 RPG 만들기

Read More

[C++] TEXT RPG

  • Article author: velog.io
  • Reviews from users: 33306 ⭐ Ratings
  • Top rated: 4.7 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [C++] TEXT RPG 플레이 영상. 국비과정 한달차에 만든 게임! 완성 스샷들 주르륵 보니 좀 뿌듯하다. 지난 주에 c++ 배운 것으로 text rpg 제작하기 과제를 받았다. …
  • Most searched keywords: Whether you are looking for [C++] TEXT RPG 플레이 영상. 국비과정 한달차에 만든 게임! 완성 스샷들 주르륵 보니 좀 뿌듯하다. 지난 주에 c++ 배운 것으로 text rpg 제작하기 과제를 받았다. C++ 언어로 만든 콘솔창에서 동작하는 텍스트 알피지
  • Table of Contents:
[C++] TEXT RPG
[C++] TEXT RPG

Read More


See more articles in the same category here: https://chewathai27.com/to/blog.

[C++] Text RPG

C++로 간단하게 만든 Text RPG

C++ 강의를 들으면서 Text RPG를 만들어 보았다.

아래는 게임 실행 화면의 일부이다.

그리고 소스파일이다 한 500줄정도 되는거같다..

위 실행파일 외에도 상점기능, 인벤토리 기능이 구현되어있다.

#include #include using namespace std; /* 1. 무기상점에서 판매할 아이템 목록을 만들어주고 해당 목록을 출력해준다. 2. 출력할때 앞에 번호를 부여해주고 번호를 입력받아서 해당 번호의 아이템을 구입하게 해준다. 가장 마지막 번호에 뒤로가기 기능을 만든다. 단, 가방이 꽉 찼거나 돈이 부족할 경우 구매하지 못하게 한다. 3. 가방을 선택하면 가방안의 아이템을 보여준다. */ enum MAIN_MENU { MM_NONE, MM_MAP, MM_STORE, MM_INVENTORY, MM_EXIT }; enum MAP_TYPE { MT_NONE, MT_EASY, MT_NORMAL, MT_HARD, MT_BACK }; enum JOB { JOB_NONE, JOB_KNIGHT, JOB_ARCHER, JOB_WIZARD, JOB_END }; enum BATTLE { BATTLE_NONE, BATTLE_ATTACK, BATTLE_BACK }; enum ITEM_TYPE { IT_NONE, IT_WEAPON, IT_ARMOR, IT_BACK }; enum ITEM_ATTACK_TYPE { IAT_NONE, IAT_WOODSWORD, IAT_STONESWORD }; enum STORE_MENU { SM_NONE, SM_WEAPON, SM_ARMOR, SM_BACK }; #define NAME_SIZE 32 #define ITEM_DESC_LENGTH 512 #define INVENTORY_MAX 20 #define STORE_WEAPON_MAX 3 #define STORE_ARMOR_MAX 3 struct _tagItem { char strName[NAME_SIZE]; char strTypeName[NAME_SIZE]; ITEM_TYPE eType; int iMin; int iMax; int iPrice; int iSell; char strDesc[ITEM_DESC_LENGTH]; }; struct _tagInventory { _tagItem tItem[INVENTORY_MAX]; int iItemCount; int iGold; }; struct _tagPlayer { char strName[NAME_SIZE]; char strJobName[NAME_SIZE]; JOB eJob; int iAttackMin; int iAttackMax; int iArmorMin; int iArmorMax; int iHP; int iHPMax; int iMP; int iMPMax; int iExp; int iLevel; _tagInventory tInventory; }; struct _tagMonster { char strName[NAME_SIZE]; int iAttackMin; int iAttackMax; int iArmorMin; int iArmorMax; int iHP; int iHPMax; int iMP; int iMPMax; int iLevel; int iExp; int iGoldMin; int iGoldMax; }; int main() { srand((unsigned int) time(0)); // 게임을 시작할때 플레이어 정보를 설정하게 한다. _tagPlayer tPlayer = {}; // 플레이어 이름을 입력받는다. cout << "이름 : "; cin.getline(tPlayer.strName, NAME_SIZE - 1); int iJob = JOB_NONE; while (iJob == JOB_NONE) { system("cls"); cout << "1. 기사" << endl; cout << "2. 궁수" << endl; cout << "3. 마법사" << endl; cout << "직업을 선택하세요 : "; cin >> iJob; if (cin.fail()) { cin.clear(); cin.ignore(1024, ‘

‘); continue; } else if (iJob <= JOB_NONE || iJob >= JOB_END) { iJob = JOB_NONE; } tPlayer.iLevel = 1; tPlayer.iExp = 0; tPlayer.eJob = (JOB)iJob; tPlayer.tInventory.iGold = 10000; tPlayer.tInventory.iItemCount = 0; switch (tPlayer.eJob) { case JOB_KNIGHT: strcpy_s(tPlayer.strJobName, “기사”); tPlayer.iAttackMin = 5; tPlayer.iAttackMax = 10; tPlayer.iArmorMin = 15; tPlayer.iArmorMax = 20; tPlayer.iHPMax = 500; tPlayer.iHP = 500; tPlayer.iMP = 100; tPlayer.iMPMax = 100; break; case JOB_ARCHER: strcpy_s(tPlayer.strJobName, “궁수”); tPlayer.iAttackMin = 10; tPlayer.iAttackMax = 15; tPlayer.iArmorMin = 10; tPlayer.iArmorMax = 15; tPlayer.iHPMax = 400; tPlayer.iHP = 400; tPlayer.iMP = 200; tPlayer.iMPMax = 200; break; case JOB_WIZARD: strcpy_s(tPlayer.strJobName, “마법사”); tPlayer.iAttackMin = 15; tPlayer.iAttackMax = 20; tPlayer.iArmorMin = 5; tPlayer.iArmorMax = 10; tPlayer.iHPMax = 300; tPlayer.iHP = 300; tPlayer.iMP = 300; tPlayer.iMPMax = 300; break; } } // 몬스터를 생성한다. _tagMonster tMonsterArr[MT_BACK – 1] = {}; // 고블린 생성 strcpy_s(tMonsterArr[0].strName, “고블린”); tMonsterArr[0].iAttackMin = 20; tMonsterArr[0].iAttackMax = 30; tMonsterArr[0].iArmorMin = 2; tMonsterArr[0].iArmorMax = 5; tMonsterArr[0].iHP = 100; tMonsterArr[0].iHPMax = 100; tMonsterArr[0].iMP = 10; tMonsterArr[0].iMPMax = 10; tMonsterArr[0].iLevel = 1; tMonsterArr[0].iExp = 1000; tMonsterArr[0].iGoldMin = 500; tMonsterArr[0].iGoldMax = 1500; // 트롤 생성 strcpy_s(tMonsterArr[1].strName, “트롤”); tMonsterArr[1].iAttackMin = 80; tMonsterArr[1].iAttackMax = 130; tMonsterArr[1].iArmorMin = 60; tMonsterArr[1].iArmorMax = 90; tMonsterArr[1].iHP = 2000; tMonsterArr[1].iHPMax = 2000; tMonsterArr[1].iMP = 100; tMonsterArr[1].iMPMax = 100; tMonsterArr[1].iLevel = 5; tMonsterArr[1].iExp = 7000; tMonsterArr[1].iGoldMin = 6000; tMonsterArr[1].iGoldMax = 8000; // 드래곤 생성 strcpy_s(tMonsterArr[2].strName, “드래곤”); tMonsterArr[2].iAttackMin = 250; tMonsterArr[2].iAttackMax = 500; tMonsterArr[2].iArmorMin = 200; tMonsterArr[2].iArmorMax = 400; tMonsterArr[2].iHP = 30000; tMonsterArr[2].iHPMax = 30000; tMonsterArr[2].iMP = 20000; tMonsterArr[2].iMPMax = 20000; tMonsterArr[2].iLevel = 10; tMonsterArr[2].iExp = 30000; tMonsterArr[2].iGoldMin = 20000; tMonsterArr[2].iGoldMax = 50000; // 상점에서 판매할 아이템 목록 생성한다. _tagItem tStoreWeapon[STORE_WEAPON_MAX] = {}; _tagItem tStoreArmor[STORE_ARMOR_MAX] = {}; // 각 아이템 정보들을 설정해준다. //나무검 생성 strcpy_s(tStoreWeapon[0].strName, “나무검”); strcpy_s(tStoreWeapon[0].strTypeName, “무기”); tStoreWeapon[0].eType = (ITEM_TYPE)1; tStoreWeapon[0].iMin = 20; tStoreWeapon[0].iMax = 40; tStoreWeapon[0].iPrice = 10000; tStoreWeapon[0].iSell = 4000; strcpy_s(tStoreWeapon[0].strDesc, “나무로 만든 나무검입니다.”); //돌검 생성 strcpy_s(tStoreWeapon[1].strName, “돌검”); strcpy_s(tStoreWeapon[1].strTypeName, “무기”); tStoreWeapon[1].eType = (ITEM_TYPE)2; tStoreWeapon[1].iMin = 80; tStoreWeapon[1].iMax = 100; tStoreWeapon[1].iPrice = 1000; tStoreWeapon[1].iSell = 40000; strcpy_s(tStoreWeapon[1].strDesc, “돌로 만든 돌검입니다.”); while (true) { system(“cls”); cout << "******************************* 로비 ***************************" << endl; cout << "1. 맵" << endl; cout << "2. 상점" << endl; cout << "3. 가방" << endl; cout << "4. 종료" << endl; cout << "메뉴를 선택하세요 : " << endl; int iMenu; cin >> iMenu; if (cin.fail()) { cin.clear(); cin.ignore(1024, ‘

‘); continue; } if (iMenu == MM_EXIT) { break; } switch (iMenu) { case MM_MAP: while (true) { system(“cls”); cout << "******************************* 맵 ***************************" << endl; cout << "1. 쉬움" << endl; cout << "2. 보통" << endl; cout << "3. 어려움" << endl; cout << "4. 뒤로가기" << endl; cout << "맵을 선택하세요 : "; cin >> iMenu; if (cin.fail()) { cin.clear(); cin.ignore(1024, ‘

‘); continue; } // 이 if문에 속한 break는 맵 메뉴를 돌려주기 위한 while에 속해 있으므로 // 이 while문을 빠져나간다. if (iMenu == MT_BACK) { break; } // 선택한 메뉴에서 1을 빼주면 몬스터 배열의 인덱스가 된다. // 그렇게 해서 해당 맵의 몬스터를 생성해준다. _tagMonster tMonster = tMonsterArr[iMenu – 1]; while (true) { system(“cls”); switch (iMenu) { case MT_EASY: cout << "******************************* 쉬움 ***************************" << endl; break; case MT_NORMAL: cout << "******************************* 보통 ***************************" << endl; break; case MT_HARD: cout << "******************************* 어려움 ***************************" << endl; break; } // 플레이어 정보를 출력한다. cout << "====================== Player ======================" << endl; cout << "이름 : " << tPlayer.strName << "\t직업 : " << tPlayer.strJobName << endl; cout << "레벨 : " << tPlayer.iLevel << "\t 경험치 : " << tPlayer.iExp << endl; cout << "공격력 : " << tPlayer.iAttackMin << " - " << tPlayer.iAttackMax << "\t방어력 : " << tPlayer.iArmorMin << " - " << tPlayer.iArmorMax << endl; cout << "체력 : " << tPlayer.iHP << " / " << tPlayer.iHPMax << "\t마나 : " << tPlayer.iMP << " / " << tPlayer.iMPMax << endl; cout << "보유골드 : " << tPlayer.tInventory.iGold << " Gold" << endl; // 몬스터 정보 출력 cout << "====================== Monster ======================" << endl; cout << "이름 : " << tMonster.strName << "\t레벨 : " << tMonster.iLevel << endl; cout << "공격력 : " << tMonster.iAttackMin << " - " << tMonster.iAttackMax << "\t방어력 : " << tMonster.iArmorMin << " - " << tMonster.iArmorMax << endl; cout << "체력 : " << tMonster.iHP << " / " << tMonster.iHPMax << "\t마나 : " << tMonster.iMP << " / " << tMonster.iMPMax << endl; cout << "획득경험치 : " << tMonster.iExp << " Exp" << "\t획득골드 : " << tMonster.iGoldMin << " - " << tMonster.iGoldMax << endl; cout << "1. 공격" << endl; cout << "2. 도망가기" << endl; cout << "메뉴를 선택하세요 : "; cin >> iMenu; if (cin.fail()) { cin.clear(); cin.ignore(1024, ‘

‘); continue; } else if (iMenu == BATTLE_BACK) { tPlayer.iHP = tPlayer.iHPMax; tPlayer.iMP = tPlayer.iMPMax; tMonster.iHP = tMonster.iHPMax; tMonster.iMP = tMonster.iMPMax; break; } switch (iMenu) { case BATTLE_ATTACK: { int iAttack = rand() % (tPlayer.iAttackMax – tPlayer.iAttackMin + 1) + tPlayer.iAttackMin; int iArmor = rand() % (tMonster.iArmorMax – tMonster.iArmorMin + 1) + tMonster.iArmorMin; int iDamage = iAttack – iArmor; iDamage = iDamage < 1 ? 1 : iDamage; tMonster.iHP -= iDamage; cout << tPlayer.strName << " 가 " << tMonster.strName << "에게 " << iDamage << " 피해를 입혔습니다." << endl; // 몬스터가 죽었을 경우 처리 if (tMonster.iHP <= 0) { cout << tMonster.strName << " 몬스터가 죽었습니다." << endl; tPlayer.iExp += tMonster.iExp; int iGold = (rand() % (tMonster.iGoldMax - tMonster.iGoldMin + 1) + tMonster.iGoldMin); tPlayer.tInventory.iGold += iGold; cout << tMonster.iExp << " 경험치를 획득하였습니다." << endl; cout << iGold << " Gold를 획득하였습니다." << endl; tPlayer.iHP = tPlayer.iHPMax; tPlayer.iMP = tPlayer.iMPMax; tMonster.iHP = tMonster.iHPMax; tMonster.iMP = tMonster.iMPMax; system("pause"); break; } // 몬스터가 살아있다면 플레이어를 공격한다 iAttack = rand() % (tMonster.iAttackMax - tMonster.iAttackMin + 1) + tMonster.iAttackMin; iArmor = rand() % (tPlayer.iArmorMax - tPlayer.iArmorMin + 1) + tPlayer.iArmorMin; iDamage = iAttack - iArmor; iDamage = iDamage < 1 ? 1 : iDamage; // 플레이어의 HP를 감소시킨다. tPlayer.iHP -= iDamage; cout << tMonster.strName << " 가 " << tPlayer.strName << "에게 " << iDamage << " 피해를 입혔습니다." << endl; // 플레이어가 죽었을 경우 if (tPlayer.iHP <= 0) { cout << tPlayer.strName << " 플레이어가 사망하였습니다." << endl; int iExp = tPlayer.iExp * 0.1f; int iGold = tPlayer.tInventory.iGold * 0.1f; tPlayer.iExp -= iExp; tPlayer.tInventory.iGold -= iGold; cout << iExp << " 경험치를 잃었습니다." << endl; cout << iGold << " Gold를 잃었습니다." << endl; // 플레이어의 HP와 MP를 회복한다. tPlayer.iHP = tPlayer.iHPMax; tPlayer.iMP = tPlayer.iMPMax; tMonster.iHP = tMonster.iHPMax; tMonster.iMP = tMonster.iMPMax; } system("pause"); } break; } } } break; case MM_STORE: while (true) { system("cls"); cout << "******************************* 상점 ***************************" << endl; cout << "1. 무기상점" << endl; cout << "2. 방어구상점" << endl; cout << "3. 뒤로가기" << endl; cout << "상점을 선택하세요 : "; cin >> iMenu; if (cin.fail()) { cin.clear(); cin.ignore(1024, ‘

‘); continue; } else if (iMenu == SM_BACK) break; switch (iMenu) { case SM_WEAPON: while (true) { system(“cls”); cout << "******************************* 무기상점 ***************************" << endl; // 판매 목록을 보여준다. cout << "1. 나무검" << endl; cout << "2. 돌검" << endl; cout << "3. 뒤로가기" << endl; cout << "아이템을 선택하세요 : "; cin >> iMenu; if (cin.fail()) { cin.clear(); cin.ignore(1024, ‘

‘); continue; } else if (iMenu == IT_BACK) break; switch (iMenu) { case IAT_WOODSWORD: { if (tPlayer.tInventory.iItemCount >= 20) { cout << "가방이 꽉 찼습니다." << endl; system("pause"); break; } else if (tPlayer.tInventory.iGold < tStoreWeapon[iMenu - 1].iPrice) { cout << "돈이 모자랍니다." << endl; system("pause"); break; } else { strcpy_s(tPlayer.tInventory.tItem[tPlayer.tInventory.iItemCount].strName, "나무검"); tPlayer.tInventory.iItemCount++; tPlayer.iAttackMin += tStoreWeapon[iMenu - 1].iMin; tPlayer.iAttackMax += tStoreWeapon[iMenu - 1].iMax; tPlayer.tInventory.iGold -= tStoreWeapon[iMenu - 1].iPrice; cout << "구매에 성공하였습니다." << endl; system("pause"); } break; } case IAT_STONESWORD: { if (tPlayer.tInventory.iItemCount >= 20) { cout << "가방이 꽉 찼습니다." << endl; system("pause"); break; } else if (tPlayer.tInventory.iGold < tStoreWeapon[iMenu - 1].iPrice) { cout << "돈이 모자랍니다." << endl; system("pause"); break; } else { strcpy_s(tPlayer.tInventory.tItem[tPlayer.tInventory.iItemCount].strName, "돌검"); tPlayer.tInventory.iItemCount++; tPlayer.iAttackMin += tStoreWeapon[iMenu - 1].iMin; tPlayer.iAttackMax += tStoreWeapon[iMenu - 1].iMax; tPlayer.tInventory.iGold -= tStoreWeapon[iMenu - 1].iPrice; cout << "구매에 성공하였습니다." << endl; system("pause"); } break; } } } break; case SM_ARMOR: break; } } break; case MM_INVENTORY: system("cls"); cout << "******************************* 가방 ***************************" << endl; cout << tPlayer.tInventory.iItemCount << endl; for (int i = 0; i < tPlayer.tInventory.iItemCount; i++) { cout << tPlayer.tInventory.tItem[i].strName << endl; } system("pause"); break; default: cout << "잘못 선택하였습니다." << endl; break; } } return 0; }

Chapter 4. Text RPG

인프런에 있는 Rookiss님의 강의 Part1: C# 기초 프로그래밍 입문 를 듣고 정리한 필기입니다. 😀

👱‍♀️ 직업 고르기

using System ; namespace CSharp { class Program { enum ClassType { None = 0 , Knight = 1 , Archer = 2 , Mage = 3 } static ClassType ChooseClass () { Console . WriteLine ( “직업을 선택하세요” ); Console . WriteLine ( “[1] 기사” ); Console . WriteLine ( “[2] 궁수” ); Console . WriteLine ( “[3] 법사” ); ClassType choice = ClassType . None ; string input = Console . ReadLine (); switch ( input ) { case “1” : choice = ClassType . Knight ; break ; case “2” : choice = ClassType . Archer ; break ; case “3” : choice = ClassType . Mage ; break ; } return choice ; } static void Main ( string [] args ) { while ( true ) { ClassType choice ; // 초기화 하지 않으면 자동으로 첫 번째 상수인 ClassType.None 으로 초기화 된다. choice = ChooseClass (); // static함수라 클래스 이름으로 호출하는 Program.ChooseClass(); 와도 같다. if ( choice != ClassType . None ) // 함수 내부에서 switch 문에 걸리지 않았다면, 즉 123 입력을 하지 않았다면 다시 반복. 제대로 123 중 하나 입력 했다면 직업 선택 그만함. break ; } } } }

ChooseClass() 가 일반 멤버 함수 였다면 같은 Program 클래스 내에 있더라도 메인 함수에서 ChooseClass(); 이렇게 호출하는건 불가능하다. 왜냐면 메인 함수는 static 함수이기 때문에 어디서든 Program 객체 생성 없이 바로 Program 이름으로 호출이 가능한데 ChooseClass()는 일반 멤버 함수이므로 객체 생성이 있어야하지만 가능하기 때문이다. 따라서 Program 타입의 인스턴스를 만들고 인스턴스를 통해 호출해야 한다. 메인 함수 같은 static 함수가 아닌 같은 일반 멤버 함수 내에서 호출된거라면 같은 클래스니까 ChooseClass(); 호출 가능

가 일반 멤버 함수 였다면 ChooseClass() 가 static 함수여서 같은 static 함수인 ChooseClass() 도 객체 생성이 필요 없기 때문에 그냥 메인 함수 내에서 ChooseClass(); 이렇게 호출이 가능한 것이다. 정석대로 클래스 이름 호출로 Program.ChooseClass(); 이렇게도 가능하다. 근데 같은 클래스 내부니까 클래스 이름 생략 가능.

가 static 함수여서

👩🏼 플레이어 생성

class Program { struct Player { public int hp ; public int attack ; public ClassType type ; } static void CreatePlayer ( ClassType choice , out Player player ) { player . type = choice ; // 기사(100, 10) 궁수(75, 12) 법사(50, 15) switch ( choice ) { case ClassType . Knight : player . hp = 100 ; player . attack = 10 ; break ; case ClassType . Archer : player . hp = 75 ; player . attack = 12 ; break ; case ClassType . Mage : player . hp = 50 ; player . attack = 15 ; break ; default : player . hp = 0 ; player . attack = 0 ; break ; } } static void Main ( string [] args ) { while ( true ) { // 직업 고르기 ClassType choice ; choice = ChooseClass (); // Program.ChooseClass(); if ( choice != ClassType . None ) { // 플레이어 캐릭터 생성 Player player ; CreatePlayer ( choice , out player ); Console . WriteLine ( $”HP { player . hp } , Attack { player . attack } ” ); } } } }

플레이어 특성 구조체로 관리 hp , attack 만 사용했지만 mp , region 등등 많은 특성이 생길 수 있다. 그래서 일일이 다 변수로 선언하기 보단 구조체로 묶어서 관리하는게 좋다.

구조체 변수들도 접근 지정자가 있다. 지정 안해주면 디폴트로 private 이 되서 player.hp 이렇게 호출할 수가 없다.

이 되서 이렇게 호출할 수가 없다. 구조체 매개 변수를 out 으로 하면 구조체의 모든 멤버 변수들을 전부 다 빠짐 없이 write 해야 한다. out 은 엄격하기 때문에 case 에 걸리지 않아 write 되지 않을 것도 생각해서인지 모든 case에 대해 write 해주지 않으면 컴파일 오류 난다. default 에도 꼭 write 해주어야 한다.

으로 하면 구조체의 모든 멤버 변수들을 전부 다 빠짐 없이 write 해야 한다.

Player player ; CreatePlayer ( choice , out player );

아무런 초기화 되어 있지 않던 player 가 CreatePlayer 함수 호출이 끝난 후 멤버 변수들이 전부 다 설정된다! 초기화 안되 있었던 상태니, 즉 메모리 할당이 되어 있지 않은 상태라 ref 는 쓸 수 없다. out 은 메모리 할당 안되어 있는 변수를 참조하는 것이라도 함수 내에서 write 할 것이라는게 보장 되어 있기 때문에 문제 되지 않는다.

👩🏼 몬스터 생성

enum MonsterType { None = 0 , Slime = 1 , Orc = 2 , Skeleton = 3 } struct Monster { public int hp ; public int attack ; } static void CreateRandomMonster ( out Monster monster ) { Random rand = new Random (); int randMonster = rand . Next ( 1 , 4 ); // 1 ~ 3 중 랜덤 정수 리턴 switch ( randMonster ) { case ( int ) MonsterType . Slime : Console . WriteLine ( “슬라임이 스폰 되었습니다!” ); monster . hp = 20 ; monster . attack = 2 ; break ; case ( int ) MonsterType . Orc : Console . WriteLine ( “오크가 스폰 되었습니다!” ); monster . hp = 40 ; monster . attack = 4 ; break ; case ( int ) MonsterType . Skeleton : Console . WriteLine ( “스켈레톤이 스폰 되었습니다!” ); monster . hp = 30 ; monster . attack = 3 ; break ; default : monster . hp = 0 ; monster . attack = 0 ; break ; } } static void EnterField () { Console . WriteLine ( “필드에 접속했습니다.” ); // 랜덤으로 1~3 몬스터 중 하나를 리스폰 Monster monster ; CreateRandomMonster ( out monster ); } static void EnterGame () { while ( true ) { Console . WriteLine ( “마을에 접속했습니다.” ); Console . WriteLine ( “[1] 월드로 간다.” ); Console . WriteLine ( “[2] 로비로 돌아가기.” ); String input = Console . ReadLine (); switch ( input ) { case “1” : EnterField (); break ; case “2” : return ; } } } static void Main ( string [] args ) { while ( true ) { // 직업 고르기 ClassType choice ; choice = ChooseClass (); // Program.ChooseClass(); if ( choice != ClassType . None ) { // 플레이어 캐릭터 생성 Player player ; CreatePlayer ( choice , out player ); Console . WriteLine ( $”HP { player . hp } , Attack { player . attack } ” ); // 게임 시작! 몬스터 생성 및 전투 EnterGame (); } } } }

static void CreateRandomMonster ( out Monster monster ) { Random rand = new Random (); int randMonster = rand . Next ( 1 , 4 ); // 1 ~ 3 중 랜덤 정수 리턴 switch ( randMonster ) { case ( int ) MonsterType . Slime :

randMonster 는 int 형이기 때문에 case문에서 (int)MonsterType.Slime 이렇게 형변환 해주어야 한다.

는 형이기 때문에 case문에서 이렇게 형변환 해주어야 한다. monster 구조체의 모든 멤버 변수들을 전부 다 write 해야 한다. write 되지 않을 케이스가 있어서도 안된다.

static void EnterGame () { while ( true ) { Console . WriteLine ( “마을에 접속했습니다.” ); Console . WriteLine ( “[1] 월드로 간다.” ); Console . WriteLine ( “[2] 로비로 돌아가기.” ); String input = Console . ReadLine (); switch ( input ) { case “1” : EnterField (); break ; case “2” : return ; } } }

2를 선택하면 로비로 돌아가게 하고 싶다. 즉, 다시 직업을 고르도록 Main 함수로 돌아가고 싶다. 따라서 case “2” 의 경우엔 break 가 아닌 그냥 return 을 해주어 아예 EnterGame 함수를 종료시킨다.

👩🏼 전투

static void Fight ( ref Player player , ref Monster monster ) { while ( true ) { // 플레이어가 몬스터 공격 monster . hp -= player . attack ; if ( monster . hp <= 0 ) { Console . WriteLine ( "승리했습니다!" ); Console . WriteLine ( $"남은 체력 : { player . hp } " ); break ; } // 몬스터 반격 player . hp -= monster . attack ; if ( player . hp <= 0 ) { Console . WriteLine ( "패배했습니다!" ); break ; } } } static void EnterField ( ref Player player ) { Console . WriteLine ( "필드에 접속했습니다." ); // 랜덤으로 1~3 몬스터 중 하나를 리스폰 Monster monster ; CreateRandomMonster ( out monster ); Console . WriteLine ( "[1] 전투 모드 돌입" ); Console . WriteLine ( "[2] 일정 확률로 마을로 도망" ); string input = Console . ReadLine (); if ( input == "1" ) { Fight ( ref player , ref monster ); } else if ( input == "2" ) { // 33 % Random rand = new Random (); int randValue = rand . Next ( 0 , 101 ); if ( randValue <= 33 ) { Console . WriteLine ( "도망치는데 성공했습니다!" ); } else { Fight ( ref player , ref monster ); } } } static void EnterGame ( ref Player player ) { while ( true ) { Console . WriteLine ( "마을에 접속했습니다." ); Console . WriteLine ( "[1] 월드로 간다." ); Console . WriteLine ( "[2] 로비로 돌아가기." ); String input = Console . ReadLine (); switch ( input ) { case "1" : EnterField ( ref player ); break ; case "2" : return ; } } } static void Main ( string [] args ) { while ( true ) { // 직업 고르기 ClassType choice ; choice = ChooseClass (); // Program.ChooseClass(); if ( choice == ClassType . None ) continue ; // 플레이어 캐릭터 생성 Player player ; CreatePlayer ( choice , out player ); Console . WriteLine ( $"HP { player . hp } , Attack { player . attack } " ); // 게임 시작! 몬스터 생성 및 전투 EnterGame ( ref player ); } } } Fight 함수에서 player 구조체가 필요하기 때문에 인수로 전달 받아야 한다. Call by Value로 해도 나쁘지 않지만, EnterGame 👉 EnterField 👉 Figt 이 순으로 호출되며 player 를 전달해야 하기 때문에 그냥 계속 해서 사본 만드는 과정을 거치기 보다는 사본 생성 과정 없이 ref 로 원본 player 를 참조할 수 있도록 하였다. Player player ; CreatePlayer ( choice , out player ); 위의 과정으로 player 는 현재 메모리가 할당 되어 있는 상태기 때문에 ref 참조로 넘길 수 있다. 👩‍🦰 전체 코드 using System ; namespace CSharp { class Program { enum ClassType { None = 0 , Knight = 1 , Archer = 2 , Mage = 3 } struct Player { public int hp ; public int attack ; public ClassType type ; } enum MonsterType { None = 0 , Slime = 1 , Orc = 2 , Skeleton = 3 } struct Monster { public int hp ; public int attack ; } static ClassType ChooseClass () { Console . WriteLine ( "직업을 선택하세요" ); Console . WriteLine ( "[1] 기사" ); Console . WriteLine ( "[2] 궁수" ); Console . WriteLine ( "[3] 법사" ); ClassType choice = ClassType . None ; string input = Console . ReadLine (); switch ( input ) { case "1" : choice = ClassType . Knight ; break ; case "2" : choice = ClassType . Archer ; break ; case "3" : choice = ClassType . Mage ; break ; } return choice ; } static void CreatePlayer ( ClassType choice , out Player player ) { player . type = choice ; // 기사(100, 10) 궁수(75, 12) 법사(50, 15) switch ( choice ) { case ClassType . Knight : player . hp = 100 ; player . attack = 10 ; break ; case ClassType . Archer : player . hp = 75 ; player . attack = 12 ; break ; case ClassType . Mage : player . hp = 50 ; player . attack = 15 ; break ; default : player . hp = 0 ; player . attack = 0 ; break ; } } static void CreateRandomMonster ( out Monster monster ) { Random rand = new Random (); int randMonster = rand . Next ( 1 , 4 ); // 1 ~ 3 중 랜덤 정수 리턴 switch ( randMonster ) { case ( int ) MonsterType . Slime : Console . WriteLine ( "슬라임이 스폰 되었습니다!" ); monster . hp = 20 ; monster . attack = 2 ; break ; case ( int ) MonsterType . Orc : Console . WriteLine ( "오크가 스폰 되었습니다!" ); monster . hp = 40 ; monster . attack = 4 ; break ; case ( int ) MonsterType . Skeleton : Console . WriteLine ( "스켈레톤이 스폰 되었습니다!" ); monster . hp = 30 ; monster . attack = 3 ; break ; default : monster . hp = 0 ; monster . attack = 0 ; break ; } } static void Fight ( ref Player player , ref Monster monster ) { while ( true ) { // 플레이어가 몬스터 공격 monster . hp -= player . attack ; if ( monster . hp <= 0 ) { Console . WriteLine ( "승리했습니다!" ); Console . WriteLine ( $"남은 체력 : { player . hp } " ); break ; } // 몬스터 반격 player . hp -= monster . attack ; if ( player . hp <= 0 ) { Console . WriteLine ( "패배했습니다!" ); break ; } } } static void EnterField ( ref Player player ) { Console . WriteLine ( "필드에 접속했습니다." ); // 랜덤으로 1~3 몬스터 중 하나를 리스폰 Monster monster ; CreateRandomMonster ( out monster ); Console . WriteLine ( "[1] 전투 모드 돌입" ); Console . WriteLine ( "[2] 일정 확률로 마을로 도망" ); string input = Console . ReadLine (); if ( input == "1" ) { Fight ( ref player , ref monster ); } else if ( input == "2" ) { // 33 % Random rand = new Random (); int randValue = rand . Next ( 0 , 101 ); if ( randValue <= 33 ) { Console . WriteLine ( "도망치는데 성공했습니다!" ); } else { Fight ( ref player , ref monster ); } } } static void EnterGame ( ref Player player ) { while ( true ) { Console . WriteLine ( "마을에 접속했습니다." ); Console . WriteLine ( "[1] 월드로 간다." ); Console . WriteLine ( "[2] 로비로 돌아가기." ); String input = Console . ReadLine (); switch ( input ) { case "1" : EnterField ( ref player ); break ; case "2" : return ; } } } static void Main ( string [] args ) { while ( true ) { // 직업 고르기 ClassType choice ; choice = ChooseClass (); // Program.ChooseClass(); if ( choice == ClassType . None ) continue ; // 플레이어 캐릭터 생성 Player player ; CreatePlayer ( choice , out player ); Console . WriteLine ( $"HP { player . hp } , Attack { player . attack } " ); // 게임 시작! 몬스터 생성 및 전투 EnterGame ( ref player ); } } } } 🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄 맨 위로 이동하기

C/C++ 강의 : TextRPG (플레이어, 몬스터, 전투, 상점) [어소트락 유튜브]

날짜 : 190517

주제 : TextRPG (플레이어, 몬스터, 전투, 상점)

특징 :

1. 강의 20화에서 했던 메뉴 구현을 적용시켜서 턴제 Text RPG를 구현.

2. 상점에서 무기 팔기 기능은 아직 구현하지 않음

3. 지도 easy, normal, hard를 선택함에 따라 나오는 몬스터가 정해져있다.

#include #include “time.h” #include “stdlib.h” using namespace std; enum MAIN_MENU { MM_NONE, MM_MAP, MM_STORE, MM_INVENTORY, MM_EXIT }; enum MAP_TYPE { MT_NONE, MT_EASY, MT_NORMAL, MT_HARD, MT_BACK }; enum CLASS { CLASS_NONE, CLASS_KNIGHT, CLASS_ARCHER, CLASS_WIZARD, CLASS_END }; enum BATTLE { BATTLE_NONE, BATTLE_ATTACK, BATTLE_BACK }; enum ITEM_TYPE { IT_NONE, IT_WEAPON, IT_ARMOR, IT_BACK }; enum STORE_MENU { SM_NONE, SM_WEAPON, SM_ARMOR, SM_BACK }; enum STORE_MENU_2 { SM2_NONE, SM2_LIST1, SM2_LIST2, SM2_LIST3, SM2_BACK }; #define NAME_SIZE 32 #define ITEM_DESC_LENGTH 512 #define INVENTORY_MAX 6 #define STORE_WEAPON_MAX 3 #define STORE_ARMOR_MAX 3 struct _tagItem { char name[NAME_SIZE]; char typeName[NAME_SIZE]; ITEM_TYPE type; int min; int max; int price; int sell; char description[ITEM_DESC_LENGTH]; }; struct _tagInventory { _tagItem itemArr[INVENTORY_MAX]; int itemCount; int gold; _tagItem weapon; _tagItem armor; }; struct _tagPlayer { char name[NAME_SIZE]; char className[NAME_SIZE]; CLASS Class; int attackMin; int attackMax; int armorMin; int armorMax; int hp; int hpMax; int mp; int mpMax; int exp; int level; _tagInventory inventory; }; struct _tagMonster { char name[NAME_SIZE]; int attackMin; int attackMax; int armorMin; int armorMax; int hp; int hpMax; int mp; int mpMax; int level; int exp; int goldMin; int goldMax; }; int main() { srand((unsigned int)time(0)); // 플레이어 정보 설정 _tagPlayer player = {}; cout << "이름 : "; cin.getline(player.name, NAME_SIZE - 1); int selectedClass = CLASS_NONE; while (true) { system("cls"); cout << "1. 기사" << endl; cout << "2. 궁사" << endl; cout << "3. 마법사" << endl; cout << "클래스를 고르시오 : "; cin >> selectedClass; if (cin.fail()) { cin.clear(); cin.ignore(1024, ‘

‘); continue; } else if (selectedClass <= CLASS_NONE || selectedClass >= CLASS_END) { selectedClass = CLASS_NONE; continue; } break; } player.level = 1; player.exp = 0; player.inventory.gold = 1000000; player.Class = (CLASS)selectedClass; switch (player.Class) { case CLASS_KNIGHT: strcpy_s(player.className, “기사”); player.attackMin = 5; player.attackMax = 10; player.armorMin = 15; player.armorMax = 20; player.hpMax = 500; player.hp = 500; player.mpMax = 100; player.mp = 100; break; case CLASS_ARCHER: strcpy_s(player.className, “궁수”); player.attackMin = 10; player.attackMax = 15; player.armorMin = 10; player.armorMax = 15; player.hpMax = 400; player.hp = 400; player.mpMax = 200; player.mp = 200; break; case CLASS_WIZARD: strcpy_s(player.className, “마법사”); player.attackMin = 15; player.attackMax = 20; player.armorMin = 5; player.armorMax = 10; player.hpMax = 300; player.hp = 300; player.mpMax = 300; player.mp = 300; break; } // 몬스터 생성 _tagMonster monsterArr[MT_BACK – 1] = {}; // 고블린 생성 strcpy_s(monsterArr[0].name, “고블린”); monsterArr[0].attackMin = 20; monsterArr[0].attackMax = 30; monsterArr[0].armorMin = 2; monsterArr[0].armorMax = 5; monsterArr[0].hpMax = 100; monsterArr[0].hp = 100; monsterArr[0].mpMax = 10; monsterArr[0].mp = 10; monsterArr[0].level = 1; monsterArr[0].exp = 10; monsterArr[0].goldMin = 500; monsterArr[0].goldMax = 800; // 트롤 strcpy_s(monsterArr[1].name, “트롤”); monsterArr[1].attackMin = 80; monsterArr[1].attackMax = 130; monsterArr[1].armorMin = 60; monsterArr[1].armorMax = 90; monsterArr[1].hpMax = 2000; monsterArr[1].hp = 2000; monsterArr[1].mpMax = 100; monsterArr[1].mp = 100; monsterArr[1].level = 5; monsterArr[1].exp = 80; monsterArr[1].goldMin = 4000; monsterArr[1].goldMax = 7000; // 드래곤 strcpy_s(monsterArr[2].name, “드래곤”); monsterArr[2].attackMin = 250; monsterArr[2].attackMax = 500; monsterArr[2].armorMin = 200; monsterArr[2].armorMax = 400; monsterArr[2].hpMax = 30000; monsterArr[2].hp = 30000; monsterArr[2].mpMax = 20000; monsterArr[2].mp = 20000; monsterArr[2].level = 10; monsterArr[2].exp = 30000; monsterArr[2].goldMin = 30000; monsterArr[2].goldMax = 70000; // 상점에서 판매할 아에팀 목록을 생성한다. // 무기 리스트 _tagItem storeWeaponArr[STORE_WEAPON_MAX] = {}; // 요우무의 단검 strcpy_s(storeWeaponArr[0].name, “요우무의 단검”); strcpy_s(storeWeaponArr[0].typeName, “무기”); storeWeaponArr[0].type = IT_WEAPON; storeWeaponArr[0].min = 100; storeWeaponArr[0].max = 500; storeWeaponArr[0].price = 1000; storeWeaponArr[0].sell = storeWeaponArr[0].price * 0.6f; strcpy_s(storeWeaponArr[0].description, “요우무라는 장인이 발레리안 스틸로 만든 고급 단검” ); // 슈렐리아의 장검 strcpy_s(storeWeaponArr[1].name, “슈렐리아의 장검”); strcpy_s(storeWeaponArr[1].typeName, “무기”); storeWeaponArr[1].type = IT_WEAPON; storeWeaponArr[1].min = 1000; storeWeaponArr[1].max = 1500; storeWeaponArr[1].price = 20000; storeWeaponArr[1].sell = storeWeaponArr[1].price * 0.6f; strcpy_s(storeWeaponArr[1].description, “슈렐리아라는 나라에서 황실 경비병들이 사용하는 무기” ); // 레이피어 strcpy_s(storeWeaponArr[2].name, “레이피어”); strcpy_s(storeWeaponArr[2].typeName, “무기”); storeWeaponArr[2].type = IT_WEAPON; storeWeaponArr[2].min = 2000; storeWeaponArr[2].max = 3000; storeWeaponArr[2].price = 500000; storeWeaponArr[2].sell = storeWeaponArr[2].price * 0.6f; strcpy_s(storeWeaponArr[2].description, “요정족이 만들었다고 소문으로만 전해지는 전설의 검. 가벼운 것이 특징” ); // 갑옷 리스트 _tagItem storeArmorArr[STORE_WEAPON_MAX] = {}; // 징박힌 갑옷 strcpy_s(storeArmorArr[0].name, “징박힌 값옷”); strcpy_s(storeArmorArr[0].typeName, “갑옷”); storeArmorArr[0].type = IT_ARMOR; storeArmorArr[0].min = 105; storeArmorArr[0].max = 505; storeArmorArr[0].price = 1005; storeArmorArr[0].sell = storeWeaponArr[0].price * 0.6f; strcpy_s(storeArmorArr[0].description, “고급 가죽 갑옷에 징을 박아 방어력을 더함” ); // 판금 갑옷 strcpy_s(storeArmorArr[1].name, “판금 갑옷”); strcpy_s(storeArmorArr[1].typeName, “갑옷”); storeArmorArr[1].type = IT_ARMOR; storeArmorArr[1].min = 1005; storeArmorArr[1].max = 1505; storeArmorArr[1].price = 20005; storeArmorArr[1].sell = storeArmorArr[1].price * 0.6f; strcpy_s(storeArmorArr[1].description, “판금으로 만들어진 갑옷” ); // 드래곤 스케일 갑옷 strcpy_s(storeArmorArr[2].name, “레이피어”); strcpy_s(storeArmorArr[2].typeName, “갑옷”); storeArmorArr[2].type = IT_ARMOR; storeArmorArr[2].min = 2005; storeArmorArr[2].max = 3005; storeArmorArr[2].price = 500005; storeArmorArr[2].sell = storeArmorArr[2].price * 0.6f; strcpy_s(storeArmorArr[2].description, “전설의 용을 잡아 그 가죽으로 만든 갑옷” ); // 메인 화면 while (true) { system(“cls”); cout << endl << "========== 메인 메뉴 ==========" << endl << endl; cout << "1. 지도 " << endl; cout << "2. 상점 " << endl; cout << "3. 가방 " << endl; cout << "4. 종료 " << endl; cout << "메뉴를 선택하세요 : "; int menu; cin >> menu; if (cin.fail()) { cin.clear(); cin.ignore(1024, ‘

‘); continue; } if (menu == MM_EXIT) { break; } switch (menu) { case MM_MAP: while (true) { system(“cls”); cout << endl << "========== 맵 종류 ==========" << endl<< endl; cout << "1. 쉬움" << endl; cout << "2. 보통" << endl; cout << "3. 어려움" << endl; cout << "4. 뒤로가기" << endl; cout << "맵을 선택하세요 : "; cin >> menu; if (cin.fail()) { cin.clear(); cin.ignore(1024, ‘

‘); continue; } if (menu == MT_BACK) { // 맵 선택 화면에서 빠져나간다 break; } // 선택한 메뉴에서 1을 빼주면 몬스터 배열의 인덱스가 된다. // 이렇게 해당 맵의 몬스터를 설정 _tagMonster monster = monsterArr[menu – 1]; // 전투 while (true) { system(“cls”); switch(menu) { case MT_EASY: cout << "********** 쉬움 **********" << endl; break; case MT_NORMAL: cout << "********** 보통 **********" << endl; break; case MT_HARD: cout << "********** 어려움 **********" << endl; break; } // 플레이어 정보를 출력 cout << "========== 플레이어 ==========" << endl; cout << "이름 : " << player.name << "\t직업 : " << player.className << endl; cout << "레벨 : " << player.level << "\t경험치 : " << player.exp << endl; cout << "공격력 : " << player.attackMin << " ~ " << player.attackMax << endl; cout << "방어력 : " << player.armorMin << " ~ " << player.armorMax << endl; cout << "체력 : " << player.hp << " / " << player.hpMax << "\t마나 : " << player.mp << " / " << player.mpMax << endl; cout << "소지금 : " << player.inventory.gold << endl << endl; // 몬스터 정보를 출력 cout << "========== 몬스터 ==========" << endl; cout << "이름 : " << monster.name << "\t레벨 : " << monster.level << endl; cout << "공격력 : " << monster.attackMin << " ~ " << monster.attackMax << endl; cout << "방어력 : " << monster.armorMin << " ~ " << monster.armorMax << endl; cout << "체력 : " << monster.hp << " / " << monster.hpMax << "\t마나 : " << monster.mp << " / " << monster.mpMax << endl; cout << "획득 경험치 : " << monster.exp << "\t획득 골드 : " << monster.goldMin << " ~ " << monster.goldMax << endl << endl; cout << "========== 행동 ==========" << endl; cout << "1. 공격" << endl; cout << "2. 도망가기" << endl; cout << "행동을 선택하세요." << endl; cin >> menu; if (cin.fail()) { cin.clear(); cin.ignore(1024, ‘

‘); continue; } else if (menu == BATTLE_BACK) { break; } switch (menu) { case BATTLE_ATTACK: int attack = rand() % (player.attackMax – player.attackMin + 1) + (player.attackMin); int armor = rand() % (monster.armorMax – monster.armorMin + 1) + (monster.armorMin); int damage = attack – armor; // 삼항연산자 : 조건식 ? true일 때 값, : false 일 때 값이 된다. // 최소 데미지를 음수가 되지 않고 1로 설정 damage = damage < 1 ? 1 : damage; // 몬스터 HP를 감소시킨다. monster.hp -= damage; cout << player.name << "가 " << monster.name << "에게 " << damage << "의 피해를 입혔습니다." << endl; // 몬스터가 죽음 if (monster.hp <= 0) { cout << monster.name << " 몬스터가 사망하였습니다." << endl; player.exp += monster.exp; int gold = (rand() % monster.goldMax - monster.goldMin + 1) + monster.goldMin; player.inventory.gold += gold; cout << monster.exp << "의 경험치를 획득하였습니다." << endl; cout << gold << "의 골드를 획득하였습니다." << endl; // 몬스터 스탯을 초기화 monster.hp = monster.hpMax; monster.mp = monster.mpMax; system("pause"); break; } // 몬스터가 살아있으면 플레이어를 공격 attack = rand() % (monster.attackMax - monster.attackMin + 1) + (monster.attackMin); armor = rand() % (player.armorMax - player.armorMin + 1) + (player.armorMin); damage = attack - armor; damage = damage < 1 ? 1 : damage; // 플레이어 HP를 감소시킨다. player.hp -= damage; cout << monster.name << "가 " << player.name << "에게 " << damage << "의 피해를 입혔습니다." << endl; // 플레이어가 죽었을 경우 if (player.hp <= 0) { cout << "플레이어가 " << monster.name << "에게 사망하였습니다." << endl; // 죽으면 경험치와 골드가 10% 깎인다 cout << (player.exp * 0.1f) << "경험치를 잃었습니다." << endl; cout << (player.inventory.gold * 0.1f) << "골드를 잃었습니다." << endl; player.exp = player.exp - (player.exp * 0.1f); player.inventory.gold = player.inventory.gold - (player.inventory.gold * 0.1f); // 플레이어 부활 player.hp = player.hpMax; player.mp = player.mpMax; } system("pause"); break; } } } break; case MM_STORE: while (true) { system("cls"); cout << "========== 상점 ==========" << endl; cout << "1. 무기 상점" << endl; cout << "2. 방어구 상점" << endl; cout << "3. 뒤로 가기" << endl; cout << "상점을 선택하세요 : "; cin >> menu; if (cin.fail()) { cin.clear(); cin.ignore(1024, ‘

‘); continue; } else if (menu == SM_BACK) { break; } else if (menu < SM_NONE || menu > SM_BACK) { cout << "잘못된 입력입니다. 다시 시도해주세요." << endl; system("pause"); continue; } switch (menu) { case SM_WEAPON: while (true) { system("cls"); cout << "=========== 무기 상점 ==========" << endl; for (int i = 0; i < STORE_WEAPON_MAX; ++i) { cout << i + 1 << "번 무기 : " << storeWeaponArr[i].name << endl; cout << "공격력 : " << storeWeaponArr[i].min << " ~ " << storeWeaponArr[i].max << endl; cout << "구매 가격 : " << storeWeaponArr[i].price << " 골드" << endl; cout << "판매 가격 : " << storeWeaponArr[i].sell << " 골드" << endl; cout << "특징 : " << storeWeaponArr[i].description << endl; cout << "-----------------------------------------" << endl; } cout << "뒤로가기 : 4번을 누르세요." << endl; cout << "구매할 아이템을 선택하시오 : "; cout << "현재 소지금 : " << player.inventory.gold << endl; cout << "가방 남은 자리 : " << int(INVENTORY_MAX - player.inventory.itemCount) << " / " << INVENTORY_MAX << endl; cin >> menu; if (cin.fail()) { cin.clear(); cin.ignore(1024, ‘

‘); continue; } else if (menu < SM2_NONE || menu > SM2_BACK) { cout << "잘못된 입력입니다. 다시 시도해주세요." << endl; system("pause"); continue; } switch (menu) { case SM2_LIST1: if (player.inventory.itemCount >= INVENTORY_MAX) { cout << "인벤토리가 모두 찼습니다. 상점을 이용할 수 없습니다." << endl; system("pause"); continue; } if (player.inventory.gold < storeWeaponArr[0].price) { cout << "소지금이 부족합니다." << endl; system("pause"); continue; } cout << storeWeaponArr[0].name << "을 구매하셨습니다." << endl; player.inventory.gold -= storeWeaponArr[0].price; // 무기 바로 장착 player.attackMin += storeWeaponArr[0].min; player.attackMax += storeWeaponArr[0].max; // inventory에 아이템 넣기 player.inventory.itemArr[player.inventory.itemCount++] = storeWeaponArr[0]; cout << "현재 소지금 : " << player.inventory.gold << endl; break; case SM2_LIST2: if (player.inventory.itemCount >= INVENTORY_MAX) { cout << "인벤토리가 모두 찼습니다. 상점을 이용할 수 없습니다." << endl; system("pause"); continue; } if (player.inventory.gold < storeWeaponArr[1].price) { cout << "소지금이 부족합니다." << endl; system("pause"); continue; } cout << storeWeaponArr[1].name << "을 구매하셨습니다." << endl; player.inventory.gold -= storeWeaponArr[1].price; // inventory에 아이템 넣기 player.inventory.itemArr[player.inventory.itemCount++] = storeWeaponArr[1]; // 무기 바로 장착 player.attackMin += storeWeaponArr[1].min; player.attackMax += storeWeaponArr[1].max; cout << "현재 소지금 : " << player.inventory.gold << endl; break; case SM2_LIST3: if (player.inventory.itemCount >= INVENTORY_MAX ) { cout << "인벤토리가 모두 찼습니다. 상점을 이용할 수 없습니다." << endl; system("pause"); continue; } if (player.inventory.gold < storeWeaponArr[2].price) { cout << "소지금이 부족합니다." << endl; system("pause"); continue; } cout << storeWeaponArr[2].name << "을 구매하셨습니다." << endl; player.inventory.gold -= storeWeaponArr[2].price; // 무기 바로 장착 player.attackMin += storeWeaponArr[2].min; player.attackMax += storeWeaponArr[2].max; // inventory에 아이템 넣기 player.inventory.itemArr[player.inventory.itemCount++] = storeWeaponArr[2]; cout << "현재 소지금 : " << player.inventory.gold << endl; break; case SM2_BACK: break; } break; } break; case SM_ARMOR: while (true) { system("cls"); cout << "=========== 갑옷 상점 ==========" << endl; for (int i = 0; i < STORE_ARMOR_MAX; ++i) { cout << i + 1 << "번 무기 : " << storeArmorArr[i].name << endl; cout << "공격력 : " << storeArmorArr[i].min << " ~ " << storeWeaponArr[i].max << endl; cout << "구매 가격 : " << storeArmorArr[i].price << " 골드" << endl; cout << "판매 가격 : " << storeArmorArr[i].sell << " 골드" << endl; cout << "특징 : " << storeArmorArr[i].description << endl; cout << "-----------------------------------------" << endl; } cout << "구매할 아이템을 선택하시오 : "; cin >> menu; if (cin.fail()) { cin.clear(); cin.ignore(1024, ‘

‘); continue; } else if (menu < SM2_NONE || menu > SM2_BACK) { cout << "잘못된 입력입니다. 다시 시도해주세요." << endl; system("pause"); continue; } switch (menu) { case SM2_LIST1: if (player.inventory.itemCount >= INVENTORY_MAX) { cout << "인벤토리가 모두 찼습니다. 상점을 이용할 수 없습니다." << endl; system("pause"); continue; } if (player.inventory.gold < storeArmorArr[0].price) { cout << "소지금이 부족합니다." << endl; system("pause"); continue; } cout << storeArmorArr[0].name << "을 구매하셨습니다." << endl; player.inventory.gold -= storeArmorArr[0].price; // 무기 바로 장착 player.armorMin += storeArmorArr[0].min; player.armorMax += storeArmorArr[0].max; // inventory에 아이템 넣기 player.inventory.itemArr[player.inventory.itemCount++] = storeArmorArr[0]; cout << "현재 소지금 : " << player.inventory.gold << endl; break; case SM2_LIST2: if (player.inventory.itemCount >= INVENTORY_MAX) { cout << "인벤토리가 모두 찼습니다. 상점을 이용할 수 없습니다." << endl; system("pause"); continue; } if (player.inventory.gold < storeArmorArr[1].price) { cout << "소지금이 부족합니다." << endl; system("pause"); continue; } cout << storeArmorArr[1].name << "을 구매하셨습니다." << endl; player.inventory.gold -= storeArmorArr[1].price; // inventory에 아이템 넣기 player.inventory.itemArr[player.inventory.itemCount++] = storeArmorArr[1]; // 무기 바로 장착 player.armorMin += storeArmorArr[1].min; player.armorMax += storeArmorArr[1].max; cout << "현재 소지금 : " << player.inventory.gold << endl; break; case SM2_LIST3: if (player.inventory.itemCount >= INVENTORY_MAX) { cout << "인벤토리가 모두 찼습니다. 상점을 이용할 수 없습니다." << endl; system("pause"); continue; } if (player.inventory.gold < storeArmorArr[2].price) { cout << "소지금이 부족합니다." << endl; system("pause"); continue; } cout << storeArmorArr[2].name << "을 구매하셨습니다." << endl; player.inventory.gold -= storeArmorArr[2].price; // 무기 바로 장착 player.armorMin += storeArmorArr[2].min; player.armorMax += storeArmorArr[2].max; // inventory에 아이템 넣기 player.inventory.itemArr[player.inventory.itemCount++] = storeArmorArr[2]; cout << "현재 소지금 : " << player.inventory.gold << endl; break; case SM2_BACK: break; } break; } break; } cout << "========== 플레이어 ==========" << endl; cout << "이름 : " << player.name << "\t직업 : " << player.className << endl; cout << "레벨 : " << player.level << "\t경험치 : " << player.exp << endl; cout << "공격력 : " << player.attackMin << " ~ " << player.attackMax << endl; cout << "방어력 : " << player.armorMin << " ~ " << player.armorMax << endl; cout << "체력 : " << player.hp << " / " << player.hpMax << "\t마나 : " << player.mp << " / " << player.mpMax << endl; cout << "소지금 : " << player.inventory.gold << endl << endl; cout << "가방 남은 자리 : " << int(INVENTORY_MAX - player.inventory.itemCount) << " / " << INVENTORY_MAX << endl; system("pause"); continue; } break; case MM_INVENTORY: system("cls"); cout << "========== 현재 소지품 목록 ==========" << endl; cout << "가방 남은 자리 : " << int(INVENTORY_MAX - player.inventory.itemCount) << " / " << INVENTORY_MAX << endl; for (int i = 0; i < player.inventory.itemCount; ++i) { cout << player.inventory.itemArr[i].name << endl; } cout << "골드 : " << player.inventory.gold << endl; system("pause"); break; } } return 0; } /* 숙제 1. 무기상점에서 판매할 아이템 목록 만들기 그리고 출력 2. 출력할 대 앞에 번호를 부여해주고 번호를 입력, 구매 3. 인벤토리기 꽉 차면 구매 불가 4. 가방을 선택하면 가방 안의 아이템을 보여준다. */

So you have finished reading the c 언어 텍스트 rpg topic article, if you find this article useful, please share it. Thank you very much. See more: C 텍스트 RPG 게임, c언어 턴제게임, C언어 미니게임, C 텍스트 게임, 텍스트 RPG, 텍스트 RPG 만들기, C언어 소스 코드 모음, c언어 게임

Leave a Comment