ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스파르타 개인 과제 / 던전 입장 전 구현
    스파르타 게임 개발 2024. 4. 28. 13:51

    스파르타 개인 과제 던전 입장 전 상점이나 장비를 장착 하는 것들을 콘솔로 구현 해보자. 

     

    먼저 실행 하면 대화가 나오게 해줘야 한다.

     

    콘솔 라인으로 대화가 나오게 해주자. 

     

    그리고 플레이어가 번호를 선택 하는 기능을 추가 해야한다. 이 것은 매 화면마다 나오므로 메서드로 만들어서 사용 하게 했다. 

     

    public class Choice

    {

     public int select(int min, int max) 
     {
         Console.WriteLine("원하시는 행동을 입력 해주세요.");
         Console.Write(">> ");
         while(true)
         {
             if (int.TryParse(Console.ReadLine(), out int a) && && min <= a && max >= a )
             {

                 return a;
             }
             Console.WriteLine("올바른 값을 입력 해주세요,");
             Console.Write(">> ");
         }
     }

    }

     

    이 메서드를 실행 하면 행동 입력 해달라는 문구가 나오고 리드라인이 나오면서 우리가 원하는 숫자값을 입력 했는지 검사도 하게 했다. 원래는 더 길었는데 튜터님의 해설강의를 보고 줄일 수 있었다. 원래는 min~max 구하는 거 따로 트라이파스 따로 전부 다 따로따로 했었다. 전부 다 합쳐서 메서드 하나로 만들 수 있었다. 원래는 선택이 1개만 있는 경우도 있어서 1개짜리를 추가해서 오버로딩, 했는데 메서드 사용 할 때 파라미터에 똑같은 숫자 넣으면 되는 구나를 깨달았다.

     

    그리고 사실 난 이걸 클래스로 만들고 또 다른 클래스에 상속을 시켜서 그 클래스를 추상클래스로 만들고 추상메서드를 만든 다음에 다른 클래스가 이 클래스를 상속 받고 이 메서드를 실행 내용을 구현 하게 했었다. 뻘짓 한 거 같다. 그래도 나딴에는 배운 거 최대한 활용 하려고 이러지 않았나 싶다. 

    클래스 안에다가 계속 클래스를 만들고 있었다 .. ㅋㅋ 프로그램 안에다가

     

    아무튼 이런 식으로 사용 했었다.

     

    public abstract class Screen : Choice 
    {
        public abstract int screenSelect();
    }

     

    public class Home : Screen  
    {
        public override int screenSelect() 
        {
            ment();
            return select(1, 3);
        }

     

     void ment()

    {

    dd

    dd

    }

    }

     

    나중에 해설강의 보면서 클래스마다 페이지 하나 더 추가 하는 거 보고 깨달았다.. 난 뻘짓을 했구나 ㅇ....,,ㅇ 

    어쩐지 계속 헷갈리더라.. 이게 아닌데 하면서,, 사전캠프 때 vs코드만 썻어가지구.. 핑계다.

     

    그리고 선택 한 숫자에 맞게 알맞은 곳으로 보내줘야 한다. 

     

    난 0번을 선택 했을 시에 아무 것도 적지 않아서 main 함수에서 반복 중인 곳에서 처음부터 실행이 되게 했다. (시작화면)

    그리고 각 번호에 맞는 것을 선택 했을 시에 그 곳에서 화면을 나오게 했다. 

     

    시작화면에서 1번을 눌렀을 경우에 상태창이 나오게 해야했다. 

     

     

    이렇게 나오게 해야 한다. 이 때 콘솔로 공격력이나 전사 이런 걸 출력 하게 하는 것이 아닌 플레이어란 클래스를 새로 만들고 그것을 출력 하게 해야 한다. 난 다른 파일을 하나 만들어서 인터널로 하면 쉬운데 그걸 몰라서 싱글톤 어쩌구저쩌구... 해서 겨우 할 수 있었다. 

     

    그리고 여기서 0번을 누르면 다시 main 함수 처음부터 반복 되게 했다. 

     

    메인 함수 내용

    public static void Main(string[] args)
    {

        Home home = new Home();
        state state = new state();
        inventory inventory = new inventory();
        Store store = new Store();

        while (true)
        {
            int select = home.screenSelect();
            if (select == 1)
            {
                state.screenSelect();
            }
            else if (select == 2)
            {
                inventory.screenSelect();
            }
            else if (select == 3)
            {
                store.screenSelect();
            }
        }
    }

     

    클래스 생성 한 게 많이 보일 것이다...., 그렇다 클래스 안에서 만들어진 클래스 사용 하려면 new로 새로 만들어 줘야 한다. 아니면 싱글톤으로 만들어 주던가.., 이것 때문에 많이 헷갈렸다. 아니 원래 되는데 왜 안 되는 거지?? 하면서 .., 유니티에서는 클래스 별로 스크립트를 만드는 느낌이라서, 아무튼 이해 못 하겠지만,, 너무 혼동이 왔었다 .. 지금은 괜찮다. 

     

    그리고 인벤토리 화면인데 여기서는 상점에서 아이템을 구매 했다면 목록이 보이게 해야했다. 그리고 장착관리도 할 수 있어야 했다. 나는 아이템 장착을 했다 뺐다는 못 했다. 끼게만 구현 할 수 있었다. 여유가 없어서 그랬던 걸까. 귀찮아서 그랬던 걸까. 아무튼 멍청해서 그런 건 아니다.

     

    나는 아무튼 여러길들 돌아서 구현 했다. 상점에서 구매를 했다면 바로 인벤토리에 추가 하게 했어야 했는데 일단 그렇게는 되지 않았고 상점에서 구매 하면 싱글톤으로 돼있는 플레이어 클래스에 추가가 되게 했고 그 다음에 인벤토리 클래스에 한 번 더 추가가 되게 했다. 지금 생각 해보니 인벤토리에서 플레이어 클래스를 사용 하면 됐던 거 아닌가? 아, 아무튼 그 땐 시간 안에 끝내기 위해 바빠서 정신이 없었다. 

     

    그리고 반복문을 통해서 아이템 클래스 안에 있는 설명을 표시 하게 하는 메서드를 실행 시키게 했다. 나는 포리치를 사용 해서 했는데 for 조건문이 더 좋았던 것 같다. 근데 나는 리스트 갯수 확 도니까 포리치로 한건데 해설강의는 포문을 썼다.

     

    그리고 장착관리 들어가서는 번호를 표시하게 해야 했고, 장착 되면 장착 표시 나오게 해야했다. 역시 난 이것도 야매로... 급하게 ..ㅎ 

     

    부끄러우므로 코드는 생략 한다. 해설강의로 깨긋해진 나의 뇌를 다시 나의 코드를 읽어서 더럽히고 싶지 않다.

    사실 지금도 내가 했던 걸 떠올리는 게 싫다. 그냥 깨긋해진 상태로 두고 싶다.

     

     

    아무튼 아이템을 살 경우에 이렇게 들어오게 해주면 된다. 역시 시간여유 따위 없어서 줄맞춤 할 생각 따윈 없었다.

     

    이제 상점화면을 만들어야 한다. 

     

     

    대화가 나오게 하고 현재 보유중 골드가 나오게 해야 하고, 아이템 목록이 나와야 한다. 

     

    골드 나오게 하는 건 나오게 하면 되는데 나는 아이템 리스트 추가를 그렇게 했다. 

     

    원래라면 아이템 클래스를 파일추가로 하나 만들어서 거기서 생성자 하게 하면 됐었겠지만 나는 좀 여러번 꼬은 것 같다. 이건 생각이 안 나서 gpt 찬스 활용 했다.

     

    public List<Item> items = new List<Item>();


    public void addItem(string itemName, string itemType, int value, string price, string explanation, bool install)
    {
        Item newItem = new Item(itemName, itemType, value, price, explanation, install);
        items.Add(newItem);
    }

    public void itemList()
    {
        addItem("수련자 갑옷", "방어력", 5, "1000" , "수련에 도움을 주는 갑옷입니다.", false);
        addItem("무쇠갑옷", "방어력", 9, "2000", "무쇠로 만들어져 튼튼한 갑옷입니다.", false);
        addItem("스파르타의 갑옷", "방어력", 15, "3500", "스파르타의 전사들이 사용 했다는 전설의 갑옷입니다.", false);
        addItem("낡은 검","공격력",2,"600","쉽게 볼 수 있는 낡은 검 입니다.", false);
        addItem("청룡 도끼", "공격력", 5, "1500", "어디선가 사용 됐던 것 같은 도끼 입니다.", false );
        addItem("스파르타의 창", "공격력", 7, "3000", "스파르타의 전사들이 사용 했다는 전설의 창입니다.", false);
    }

     

    이런 식으로 .., 지금 생각 하면 생성자 사용 했으면 됐는데 딱 보아도 이상하게 구현 한 것 같다. 하지만 이 때는 오 gpt 대단 한 걸 이런 걸 떠올리다니 했었다. 이렇게 하느라 아이템 리스트가 생기게 하려면 저 아이템리스트 메서드를 실행 시키게 해야 했고 ..... 등등등 어우 복잡 했다. 나의 뇌가 다시 더러워지기 전에 다음으로 넘어간다.

     

    이제 상점에서 구매기능을 추가 해야 했다. 

    구매버튼을 누르면 번호가 나오게 해야했다. 그건 또 야매방식으로 처리를 했고 번호를 선택 하면 아이템 가격과 보유중인 골드에 따라 구매와 구매실패 등등이 적절히 나오게 해야 했다. 

     

    나는 번호가 선택 됐을 때 그 선택 된 아이템의 가격을 가져오게 했고 그 아이템과 현재 골드를 비교 해서 살 수 있다면 사고, 살 수 없다면 골드 부족 하다 하고, 그리고 구매 한 아이템이라고 표시 하게 했는데, 이건 내가 골드와 프라이스를 스프링, 문자열로 처리를 했었기에 이런 식으로 구현을 했다 ... 

    구매 하면 프라이스가 구매완료로 바뀌고, 트라이파스가 실행이 안 돼서 구매가 완료 되었습니다... 출력 요런 식으로 ..ㅋ

    넘어간다.

    야매식 구현 완료

     

    아이템 장착도 하게 해줬다. 

    플레이어 클래스에 변수를 하나 만들고 아이템 장착이 눌러졌을 때마다 그 아이템에 공격력이 추가가 되게 하는..., 

    그리고 그 추가 된 공격력으로 플레이어 스텟에 합쳐서 나오고 옆에 +보너스공격력 표시 나오게 하게 했다... ㅋ

    허허 계속 야매로만 하는 구만.

    공격력 추가가 적용 된 모습..., 

     

     

    느낀점

    이렇게 해서 첫 번째 개인과제가 끝이 났다. 사실 난 개인과제 결과 따위 아무렇지 않은데 내 숙련도를 올리지 못 한게 너무나도 아쉽다. 아무래도 제출 하루 전 밤에 시작을 했는데 내 생각과 달리 제대로 되는 게 없어서 조바심이 엄청 생겨서 그랬던 것 같다.. 그냥 숙련도 올리는 느낌으로 과제를 했더라면 좀 더 좋았을 것 같다. 숫자맞추기 게임 만들 때 반복문에 대해 이해도가 올랐던 것처럼. 앞으로 과제를 하면서 좀 느리더라도 그런 것들을 느끼면서 과제를 해야겠다. 적당히 트롤 안 되게,, 이번엔 당장 눈 앞에 오류들만 치우느라 너무 정신 없이 만들었다. 

     

    그래도 다행히 해설강의 보면서 다시 공부 해서 나의 복잡한 머리를 정리 할 수 있었다. 

     

    스파르타 캠프의 동영상 강의는 솔직히 도움 많이 없는 것 같긴 한데 과제나 숙제 등으로 숙련도를 자연스럽게 올리게 해주고 특강들을 맞춰서 해주기 때문에 부족함은 못 느낄 것 같다. 열심히 하자.

    엄청 깔끔해진 콘솔게임..

     

    그래도 다행이다.. 개념을 다시 잡을 수 있어서,, 나중에 추가 기능 구현 목록들 해보면서 또 연습 해야겠다. 

    지금은 밀린 강의 보고 공부 해야 한다. 다음 주 또 프로젝트 시작이라 시간이 없군.

Designed by Tistory.