본문 바로가기
KDT/C# 프로그래밍

23/07/26 과제 및 가짜 인벤토리 복습(집에서)

by 잰쟁 2023. 7. 26.
728x90

1. 과제

 

1) 디자인패턴

: 소프트웨어 디자인 과정에서 자주 발생하는 문제들을 해결하기 위한 방법들을 일반화하여 정리한 것. 

: 문제 쉽고 빠르게 해결 가능. 이미 정리된 기본 패턴에 자신만의 기능을 추가하여 새로운 패턴 생성 가능.

 

2) 싱글톤패턴

: 런타임 동안 단 하나의 인스턴스만을 생성하는 패턴.

(해당 객체의 메모리를 정적으로 할당하여 하나의 객체에만 접근하는 방법)

: 프로그램이 동작하는 동안 최초로 생성된 객체 하나에만 접근하게 되므로 데이터를 접근하고 수정하기 쉬움.

 

3) JSON(JavaScript Object Notation)

: 사람이 읽을 수 있는 텍스트를 사용하여 데이터를 저장하고 전송하는 데이터 공유를 위한 개방형 표준 파일 형식.

(Javascript 객체 문법을 따르는 문자 기반의 데이터 포맷)

: 웹 어플리케이션에서 데이터를 전송할 때 일반적으로 사용.

(서버에서 클라이언트로 데이터를 전송하여 표현하려거나 반대의 경우).

 

4) 직렬화

:객체를 저장하거나, 메모리, 데이터베이스 또는 파일로 전송하기 위해 객체를 바이트(Byte) 형식으로 변환하는 것.

(데이터 파일 형태로 영구 저장 장치에 저장)

 

5)역직렬화

: 바이트 또는 텍스트 스트림을 객체로 변환하는 것.

 

6)딕셔너리는 왜 검색이 빠른가??

: 해시 함수를 이용해 key를 만들어서 저장

 

 

2. 가짜 인벤토리1 복습

 

주석 꼭 달아주면서 복습하기!!!!!!

return 주의하며 복습하기!!!

 

아이템 속성

 

몬스터 속성

app 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;



namespace Starcraft
{
    public class App
    {

        //생성자
        public App()
        {
            //아이템 인스턴스화
            //ItemData itemData = new ItemData(100, "장검", 0, 8);
            //Item item = new Item(itemData);
            
            //아이템데이터 Dictionary 초기화
            Dictionary<int, ItemData> itemDic = new Dictionary<int, ItemData>();
            itemDic.Add(100, new ItemData(100, "장검", 0, 8));
            itemDic.Add(101, new ItemData(101, "단검", 0, 5));
            itemDic.Add(102, new ItemData(102, "활", 0, 6));
            itemDic.Add(103, new ItemData(103, "도끼", 0, 10));
            itemDic.Add(104, new ItemData(104, "사슬 갑옷", 1, 0));
            itemDic.Add(105, new ItemData(105, "체력 물약", 2, 0));

            //사전에서 키로 값(장검) 가져오기
            ItemData itemData = itemDic[100];
            Item item = new Item(itemData);  //<= 진짜 아이템을 가져오기 때문에 'Item' 사용
            Console.WriteLine(item.itemData.id);  //100
            Console.WriteLine(item.itemData.name);  //장검

            //몬스터데이터 Dictionary로 초기화
            Dictionary<int, MonsterData> monsterDic = new Dictionary<int, MonsterData>();
            monsterDic.Add(1000, new MonsterData(1000, "고블린", 100, 50));
            monsterDic.Add(1001, new MonsterData(1001, "트롤", 101, 45));

            //고블린 생성
            MonsterData monsterData = monsterDic[1000];
            Monster monster = new Monster(monsterData,itemDic);
            Console.WriteLine(monster.monsterData.id);  //1000
            Console.WriteLine(monster.monsterData.name);  //고블린

            //고블린 죽고 아이템(장검) 생성
            Item dropItem = monster.Die();
            Console.WriteLine("{0}을 획득하였습니다.",dropItem.GetName());

            //고블린 공격받고 난 후 hp출력
            monster.HitDamage(5);
            Console.WriteLine("hp:{0}", monster.GetHp());
        }
    }
}

Item 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class Item
    {
        public ItemData itemData;

        //생성자
        public Item(ItemData itemData)
        {
            this.itemData = itemData;
        }

        //아이템 데이터의 이름 반환 메서드
        public string GetName()
        {
            return this.itemData.name; 
            //<== return 실행 위해서 void를 name변수의 타입(string)으로 변경
        }
    }
}

