스파르타 코딩

내배캠 9일차

choijhha 2025. 2. 10. 20:30

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() 메서드도 몬스터가 죽을 때 마다 호출을 시켜줘야 했기에 전투파트 하시는 분에게 추가시켜 달라고 부탁드렸습니다

 

목요일날이 마지막이기에 던전올라가는 퀘스트(이지, 노말, 하드)만 만들고 퀘스트는 마무리하지 않을까 싶습니다.

 

'스파르타 코딩' 카테고리의 다른 글

내배캠 11일차  (0) 2025.02.12
내배캠 10일차  (0) 2025.02.11
내배캠 8일차  (1) 2025.02.07
내배캠 7일차  (0) 2025.02.06
내배캠 6일차(개인과제) 하면서 느꼇던 것 주저리~  (1) 2025.02.05