2024-04-29

이재형·2024년 4월 29일
0
post-thumbnail

스파르타 TextDungeonGame 개발 1일차

구현 내용

1. 퀘스트 클래스

// 퀘스트 전체 정보
public List<QuestInfo> QuestInfos = new List<QuestInfo>();
// 상점 아이템 정보들
public List<Items> ShopItems;
// 퀘스트들의 정보
Hunting hunt = new Hunting();
EquipItem equip = new EquipItem();
PowerUp power = new PowerUp();

public Quest()
{   
    QuestInfos.Add(hunt);
    QuestInfos.Add(equip);
    QuestInfos.Add(power);
}

1. 해당하는 퀘스트 정보와 퀘스트 집합체, 상점 아이템 목록을 받아옴


2. 퀘스트(클리어, 수락 여부에 따른 클리어 보상 획득)

// 퀘스트 정보 보여주기
public void QuestShow(Charactors charactor, List<Items> shopitems)
{
    // 퀘스트 클리어 여부 확인
    QuestClear(charactor);
    // 해당 퀘스트의 정보 출력
    Console.WriteLine("Quest");
	Console.WriteLine($"{questName}\n\n{questDescription}\n");
	// 목표 횟수가 있는 퀘스트
	if (maxCount != 0)
	{
        Console.WriteLine($"- {questGoal}");
    }
	// 목표 횟수가 없는 퀘스트
	else
	{
        Console.WriteLine($"- {questGoal}");
    }
	
    Console.WriteLine("\n- 보상 -");
	// 보상 아이템이 있다면
	if (rewardItem != null)
	{
        Console.WriteLine(rewardItem.ItemName + " X 1 ");
    }
	Console.WriteLine(clearGold + "G\n");

    // 퀘스트 여부에 따른 텍스트 및 입력 변경

	// 1. 퀘스트를 클리어 했다면
	if (clearCheak && access)
	{
        Console.WriteLine("0. 돌아가기");
        Console.WriteLine("1. 보상 받기");
        // 선택에 따른 로직
        choice = base.Choice(1, true);
        if (choice == 1)
        {
            Console.WriteLine("퀘스트 보상을 획득하셨습니다.");
            rewardCheck = true;
            // 클리어 골드 획득
            charactor.Gold += clearGold;
            // 아이템이 존재하면
            if (rewardItem != null)
            {
                bool cheack = false; // 아이템 골드 변환 여부
                                     // 해당 아이템을 이미 습득했다면
                foreach (Items item in charactor.Inven)
                {
                    // 플레이어의 장비 목록에 보상 장비가 있다면)
                    if (item.ItemName == rewardItem.ItemName)
                    {
                        Console.WriteLine("해당 아이템을 이미 습득 하셨기 때문에 골드로 지급합니다.");
                        // 보상 장비의 상점 금액으로 지급
                        charactor.Gold += item.Price;
                        cheack = true;
                    }
                }
                // 아이템을 습득하지 않은 상태였다면 아이템을 획득
                if (cheack == false)
                {
                    foreach(Items items in shopitems)
                    {
                        if(items.ItemName == rewardItem.ItemName)
                        {
                            // 플레이어 장비에 아이템 추가
                            rewardItem.IsPurchase = true;
                            charactor.Inven.Add(rewardItem);

                            // 상점에서 해당 아이템 구매 완료로 변경
                            items.IsPurchase = true;
                        }
                    }
                }
            }
        }
    }
    // 2. 퀘스트만 수락했다면
    else if (access)
    {
        Console.WriteLine("0. 돌아가기");
        // 선택에 따른 로직
        choice = base.Choice(1, true);
    }
    // 3. 수락을 하지 않은 상태라면
	else
	{
        Console.WriteLine("0. 거절");
        Console.WriteLine("1. 수락");
        // 선택에 따른 로직
        choice = base.Choice(2, true);
        switch (choice)
        {
            case 1:
                access = true;
                break;
            case 2:
                access = false;
                break;
        }
    }
}

1. 퀘스트를 수락(access)하고 퀘스트를 클리어(ClearCheck)가 true일 시 퀘스트 보상 획득
2. 퀘스트만 수락했다면 돌아가기만
3. 퀘스트 수락조차 하지 않았다면 해당 퀘스트를 수락, 거절을 선택하여 퀘스트 수락(acess)를 true, false로 반환을 함


3. 퀘스트 클리어