ItemData 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class ItemData
    {
        public int id;
        public string name;
        public int item_type;
        public int damage;

        //생성자
        public ItemData(int id,string name,int item_type,int damage)
        {
            this.id = id;
            this.name = name;
            this.item_type = item_type;
            this.damage = damage;   
        }
    }
}

Monster 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    internal class Monster
    {
        public MonsterData monsterData;
        public Dictionary<int, ItemData> itemDic;
        public int hp;

        //생성자
        public Monster(MonsterData monsterData,Dictionary<int,ItemData> itemDic)
        {
            this.monsterData = monsterData;
            this.itemDic = itemDic;
            this.hp = this.monsterData.hp;
        }

        //몬스터 죽고 아이템 생성 메서드
        public Item Die()
        {
            Console.WriteLine("{0}이 죽었습니다.", this.monsterData.name); //몬스터 사망

            ItemData itemData = this.itemDic[this.monsterData.item_id];
            return new Item(itemData); //<= 진짜 아이템 생성(ItemData = monsterData 인)
                                       //return 하기 위해서 void -> Item으로 변경
        }

        //몬스터 공격받는 메서드
        public void HitDamage(int damage)
        {
            this.hp -= damage;
            Console.WriteLine("{0}이 공격을 받았습니다.(-{1})", monsterData.name, damage);
        }

        //몬스터 hp 출력 메서드
        public int GetHp()
        {
            return this.hp; //<== return 실행하기 위해 void를 hp의 타입(int)로 변경
        }
    }

MonsterData 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    internal class MonsterData
    {
        public int id;
        public string name;
        public int item_id;
        public int hp;

        //생성자
        public MonsterData(int id, string name, int item_id, int hp)
        {
            this.id = id;
            this.name = name;
            this.item_id = item_id;
            this.hp = hp;
        }
    }
}

 

 

2. 가짜 인벤토리 2 복습

 

클래스 사용 전에 꼭 인스턴스화!!!!!!!!!!!!

상속

 

아이템 속성

App 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;



namespace Starcraft
{
    public class App
    {

        //생성자
        public App()
        {
            //아이템 인스턴스화
            //ItemData itemData = new ItemData(100, "장검", 0, 8);
            //Item item = new Item(itemData);
            
            //아이템데이터 Dictionary 초기화
            Dictionary<int, ItemData> itemDic = new Dictionary<int, ItemData>();
            itemDic.Add(100, new ItemData(100, "장검", 0, 8));
            itemDic.Add(101, new ItemData(101, "단검", 0, 5));
            itemDic.Add(102, new ItemData(102, "활", 0, 6));
            itemDic.Add(103, new ItemData(103, "도끼", 0, 10));
            itemDic.Add(104, new ItemData(104, "사슬 갑옷", 1, 0));
            itemDic.Add(105, new ItemData(105, "체력 물약", 2, 0));

            //인벤토리 생성 및 초기화 (용량:3)
            Inventory inven = new Inventory(3);
            //인벤토리에 아이템 추가(딕셔너리 id 사용)
            inven.AddItem(new Item(itemDic[100])); //장검 추가
            inven.AddItem(new Item(itemDic[101])); //단검 추가
            inven.AddItem(new Item(itemDic[102])); //활 추가
            
        }
    }
}

인벤토리 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    internal class Inventory
    {
        //아이템을 그룹/관리
        List<Item> items;  //변수 정의
        public int capacity;

        //생성자
        public Inventory(int capacity)
        {
            this.capacity = capacity;
            this.items = new List<Item>();
            Console.WriteLine("{0}칸짜리 가방이 생성되었습니다. [{1}/{2}]", this.capacity, this.items.Count, this.capacity);
        }

        //인벤토리 아이템 추가 메서드
        public void AddItem(Item item)
        {
            this.items.Add(item); //<== List의 Add 메서드를 이용
            Console.Write("{0}이(가) 추가 되었습니다. [{1}/{2}]", item.itemData.name, this.items.Count, this.capacity);
        }
    }
}

아이템 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class Item
    {
        public ItemData itemData;

        //생성자
        public Item(ItemData itemData)
        {
            this.itemData = itemData;
        }

        //아이템 데이터의 이름 반환 메서드
        public string GetName()
        {
            return this.itemData.name; 
            //<== return 실행 위해서 void를 name변수의 타입(string)으로 변경
        }
    }
}

아이템데이터 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    public class ItemData
    {
        public int id;
        public string name;
        public int item_type;
        public int damage;

        //생성자
        public ItemData(int id,string name,int item_type,int damage)
        {
            this.id = id;
            this.name = name;
            this.item_type = item_type;
            this.damage = damage;   
        }
    }
}