김김김의 게임개발
  • C# #25 TextRPG_Team 3
    2023년 08월 31일 20시 52분 31초에 업로드 된 글입니다.
    작성자: noun06

    진행상황

    • 간단하게 BattleManager 클래스 내부에서 수정을 통해 스테이지를 구성하였다. StartBattle 메서드에서는 한 번의 전투가 끝나고 플레이어가 살아남은 경우 다음 스테이지로 이동하거나 포기하는 선택권이 주어진다.
    • ShuffleMonster 메서드 내에서는 진행한 스테이지에 따라 최대 몬스터 숫자가 증가시키는 로직을 추가하여 난이도를 조정하였다. 또한 5스테이지에서는 새로운 클래스를 통해 세팅해놓은 보스몬스터가 출현한다. 
    • StageProgress 클래스는 현재 스테이지 진행 상황을 저장하고 로드하는 기능을 가지고 있다. Load메서드는 JsonUtility.Load<StageProgress>("stage_progress")를 호출하여 해당 json 파일에서 저장된 스테이지 진행 상황을 불러온다. Save메서드는 현재 객체의 상태를 json 형식으로 직렬화하여 해당 json 파일에 저장한다. 스테이지가 진행될 때마다 StageProgress 객체의 CurrentStage 값을 업데이트하고 해당 값을 호출하여 진행상황을 유지한다.

     

    문제점과 계획

    • 보스몬스터 출현 로직에서 버그가 있음. 전투에서 나갔을 때 해결되지만 5스테이지에서 계속 진행 시 보스몬스터가 때무더기로 등장함. 저장 시스템의 경우 현재 기능이 동작하기는 하지만 팀원들의 기능들과 충돌이 발생하였고 뭔가 통일성과 직관성이 떨어지기 때문에 전반적인 수정작업을 진행해야할 듯함.

    코드

    //BattleManager.cs
    
    public void StartBattle(Character player)
            {
                currentStage = stageProgress.CurrentStage;
    
                while (true)
                {
                    if (CheckBattleEnd())
                    {
                        DisplayerResult();
                        if (player.CurrentHp <= 0)
                        {
                            Console.WriteLine();
                            Console.WriteLine("1. 메인 화면으로 돌아가기");
                            Console.WriteLine();
                            Console.WriteLine("원하시는 행동을 입력하세요");
                            Console.Write(">> ");
    
                            int input = Program.CheckValidInput(1, 1);
    
                            if (input == 1)
                            {
                                Program.DisplayGameIntro();
                            }
                        }
                        else
                        {
                            Console.WriteLine();
                            Console.WriteLine("1. 다음 스테이지로 이동");
                            Console.WriteLine("2. 메인 화면으로 돌아가기");
                            Console.WriteLine();
                            Console.WriteLine("원하시는 행동을 입력하세요");
                            Console.Write(">> ");
    
                            int input = Program.CheckValidInput(1, 2);
    
                            if (input == 1)
                            {
                                currentStage++;
                                stageProgress.CurrentStage = currentStage; // 스테이지 진행상황 업데이트
                                stageProgress.Save();
    
                                killedMonster.Clear(); // 이전 스테이지에서 잡은 몬스터 초기화
                                ShuffleMonsters();
                            }
                            else
                            {
                                Program.DisplayGameIntro();
                            }
                        }
                    }
                    else
                    {
                        DisplayBattleScreen(false);
                        int input = Program.CheckValidInput(0, 2);
                        switch (input)
                        {
                            case 0:
                                DisplayerResult();
                                Program.DisplayGameIntro();
                                break;
                            case 1:
                                DisplayBattleScreen(true);
                                PlayerTurn();
                                break;
                            case 2:
                                DisplayBattleScreen(true, true);
                                break;
                        }
    
                        MonsterTurn();
    
                        
                    }
                }
    
            }
            
    public void ShuffleMonsters()
            {
                currentStage = stageProgress.CurrentStage;
    
                int minMonsters = 1;
                int maxMonsters = currentStage + 1; // 스테이지마다 최대 몬스터수 증가
                int numberOfMonsters = Random.Next(minMonsters, maxMonsters);
    
                List<Monster> newMonstersList = new List<Monster>();
    
                for (int i = 0; i < numberOfMonsters; i++)
                {
                    int randomIndex = Random.Next(0, monsters.Length);
                    Monster randomMonster = monsters[randomIndex].Clone(); // 몬스터를 복제하여 추가
                    newMonstersList.Add(randomMonster);
                }
    
                if (currentStage == 5)
                {
                    newMonstersList.Add(boss.Clone());
                }
    
                aliveMonsters = new List<Monster>(newMonstersList);
                monsters = newMonstersList.ToArray(); // 복제된 몬스터들을 배열로 변환하여 할당
            }     
            
            
    //StageProgress.cs
    
    namespace TextRPG_Team
        {
            public class StageProgress
            {
                public int CurrentStage { get; set; } = 1;
    
                public static StageProgress Load()
                {
                    return JsonUtility.Load<StageProgress>("stage_progress");
                }
    
                public void Save()
                {
                    JsonUtility.Save(this, "stage_progress");
                }
            }
        }

     

    결과물

     

     

     

    댓글