public void QuestClear(Charactors _charactor)
{
    // 최대 횟수가 0이 아니고 currentCount가 maxCount가 아니라면
    if(maxCount <= currentCount)
    {
        clearCheak = true;
    }
    // 무기와 방어구를 모두 장착 중이라면
    else if (_charactor.Weapon != null && _charactor.Armor != null)
    {
        if(_charactor.Weapon.IsEquiped && _charactor.Armor.IsEquiped)
        {
            clearCheak = true;
        }
    }
    else if (_charactor.Attack + _charactor.PlusAttack >= def && _charactor.Defend + _charactor.PlusDefend >= def)
    {
        clearCheak = true;
    }
    else
    {
        clearCheak = false;
    }
}

1. 해당 퀘스트마다 조건문으로 설정
2. 조건에 해당하면 clearCheak(클리어 여부) = true로 변경
3. 그 조건에 모두 해당하지 않으면 clearCheak(클리어 여부)를 false로 변경


4. 퀘스트 개인 정보

internal class QuestInfo : MenuHandler
{
    // string
    public string questName;   // 이름
    public string questDescription; // 설명
    public string questGoal;   // 목표
    public string monsterName; // 목표 몬스터 이름

    // items
    public Items rewardItem = null;   // 보상 아이템

    // int
	public int clearGold;      // 보상 골드
    public int currentCount = 0; // 현재 횟수
    public int maxCount = 10000;   // 최대 횟수
    public int atk = 1000;
    public int def = 1000;

    // bool
    public bool clearCheak = false; // 클리어 여부
    public bool access = false; // 수락 여부
    public bool rewardCheck = false; // 보상 획득 여부

1. 각 퀘스트의 정보를 타입별로 분할


5. 퀘스트 정보(3종류)

// 사냥하기
internal class Hunting : QuestInfo
{
    public Hunting()
	{
		monsterName = "미니언";
		currentCount = 0;
		maxCount = 0;
		questName = "마을을 위협하는 미니언 처치";
        questDescription = "이봐! 마을 근처에 미니언들이 너무 많아졌다고 생각하지 않나?\n마을 주민들의 안전을 위해서라도 저것들 수를 좀 줄여야 한다고!\n모험가인 자네가 좀 처치해주게!";
        questGoal = string.Format($"{monsterName} 5마리 처치 ({currentCount} / {maxCount})");
        rewardItem = new Armor(); // 방어구
        clearGold = 5;
    }
}

// 장비를 장착하기
internal class EquipItem : QuestInfo
{
	public EquipItem()
	{
        questName = "장비를 장착해보자";
		questDescription = "자네 신참 모험가가 아닌가? \n모험을 떠나기전에 장비를 구매해서 한 번 장착해보겠는가?";
        questGoal = string.Format($"무기와 방어구를 모두 장착하기");
        // rewardItem; // 보상 아이템
        clearGold = 10;
	}
}

// 더 강해지기
internal class PowerUp : QuestInfo
{
	public PowerUp()
	{
        questName = "더욱 더 강해지기";
        questDescription = "당신 아직 높은 던전에 가기에는 미숙한 거 같군";
        questGoal = string.Format($"공격력 20이상 / 방어력 25이상 ");
        // rewardItem; // 보상 아이템
        clearGold = 30;
        atk = 13;
        def = 23;
    }
}

1. Hunting은 몬스터 처치에 따른 퀘스트
2. EquipItem은 장비 장착에 따른 퀘스트
3. PowerUp은 스탯에 따른 퀘스트


6. 완료한 퀘스트 갱신

public List<QuestInfo> RemoveQuest(List<QuestInfo> _quests)
{
    // 순서
    int count = 0;
    List<QuestInfo> newQuest = new List<QuestInfo>();
    foreach(QuestInfo quest in _quests)
    {
        // 보상을 못한 퀘스트만 추가
        if (!quest.rewardCheck)
        {
            newQuest.Add(quest);
        }
        count++;
    }
    // 보상을 미획득한 퀘스트만 갱신
    return _quests = newQuest;
}

// 퀘스트 수락
public void AcceptQuest(QuestInfo _quest, Charactors _charactor)
{
    Console.WriteLine($"퀘스트: {_quest.questName}를 수락하셨습니다.\n");
}

1. 다른 List<QuestInfo>를 만들어서 변수 newQuest에 퀘스트 빈 목록을 받아옴
2. 받아온 정보를 foreach()로 각 정보에 rewardCheck(보상 획득 여부)가 true가 아니라면
3. 해당 정보를 newQuest에 추가를 함
4. newQuest를 현재 퀘스트 목록으로 변경 함


배운 내용

1. 지금까지 배운 내용을 활용으로 배운 내용 생략

정리

해결 못한 문제

1. 각 퀘스트별로 매개변수를 추가하여 여러 퀘스트 추가

문제점

1. 없음

profile
한국사람

0개의 댓글