2024-05-03

이재형·2024년 5월 3일
0
post-thumbnail

스파르타 TextDungeonGame 개발 5일차

구현 내용

1. 전투 선택지에 도망 구현

public bool escapeCheck = false; // 던전 탈출 여부

// 플레이어 턴 메서드
private void PlayerTurn()
{
    #region ConsolePrint
    DisplayMonsters(false);
    DisplayPlayerInfo();
    Console.WriteLine($"\n{charactor.Name}의 턴");
    Console.WriteLine("1. 공격");
    Console.WriteLine("2. 스킬");
    Console.WriteLine("3. 도망");
    Console.Write(">> ");
    #endregion ConsolePrint

    int choice = GetChoice();


    switch (choice)
    {
        case 1:
            PlayerAttack();
            break;
        case 2:
            PlayerSkill();
            break;
        case 3:
            PlayerEscape();
            break;
        default:
            Console.WriteLine("잘못된 입력입니다.");
            PlayerTurn();
            return;
    }
    if (!MonsterAllDead() && escapeCheck == false)
    {
        EnemyTurn();
        return;
    }
}

// 플레이어 도망
private void PlayerEscape()
{
    Console.WriteLine("도망을 시도합니다.\n");
    Thread.Sleep(500);
    // 랜덤 선언 후 
    Random random = new Random();
    int chance = random.Next(0, 10);
    if (chance > 6) // 7 8 9 = 30% 확률로 도망 실패
    {
        Console.WriteLine("도망에 실패하였습니다.\n");
    }
    else
    {
        escapeCheck = true;
    }
}

// 전투 시작
void StartBattle(DungeonLv dungeonLevel)
{
    
    // 몬스터 생성
    Monster[] monsters = CreateMonsters(dungeonLevel);

    if (monsters != null)
    {
        // 전투 시작
        Battle battle = new Battle(charactor, monsters);
        escapeCheck = battle.InBattle();
    }

    //몬스터 생성이 되지 않았을 때.
    else
    {
        Console.WriteLine("몬스터를 생성하는 데 문제가 발생했습니다.");
    }
}

// 던전 탈출
if (escapeCheck)
{
    Console.WriteLine("던전에서 도망쳤습니다.\n");
    return;
}

1. 던전 클래스에 전역변수 escapeCheck로 탈출 여부를 나타내는 변수 선언 및 초기화
2. Battle클래스에 PlayerTurn메서드를 사용하여 3번 도망 기능을 switch문으로 연결
3. 70%로 도망을 쳐 escapeCheck를 true로 초기화하고 30%로 적의 턴으로 하게 함
4. 도망을 쳤다면 해당 Battle클래스의 메서드를 bool로 escapeCheck를 반환하여 던전 클래스의 escapeCheck로에 추가함
5. 던전의 DungeonExplore메서드에 escapeCheck의 값에 따라서 던전에 도망쳤다고 텍스트 출력 후 해당 메서드를 나감


2. 저장 시 현재 퀘스트의 진행 상태 저장

// 새로시작 시 퀘스트 생성
public Quest(bool check)
{   
    QuestInfos.Add(hunt);
    QuestInfos.Add(equip);
    QuestInfos.Add(power);
}
// 이어하기 시 퀘스트 로드
public Quest()
{
    // 저장된 퀘스트의 오버로딩
}

public Intro()
{
    dataManager = DataManager.getInstnace();
    menu = 7;
    status = new Status(); //new를 통해서초기화를한다(객체만들기)
    store = new Store();
    dungeon = new Dungeon();
    spa = new Spa();
    quest = new Quest(true);
    
}


internal void SaveQuestToJson(Quest _quest)
{
    string filePath1 = Path.Combine(userDocumentsFolder, "Quest.txt");
    using (File.Create(filePath1)) { }
    string json1 = JsonConvert.SerializeObject(_quest, Formatting.Indented);
    File.WriteAllText(filePath1, json1);
}

// 데이터 불러오기
internal Quest LoadQuestFromJson()
{
    // 읽어올 파일 경로.
    string filePath1 = Path.Combine(userDocumentsFolder, "Quest.txt");

    // 파일 있으면 불러오기.
    string json1 = File.ReadAllText(filePath1);
    Quest Loadquest = JsonConvert.DeserializeObject<Quest>(json1);
    return Loadquest;
}

