ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2024.1.2-class
    TIL 2024. 1. 2. 21:58

     

    2024년입니다.

    벌써 시간이 이렇게 지났군요.. 살짝 감성에 젖게 됩니다.

    저번에는 개인과제의 틀을 정리했다면 오늘은 세세하게 건드려볼 예정입니다.

    이미 만들어진 부분에 대한 선택사항도 추가해볼 생각입니다.

    던전을 만들거나 레벨업 기능 추가는 내일이나 내일모레 되면 만들어볼 생각입니다.

     


     

    개인과제

     

    필수사항

    1. 게임 시작 화면 : 거의 완성을 한 상태. 첫화면 문구랑 다른 메뉴 들렸다가 이동할 경우 문구를 다르게 하면 좋겠다 생각.

    public void setMenu()
    {
        Console.Clear();
        menu2(menu());
    }

    함수들로만 이루어져 있다가 class로 교체하는 과정에서 Menu를 상속 받지 않는 class가 사용하기 쉽도록 새로운 함수를 만들었음.

     

    2. 상태보기 : 아이템 장착 시 추가되는 부분 완료.

    ->함수로 했을 때 만들었는데.. class로 바꾸는 과정에서 다른 class 설정하느라 제대로 된건지 확인 불가..

     

    3. 인벤토리 : 인벤토리 아이템 리스트 사용 취소. 

    3-1. 장착 관리 : 장착 선택 시 [E] 추가 완료. 장착한 아이템 선택 시 장착해제 추가 필요. 선택사항 5번 추가 예정.

    abstract class Item
    {
        public string[] name = new string[6];
        public int[] stats = new int[6];
        public string[] gold = new string[6];
        public string[] comment = new string[6];
        
        public abstract void Make();
    }
    class ItemName : Item
    {
        Random random1 = new Random();
        Random random2 = new Random();
    
        string[] firstName = {"나무", "낡은 ", "청동", "무쇠", "스파트라의 "};
        string[] secondName = { "갑옷", "검", "창"};
    
        public override void Make()
        {
            int itemLength = name.Length;
            for (int i = 0; i < itemLength; i++)
            {
                int n = random1.Next(10);
                int nn = random2.Next(10);
                if (n < 5)
                {
                    if (nn < 5)
                    {
                    }
                }
            }  
        }
    
        public void WearItem(int number)
        {
            name[number] = "[E]" + name[number];
        }
    }
    class ItemStats : Item
    {
        Random random = new Random();
        State state = new State();
    
        public override void Make()
        {
            for (int i = 0; i < 6; i++)
            {
                if (name[i].Contains("나무") || name[i].Contains("낡은"))
                {
                    int n = random.Next(1, 3);
                    stats[i] = n;
                }
            }
        }
    
        public void ViewStats()
        {
            for(int i = 0; i < 6; i++)
            {
                if (name[i].Contains("갑옷"))
                {
                    Console.Write("방어력 +{0}", stats[i]);
                }
                else
                {
                    Console.Write("공격력 +{0}", stats[i]);
                }
            }
        }
    }
    class ItemGold : Item
    {
        Random random = new Random();
        public override void Make()
        {
            for (int i = 0; i < 6; i++)
            {
                if (name[i].Contains("나무") || name[i].Contains("낡은"))
                {
                    int n = random.Next(1, 8)*100;
                    gold[i] = n.ToString();
                }
            }
        }
    }
    class ItemComment : Item
    {
        string firstComment;
        string SecondComment;
        
        public override void Make()
        {
            for(int i = 0;i < 6; i++)
            {
                if (name[i].Contains("나무"));
    
                comment[i] = firstComment + SecondComment;
            }
        }
    }

    아이템 생성 부분. 원래는 store함수에 넣을까 했지만 item 클래스를 따로 만들어서 만들기로 결정. 

    부모 클래스가 자식 클래스에 있는 정보를 가져오는 방법이 없어보여서 따로 연결은 해주지 않았음.

    오히려 부모-자식 간에 부모가 자식 클래스에 있는 정보를 가져올 경우 오버플로우가 생길 수 있음.

    클래스를 새롭게 만들면서 장비에 대한 설명을 추가했음.

    착용 시 [E]가 나올 수 있게 만들었고 내일은 [E] 있는거 선택하면 이미 착용 중이라는 설명을 보여주거나 [E]를 지워버리는 설정을 할 예정.

    장작된 장비에 대한 스탯을 상태에 넣은 과정도 추가 필요.

    배열을 사용할 경우 배열에 대한 크기를 설정해줘서 저장할 공간을 만들어줘야함. 안그러면 생성은 했지만 공간이 없어서 오류가 나옴.

    인벤토리의 경우에는 배열을 사용해서 크기를 미리 지정해두고 그것을 화면에 나올 수 있도록 설정이 필요함.

     

    4. 상점 : 상점리세 불가하게 변경 완료. 단, 구매하고 난 뒤에 다시 메뉴에서 상점으로 이동할 경우 새로운 아이템들로 변경됨. 상점 아이템 가격 조정 필요. 상점 아이템 이름 수정 및 그에 맞는 설명 추가 필요.

    class StoreItem 
    {
        Item ItemName = new ItemName();
        Item ItemStats = new ItemStats();
        Item ItemGold = new ItemGold();
        Item ItemComment = new ItemComment();
        int i=0;
        public void StoreItemList()
        {
        }
    }

    Item으로 생성한 것은 StoreItem에 옮기는 작업 중. StoreItem은 Store 자식 클래스로 바꿀 예정.

    근데 굳이 StoreItem이 필요할지 의문이 들기는 함. 아무래도 이 부분은 Store에서 받아서 해도 되기 때문이라고 생각함.

    또한, 상점 리세의 경우 불가하게 만들었지만 class로 바꾸면서 다시 확인해봐야하는 부분이 되어버림.

    함수 부분들 class로 묶기

    internal class Program
    {
        static void Main(string[] args)
        {
            Menu menu = new Menu();
            menu.setMenu();
        }
    
        class Menu
        {
        }
     }

    Console.Clear(); : 콘솔 화면에 있는 내용들을 지워주는 역할

     

    선택사항

     

    1. 아이템 정보를 클래스 / 구조체로 활용해보기 -> 어떻게 하는 중

    2. 아이템 정보를 배열로 관리하기 -> 어떻게 되는 중

    3. 아이템 추가하기 -> class Item에서 완료.

    3-1. 나만의 새로운 아이템을 추가하기 : 플레이어가 따로 추가가 가능하게 만든다는 것인지 잘 모르겠음.

    4. 아이템 판매하기

    5. 장착 개선

    6. 던전입장 기능 추가

    7. 휴식기능 추가

    8. 레벨업 기능 추가

    9. 게임 저장하기 추가


     

    함수

    static void Main 때문에 생성하는 모든 함수 앞에 static을 붙여줘야함

    대신 class 안에 만드는 함수의 경우 static을 붙일 필요는 없음.

    오버로딩

    함수명은 같지만 매개변수의 갯수, 타입, 순서 등이 달라서 새롭게 정의가 가능함.

     

    구조체

    struct

    변수와 함수를 선언할 수 있음.

    변수의 경우 초기화는 다른 함수 안에서 가능함.

    class와 비슷하지만 간단한 것들만 구조체를 이용해서 저장이 가능함.

     

    Class

    객체지향 프로그래밍 : 캡슐화, 상속, 다형성, 추상화, 객체

    ->클래스는 객체 생성을 위한 틀 , 객체는 틀을 이용해서 만들어진 실체라고 볼 수 있다.

     

    구성요소 : 필드, 함수, 생성자, 소멸자

    ->필드는 객체의 상태를 저장. 필드 = 변수 라고 생각하면 편함.

    ->함수 == 메서드로 객체의 행동, 동작을 구현.

    ->생성자는 자동으로 생성되지만 새로 만들 수 있음. 새로 만들 경우 자동으로 생성되는 생성자는 사라짐.

    ->소멸자는 프로그램이 끝날 때 등장할 수 있음. 현재 visual studio 버전이 높으면 나타나지 않음

     

    접근 제한 : public, private, protected

    ->public : 외부에서 자유롭게 사용가능. 그만큼 변화도 가능.

    ->private : 사용된 클래스 안에서만 사용가능.

    ->protected : 사용된 클래스 안과 상속받은 클래스에서만 사용 가능.

     

    +프로퍼티 : 필드에 간접적으로 값을 설정할 수 있게 해줌.

    get { return 변수명;} set{ 변수명 = value;}

    or {get; set;} 으로 간편하게 정의 가능.

     

    상속(Inheritance)

    부모 클래스(기존 클래스)를 확장하거나 재사용하여 자식 클래스(새로운 클래스)를 생성.

    C#은 단일 상속만 가능함(1:1)

    자식 클래스는 부모 클래스에 접근이 가능하여 부모 클래스의 기능을 사용할 수 있다.

    또한, 부모 클래스에 있던 함수를 그대로 가져와 재정의가 가능하다.

     

    다형성

    추상 클래스(abstract)

    인스턴스를 생성할 수 없는 클래스로, 상속을 위한 베이스 클래스로 사용.

    이를 이용해서 abstract class Item 생성

    abstract 매서드 생성 가능. 단, 메서드의 내용은 없다.

    자식 클래스는 부모 클래스에 있는 메서드를 '반드시' 구현해야 한다.


     

    강의 중 함수 부분을 들었는데 만들어둔 함수들 앞에 static을 붙여야한다고 하더라구요.

    처음에 함수 만들 때 static을 안붙여서 계속 오류가 발생하길래 Main 안으로 함수를 만들어서 넣었더니 이제 수정하려니깐 너무 .... 힘드네요 ㅠㅠ

    심지어 쓰던 변수들도 static을 붙여줘야하는데 왜 그래야하는지 나중에 알려준다고 하셨는데..

    저는 그게 너무 복잡해지는 것 같아서 그냥 코드를 갈아엎기로 했습니다.

    강의 부분에서 class에 관한 내용이 나오더라구요.

    그래서 클래스에 대한 내용도 들으면서 class 사용하는 것이 선택사항에도 있어서 그냥 갈아엎는게 마음이 편할 것같더라구요.

    약간 제 성격이긴한데 공부하다가 필기 정리하는데 마음에 안들면 처음부터 다시 끝까지 적고 그걸 좀 많이 반복하는 편입니다. 이 성격이 여기에도 나올줄은.. 몰랐네요 ㅠ

     

    그래서 다 엎어서 class로 만들어줬습니다. 사실 전부 다 엎은 건 아니고 만들어둔 함수는 //를 이용해서 클래스안에 메서드를 만들 때 참고하거나 가져오고 있습니다.

    그냥 강의 먼저 듣고 만들껄 그랬나봅니다..

     

    진전된게 없어.. ㅠㅠ 내일은 꼭 다 만들어보겠습니다 ㅠㅠ

    'TIL' 카테고리의 다른 글

    2023.1.4  (2) 2024.01.04
    2024.1.3  (1) 2024.01.03
    2023.12.29 - 주석 단축키, 조건문, 배열, 컬렉션  (1) 2023.12.29
    2023.12.28  (0) 2023.12.28
    2023.12.27  (1) 2023.12.27
Designed by Tistory.