Quest 클래스 코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Systehttp://m.Threading.Tasks;
namespace _14_TextRPG
{
public enum TowerDifficult
{
Easy = 144,
Normar,
Hard
}
public class Quest
{
// 퀘스트... 목록 보여주기
// 1 퀘스트 목록
// 퀘스트를 선택하면 보상 목록을 보여주고
// 1 수락, 0 뒤로가기
// 퀘스트를 2개이상 받았다면 퀘스트창이 다 찼습니다 출력하기
// 퀘스트 목록은 1 ~ 7까지 7개만 보이게
// 9 누르면 내가 받은 퀘스트 목록(최대 2개)
// 퀘스트 완료되면 (완) 표시
// 퀘스트가 완료된게 아니라면 퀘스트를 포기할지 결정
// 완료 퀘스트를 누르면 퀘스트가 완료되고 보상을 받는다.
// 퀘스트
// 퀘스트 번호
public int questNumber = 0;
// 퀘스트 이름
public string questName { get; set; }
// 퀘스트 정보
public string questInfo { get; set; }
// 퀘스트 카운팅 (몬스터 잡았을 때)
// 퀘스트 보상
public int rewardGold { get; set; }
public Item rewardItem { get; set; }
public int rewardExp { get; set; }
// 몬스터를 잡아야 할 마리 수
public int questKills { get; set; }
// 현재 킬 수
public int currentKills { get; set; }
//장비 착용 목표 아이템
public string questItem { get; set; }
//장비 착용을 했는지
public bool isEquip { get; set; } = false;
// 장비 착용 관련 퀘스트
public bool isQuestEquip { get; set; } = false;
// 타워 층수
public int questTower { get; set; }
public int[] currentTower { get; set; } = { 5, 5, 5 };
public TowerDifficult TD { get; set; }
// 퀘스트를 받았는지 여부
public bool isAccept { get; set; } = false;
// 퀘스트 완료 했는지 여부
public bool isComplete { get; set; } = false;
// 퀘스트 보상을 다 받았는지 여부
public bool isReward { get; set; } = false;
public bool isItemReward { get; set; } = false;
// 몬스터 처치 퀘스트
public Quest(string questname, string questinfo, int amount, int rewardgold, int rewardexp)
{
questName = questname;
questInfo = questinfo;
questKills = amount;
rewardGold = rewardgold;
rewardExp = rewardexp;
currentKills = 0;
}
//장비 착용 퀘스트
public Quest(string questname, string questinfo, bool isequip, int rewardgold, int rewardexp, Item rewarditem)
{
questName = questname;
questInfo = questinfo;
isEquip = isequip;
rewardGold = rewardgold;
rewardExp = rewardexp;
rewardItem = rewarditem;
isItemReward = true;
isQuestEquip = true;
}
// 플레이어 타워 층수 퀘스트
public Quest(string questname, string questinfo, Player play , int qeusttower , int rewardgold, int rewardexp, TowerDifficult Td)
{
questName = questname;
questInfo = questinfo;
for (int i = 0; i < play.repeat.Length; i++)
{
currentTower[i] = play.repeat[i];
}
questTower = questTower;
TD = Td;
rewardGold = rewardgold;
rewardExp = rewardexp;
}
public void Accept()
{
isAccept = true;
Console.WriteLine();
Console.WriteLine($"[{questName}] 을(를) 수락하셨습니다! ");
}
public void Reject()
{
isAccept = false;
Console.WriteLine();
Console.WriteLine($"[{questName}] 을(를) 거절하셨습니다.");
currentKills = 0;
}
public void Complete(Player player)
{
if (isComplete)
{
Console.WriteLine($"{questName} 퀘스트 완료! ");
Console.WriteLine($"보상");
Console.WriteLine($"{rewardGold}");
Console.WriteLine($"{rewardExp}");
Thread.Sleep(500);
//보상 지급
player.Gold += rewardGold;
player.Ex += rewardExp;
//
isReward = true;
}
}
public void Complete(Player player, Inven inv)
{
if (isComplete)
{
Console.WriteLine();
Console.WriteLine($"{questName} 퀘스트 완료! ");
Console.WriteLine($"보상");
Console.WriteLine($"{rewardGold}");
Console.WriteLine($"{rewardExp}");
Console.WriteLine($"{rewardItem.Name}");
Thread.Sleep(500);
//보상 지급
player.Gold += rewardGold;
player.Ex += rewardExp;
inv.GetItem(rewardItem);
//
isReward = true;
}
}
}
}
QuestManager 코드
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Systehttp://m.Threading.Tasks;
namespace _14_TextRPG
{
public class QuestManager
{
// 한 페이지에 퀘스트가 몇개 들어갈지 설정
const int PAGE_SIZE = 7;
// 현재 퀘스트 창 페이지
int currentPage = 1;
// 퀘스트 리스트
List<Quest> questList = new List<Quest>();
// 수락한 퀘스트 리스트
List<Quest> acceptQuest = new List<Quest>();
// 퀘스트 보상을 주기 위함
ItemList itemList = new ItemList();
Item ratherArmor;
Inven itemIvn;
Player player;
// 퀘스트 생성
public QuestManager(Player play, Inven ivn)
{
foreach (Item IL in itemList.arrItem)
{
if (IL.Name == "해진 가죽갑옷")
{
ratherArmor = IL;
}
}
itemIvn = ivn;
player = play;
questList.Add(new Quest("마을을 위협하는 몬스터 처치", "이봐! 마을 근처에 몬스터들이 너무 많아졌다고 생각하지 않나? \n " +
"마을 주민들의 안전을 위해서라도 저것들 수를 좀 줄여야 한다고! \n" +
"모험가인 자네가 좀 처리해주게나.", 5, 500, 3));
questList.Add(new Quest("마을을 위협하는 많은 몬스터 처치", "이봐! 마을 근처에 몬스터들이 엄청 많아졌다고 생각하지 않나? \n " +
"마을 주민들의 안전을 위해서라도 저것들 수를 많이 줄여야 한다고! \n" +
"모험가인 자네가 많이 처리해주게나.", 10, 1000, 6));
questList.Add(new Quest("장비를 장착해보자!", "'이봐! 어이 거기 당신! 당신 말이야 \n" +
"이곳을 돌아다니기에 너무 장비가 부실하지않나?\n" +
"장비를 장착하면 내가 갑옷을 하나 주겠네!'", false, 500, 1, ratherArmor));
questList.Add(new Quest("Easy 던전를 올라가자!", "'당신은 Easy던전을 얼마나 올라가봤지? \n" +
"헹, 나는 말이야 무려 4층까지 올라가봤다고!\n" +
"나보다 높게 5층을 올라가면 내 재산중 일부를 보상으로 주겠어'", player, 5, 2500, 20, TowerDifficult.Easy));
}
// 퀘스트의 종류들을 다 볼수 있는 퀘스트 창
public void OpenQuestMenu()
{
while (true)
{
Thread.Sleep(500);
Console.Clear();
string check = "■";
string unCheck = "□";
Console.WriteLine($"퀘스트 목록 (페이지 {currentPage})");
Console.WriteLine("\n");
int start = (currentPage - 1) * PAGE_SIZE == 0 ? 1 : (currentPage - 1) * PAGE_SIZE;
int end = Math.Min(start + PAGE_SIZE, questList.Count);
for (int i = start; i < end + 1; i++)
{
// quest가 장착 관련 퀘스트라면 PlayerEquip을 실행
if (questList[i - 1].isQuestEquip)
{
PlayerEquip(player);
}
// 퀘스트를 수락 했다면 박스가 칠해지게
string questCheck = questList[i - 1].isAccept ? check : unCheck;
questList[i - 1].questNumber = i;
if (questList[i - 1].isReward)
Console.ForegroundColor = ConsoleColor.DarkGray;
else if (questList[i - 1].isComplete && questList[i - 1].isAccept)
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"{i % PAGE_SIZE}. {questList[i - 1].questName} | {questCheck}");
Console.ResetColor();
}
Console.WriteLine("\n");
Console.WriteLine("8. 다음 페이지");
Console.WriteLine("9. 진행 중 퀘스트");
Console.WriteLine("0. 뒤로가기");
Console.Write("\n입력 : ");
string Pinput = Console.ReadLine();
int numinput;
if (int.TryParse(Pinput, out numinput))
{
if (numinput == 0)
return;
else if (numinput == 8)
NextPage();
else if (numinput == 9)
OpenAcceptQuest();
// 입력받은 값이 0보다 크고 PAGE_SIZE(7)보다 작고 start + numinput - 1 의 값이 questList 갯수보다 작다면 실행
else if (0 < numinput && numinput <= PAGE_SIZE && start + numinput - 1 <= questList.Count)
{
if (questList[start + numinput - 2].isReward)
{
Console.WriteLine("이미 받은 보상입니다.");
}
else
QuestInfo(questList[start + numinput - 2]);
}
}
else
Console.WriteLine("잘못 된 입력입니다.");
}
}
// 다음 페이지가 있다면 다음페이지를 보여주는 메서드
public void NextPage()
{
if (currentPage * PAGE_SIZE < questList.Count)
currentPage++;
else
Console.WriteLine("마지막 페이지 입니다.");
}
// 수락한 퀘스트 메뉴를 열어주는 메서드
public void OpenAcceptQuest()
{
while (true)
{
Thread.Sleep(500);
Console.Clear();
Console.WriteLine();
Console.WriteLine("수락한 퀘스트 목록(최대 2개) \n");
if (acceptQuest.Count == 0)
{
Console.WriteLine("수락한 퀘스트가 없습니다.");
}
else
{
for (int i = 0; i < acceptQuest.Count; i++)
{
// quest가 장착 관련 퀘스트라면 PlayerEquip을 실행
if (acceptQuest[i].isQuestEquip)
{
PlayerEquip(player);
}
if (acceptQuest[i].isComplete)
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"{i + 1}. {acceptQuest[i].questName}");
Console.ResetColor();
}
}
Console.WriteLine("\n0. 뒤로가기");
Console.WriteLine();
int input = Input.input(0, acceptQuest.Count);
if (input == 0)
return;
else if (input == 1)
QuestInfo(acceptQuest[0]);
else if (input == 2)
QuestInfo(acceptQuest[1]);
}
}
// 퀘스트의 정보를 보여주는 메서드(아직 미완)
public void QuestInfo(Quest quest)
{
while (true)
{
Thread.Sleep(500);
Console.Clear();
Console.WriteLine($"{quest.questNumber}. {quest.questName}");
Console.WriteLine();
Console.WriteLine($"{quest.questInfo}");
Console.WriteLine();
Console.WriteLine($"보상 : {quest.rewardGold} G, {quest.rewardExp} 경험치");
if (quest.questKills > 0)
{
Console.WriteLine($"몬스터 {quest.questKills} 처치하기 ({quest.currentKills} / {quest.questKills})");
}
else if (quest.isItemReward)
{
Console.WriteLine($"{quest.rewardItem.Name}");
}
else if (quest.questTower > 0)
{
Console.WriteLine($"{quest.TD} 난이도 {quest.questTower} 층 올라가기");
}
Console.WriteLine();
if (quest.isAccept && quest.isComplete)
{
Console.WriteLine("1. 퀘스트 완료");
}
else if (!quest.isAccept)
Console.WriteLine("1. 퀘스트 수락");
else if (quest.isAccept)
Console.WriteLine("1. 퀘스트 거절");
Console.WriteLine("0. 닫기");
Console.WriteLine();
int input = Input.input(0, 1);
if (input == 0) return;
else if (input == 1)
{
// 퀘스트를 받았고 퀘스트를 완료를 했다면
if (quest.isAccept && quest.isComplete)
{
if (quest.isItemReward)
CompleteQuest(player, quest, itemIvn);
else if (quest.questKills > 0 || quest.questTower > 0)
CompleteQuest(player, quest);
return;
}
// 퀘스트를 받지 않았다면 퀘스트를 받을수 있게
else if (!quest.isAccept)
{
AcceptQuest(quest);
return;
}
// 퀘스트를 받아놓고 완료를 못했다면 퀘스트를 포기할 수 있게
else if(quest.isAccept)
{
RejectQuest(quest);
return;
}
else
Console.WriteLine("잘못 된 입력입니다.");
}
else
Console.WriteLine("잘못 된 입력입니다.");
}
}
// 퀘스트를 수락했을 떄 실행시켜줄 메서드
public void AcceptQuest(Quest quest)
{
if (quest.isAccept)
{
Console.WriteLine("이미 수락한 퀘스트 입니다.");
return;
}
if (acceptQuest.Count >= 2)
{
Console.WriteLine("퀘스트는 최대 2개만 받으실 수 있습니다.");
return;
}
quest.Accept();
acceptQuest.Add(quest);
// List1 의 3번째를 List 2번에 Add List
}
//퀘스트를 거절 했을 때 실행시켜줄 메서드
public void RejectQuest(Quest quest)
{
if (quest.isAccept)
{
acceptQuest.Remove(quest);
quest.Reject();
}
}
//퀘스트를 완료 했을 때 실행시켜줄 메서드
public void CompleteQuest(Player player, Quest quest)
{
if (quest.isAccept && quest.isComplete)
{
quest.Complete(player);
acceptQuest.Remove(quest);
}
}
public void CompleteQuest(Player player, Quest quest, Inven inv)
{
if (quest.isAccept && quest.isComplete)
{
quest.Complete(player, inv);
acceptQuest.Remove(quest);
}
}
//몬스터를 죽일 떄 호출시켜줄 메서드
public void KillMonster()
{
if (acceptQuest.Count >= 0)
{
foreach (Quest quest in acceptQuest)
{
if (quest.questKills > 0 && !quest.isComplete)
{
quest.currentKills++;
if (quest.currentKills >= quest.questKills)
{
quest.isComplete = true;
}
}
}
}
}
public void PlayerEquip(Player play)
{
if (acceptQuest.Count >= 0)
{
foreach (Quest quest in acceptQuest)
{
if (quest.isQuestEquip && !quest.isEquip && play.isEquip)
{
quest.isComplete = true;
}
}
}
}
}
}
오늘은 장비아이템을 장착했다면 '해진 가죽갑옷'을 보상으로 주는 퀘스트를 생성하고
퀘스트가 완료되었다면 퀘스트를 완료할 수 있게 만들었습니다.(던전 층수 올라가는 퀘스트 추가중)
퀘스트에서 생성자만 생성하고 퀘스트 매니저에서 퀘스트를 제작하니까 코드가 복잡해지는거 같습니다...
각 퀘스트마다 클래스를 만들어서 퀘스트 클래스를 상속받게 하는게 더 좋았나 생각이 듭니다.
(퀘스트가 많아지면 더 복잡해져서 원하는 코드 찾기가 힘들거 같습니다...)
계속 다른종류의 퀘스트를 생성하고 그 퀘스트들을 오버로딩을 하다보니까 각자 클래스로 만들껄 하는 생각이 더 났던거 같습니다.
퀘스트 보상으로 아이템을 얻게 하려니까 문제가 있었습니다! 팀 프로젝트이기 떄문에 각 파트를 나눠서 하는데
캐릭터가 장비아이템을 장착하고 있는가는 인벤토리 파트에서 담당하시고 계셨기 떄문에 추가해달라고 부탁드렸습니다
(금방 해주셔서 작업이 엄청 원활했습니다)
마찬가지로 KillMonster() 메서드도 몬스터가 죽을 때 마다 호출을 시켜줘야 했기에 전투파트 하시는 분에게 추가시켜 달라고 부탁드렸습니다
목요일날이 마지막이기에 던전올라가는 퀘스트(이지, 노말, 하드)만 만들고 퀘스트는 마무리하지 않을까 싶습니다.