// 게임 스타트
public void GameStart()
{
    Console.WriteLine("1. 새로시작");
    Console.WriteLine("2. 이어하기");
    choice = base.Choice(3, false);
    switch (choice)
    {
        case 1:
            // 캐릭터 생성
            MakeCharactor();
            // 생성한 캐릭터 정보 저장
            dataManager.SaveCharactorToJson(charactor);
            dataManager.SaveQuestToJson(quest);
            break;

        case 2:
            // 캐릭터 정보 받아오기
            charactor = dataManager.LoadCharactorFromJson();
            quest =  dataManager.LoadQuestFromJson();
            // 캐릭터 정보가 없다면
            if (charactor == null)
            {
                Console.WriteLine("\n저장된 정보가 없어 새로 시작합니다.\n");
                MakeCharactor();
            }
            break;
    }
    // 인벤토리 정보 받기
    inventory = new Inventory(charactor.Inven);

       
        // 게임 진행
    while (charactor.HP!=0 && isGameEnd)

    {
        IntroMenu();
    }
}

case 6:
    dataManager.SaveCharactorToJson(charactor);
    dataManager.SaveQuestToJson(quest);

1. 저장할 Quest클래스의 오버로딩으로 퀘스트를 추가 안하는 생성자를 생성
2. 처음 intro로 실행할 때 bool값이 있는 생성자를 생성하여 퀘스트가 있는 생성잘르 생성
3. 퀘스트를 저장할 SaveQuestToJson, LoadQuestFromJson를 생성 Quest클래스의 접근 지정자가 internal이므로 메서드로 internal로 생성
4. 데이터를 역직렬화할 때 해당 클래스의 매개변수는 생성자를 생성하므로 Quest클래스를 받아올 때 퀘스트를 추가하지 않은 생성자를 받아와 퀘스트가 6개가 되는 상황을 없앰
5. GameStart메서드로 이어하기를 하면 해당 quest 받아오고 새로시작을 하면 quest를 저장함
6. 메뉴에서 선택지에서 저장하기를 누르면 해당 캐릭터와 퀘스트를 저장하는 메서드를 실행함


버그 수정

1. 퀘스트 조건 만족 후에 다시 불만족이 되면 보상획득이 안사라지는 상황

public override void QuestClear(Charactor _charactor)
{
    if (_charactor.Attack + _charactor.PlusAttack >= atk && _charactor.Defend + _charactor.PlusDefend >= def)
    {
        clearCheak = true;
    }
    else
    {
        clearCheak = false;
    }
}

1. 해당하는 퀘스트 조건을 클리어하면 clearChak를 true를 하지만 아닐 때 false를 추가하지 않아 추가함


2. 퀘스트 수락 텍스트가 거절을 해도 나오는 상황

else
{
    Console.WriteLine("0. 거절");
    Console.WriteLine("1. 수락");
    // 선택에 따른 로직
    choice = base.Choice(1, true);
    switch (choice)
    {
        case 0:
            Restart = true;
            access = false;
            break;
        case 1:
            // 몬스터의 이름이 
            switch (monsterName)
            {
                case "Minion":
                    currentCount = charactor.MinionCount;
                    maxCount = currentCount + 5;
                    break;
                case "CannonMinion":
                    currentCount = charactor.CannonCount;
                    maxCount = currentCount + 5;
                    break;
                case "vacuity":
                    currentCount = charactor.vacuityCount;
                    maxCount = currentCount + 5;
                    break;
                default:
                    // 몬스터 처치 퀘스트가 아니므로 없으므로 넘김
                    break;
            }
            Console.WriteLine($"퀘스트: {questName}를 수락하셨습니다.\n");
            access = true;
            break;
    }
}

1. 거절 수락을 선택하는 선택지에서 1. 수락을 선택하면 해당 퀘스트를 수락했다고 텍스트가 나와서 수락을 처음하는 1번만 출력하게 함


배운 내용

1. 팀원들의 코드를 활용하는 상황이 생기므로 팀원들의 코드를 보고 공부나 이해를 해야겠음
2. 데이터를 저장, 불러올때를 생각하면서 오버로딩을 하는 습관을 가져야겠음

정리

해결 못한 문제

1. 없음

문제점

1. 없음

profile
한국사람

0개의 댓글