JSON, 데이터 관리 연습
2023. 7. 28.

 

 

JSON 다시만들기

-monster데이터, item데이터를 저장하는 딕셔너리 만들어 정보관리

 

1. 엑셀로 table 만든 후 json 변환

table

https://shancarter.github.io/mr-data-converter/

 

Mr. Data Converter

 

shancarter.github.io

 

 

Mr. Data Converter

 

shancarter.github.io

https://jsonviewer.stack.hu/

 

Online JSON Viewer

 

jsonviewer.stack.hu

 

 

 

⊙     txt말고json으로 저장

만든 후 폴더를 옮겨준다.

2. ItemData, MonsterData 클래스 생성

3. DataManager 를 만들어 구조화하기

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

namespace Starcraft
{
    internal class DataManager
    {//데이터 관리를 위한 DataManager 클래스
        public static readonly DataManager Instance = new DataManager();

        //아이템 데이터와 몬스터 데이터 저장을 위한 딕셔너리
        private Dictionary<int, ItemData> dicItemDatas = new Dictionary<int, ItemData>();
        private Dictionary<int, MonsterData> dicMonsterDatas = new Dictionary<int, MonsterData>();

        //생성자
        public DataManager() { }

        //메서드

        public void LoadItemDatas()//아이템 데이터를 로드하는 메서드
        {//파일 읽기
            string json = File.ReadAllText("./item_data.json");
            Console.WriteLine(json); 
            Console.WriteLine("json 길이: {0}",json.Length);

            if (json.Length == 0)//json에 아무것도 쓰여있지 않으면
            {
                Console.WriteLine("데이터에 문제가 있습니다.");
                return;
            }

        }

    }
}

먼저 json파일을 잘 읽어오는지 확인하였다.

json 내용, json 길이 출력

 

+) File.ReadAllText를 쓰려면 System.IO 추가해야한다.

 

+)using Newtonsoft.Json 추가후 LoadItemDatas 수정 및 LoadMonsterDatas 작성

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;

namespace Starcraft
{
    internal class DataManager
    {//데이터 관리를 위한 DataManager 클래스
        public static readonly DataManager Instance = new DataManager();

        //아이템 데이터와 몬스터 데이터 저장을 위한 딕셔너리
        private Dictionary<int, ItemData> dicItemDatas = new Dictionary<int, ItemData>();
        private Dictionary<int, MonsterData> dicMonsterDatas = new Dictionary<int, MonsterData>();

        //생성자
        public DataManager() { }

        //메서드

        public void LoadItemDatas()//아이템 데이터를 로드하는 메서드
        {//파일 읽기
            string json = File.ReadAllText("./item_data.json");
          //  Console.WriteLine(json); 
          //  Console.WriteLine("json 길이: {0}",json.Length);

            if (json.Length == 0)//json에 아무것도 쓰여있지 않으면
            {
                Console.WriteLine("데이터에 문제가 있습니다.");
                return;
            }

            //역직렬화하면 ItemData 객체들을 요소로 하는 배열 객체가 나온다.
            var arr = JsonConvert.DeserializeObject<ItemData[]>(json);
            //dictionary에 옮겨담기
            foreach(ItemData data in arr)
            {
                this.dicItemDatas.Add(data.item_id, data);
            }
            //dicItemDatas = arr.ToDictionary(x => x.item_id);
            Console.WriteLine("아이템 데이터 로드 완료:{0}", this.dicItemDatas.Count);//item 잘 옮겨담았는지 확인하기위한 출력
        }

        public void LoadMonsterDatas()//몬스터 데이터를 로드하는 메서드
        {//파일 읽기
            string json = File.ReadAllText("./monster_data.json");
            //  Console.WriteLine(json); 
            //  Console.WriteLine("json 길이: {0}",json.Length);

            if (json.Length == 0)//json에 아무것도 쓰여있지 않으면
            {
                Console.WriteLine("데이터에 문제가 있습니다.");
                return;
            }

            //역직렬화하면 MonsterData 객체들을 요소로 하는 배열 객체가 나온다.
            var arr2 = JsonConvert.DeserializeObject<MonsterData[]>(json);
            //dictionary에 옮겨담기
            foreach (MonsterData data2 in arr2)
            {
                this.dicMonsterDatas.Add(data2.monster_id, data2);
            }
            //dicItemDatas = arr.ToDictionary(x => x.item_id);
            Console.WriteLine("몬스터 데이터 로드 완료:{0}", this.dicMonsterDatas.Count);//item 잘 옮겨담았는지 확인하기위한 출력
        }

        public MonsterData GetMonsterData(int monster_id)
        {
            return this.dicMonsterDatas[monster_id];
        }
    }
}

4. Game 클래스 만들고 영웅,몬스터 생성하기

-Hero, Monster 클래스 추가

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

namespace Starcraft
{
    internal class Hero
    {      
        public Hero() {
            Console.WriteLine("영웅이 생성되었습니다.");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    internal class Monster
    {
        private MonsterData data;

        //생성자
        public Monster(MonsterData data) {
            this.data = data;
            Console.WriteLine("몬스터가 생성되었습니다.");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Starcraft
{
    internal class Game
    {
        private Hero hero;
        private Monster monster;
        //생성자
        public Game() { }

        //메서드

        public void Start()
        {
            Console.WriteLine("게임이 시작 되었습니다.");
            this.hero = this.CreatHero();
            this.monster = this.CreateMonster(1000);

        }

        public Hero CreatHero()
        {
            return new Hero();
        }
        public Monster CreateMonster(int monster_id)
        {//몬스터 생성 메서드: 몬스터 정보도 가져와야한다.
            MonsterData data = DataManager.Instance.GetMonsterData(monster_id);//데이터 매니저에서 가져옴
            return new Monster(data);
        }
    }
}

 

+) 클래스 만들 떄 codeDom, 엑셀 클래스 만들기

 

5.몬스터에 maxHp 데이터 추가해서 코드 수정

 

 

 

 

myoskin