신입 개발자 공부 과정

1/11 - (테이블만들기, Json변환, 파일읽고쓰기, 직렬화, 역직렬화, 사전넣기, 싱글톤만들기) 본문

C#/수업 내용

1/11 - (테이블만들기, Json변환, 파일읽고쓰기, 직렬화, 역직렬화, 사전넣기, 싱글톤만들기)

Lewisjkim 2022. 1. 12. 02:27
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Diablo
{
    class Program
    {
        static void Main(string[] args)
        {
            new App();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Diablo
{
    class App
    {
        public App()
        {
            DataManager.GetInstance().LoadDatas();
            Console.WriteLine("**********");
            Console.WriteLine("**Diablo**");
            Console.WriteLine("***start!**");
            Console.WriteLine("**********");
           
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Diablo
{
    class WeaponData
    {
        public int id;
        public string name;
        public int grade;
        public float damage;
        public int sellPrice;
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Diablo
{
    class CharacterData
    {
        public int id;
        public string name;
        public float maxLife;
        public float maxMana;
        public float maxStamina;
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Diablo
{
    class MonsterData
    {
        public int id;
        public string name;
        public int grade;
        public float damage;
        public float maxHp;
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;

namespace Diablo
{
    
    class DataManager
    {
        //dictionary
        private Dictionary<int, CharacterData> dicCharacterDatas = new Dictionary<int, CharacterData>();
        private Dictionary<int, WeaponData> dicWeaponDatas = new Dictionary<int, WeaponData>();
        private Dictionary<int, MonsterData> dicMonsterDatas = new Dictionary<int, MonsterData>();
        //singletone
        private static DataManager instance;
        private const string DATA_PATH = "./Datas";
        private  DataManager()
        {

        }

        public static DataManager GetInstance()
        {
            if (DataManager.instance == null) DataManager.instance = new DataManager();
            return DataManager.instance;
        }
        //-----------------------------
        public void LoadDatas()
        {
            //캐릭터
            string path = string.Format("{0}/{1}", DATA_PATH, "character_data.json");
            string json = File.ReadAllText(path);
            CharacterData[] characterDatas = JsonConvert.DeserializeObject<CharacterData[]>(json);
            foreach(var data in characterDatas)
            {
                this.dicCharacterDatas.Add(data.id, data);
            }
            //무기
            path = string.Format("{0}/{1}", DATA_PATH, "weapon_data.json");
            json = File.ReadAllText(path);
            WeaponData[] weaponDatas = JsonConvert.DeserializeObject<WeaponData[]>(json);
            foreach (var data in weaponDatas)
            {
                this.dicWeaponDatas.Add(data.id, data);
            }
            //몬스터
            path = string.Format("{0}/{1}", DATA_PATH, "monster_data.json");
            json = File.ReadAllText(path);
            MonsterData[] monsterDatas = JsonConvert.DeserializeObject<MonsterData[]>(json);
            foreach (var data in monsterDatas)
            {
                this.dicMonsterDatas.Add(data.id, data);
            }
            Console.WriteLine("데이터를 불러오는 중");
            Console.WriteLine("모든 데이터를 로드 했습니다.");
            Console.WriteLine("캐릭터 데이터{0}개", this.dicCharacterDatas.Count);
            Console.WriteLine("무기 데이터{0}개", this.dicWeaponDatas.Count);
            Console.WriteLine("몬스터 데이터{0}개", this.dicMonsterDatas.Count);
        }
    }
}

-------------------

캐릭터 선택, 무기 지급, 대사

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


namespace Diablo
{
    public enum eCharacterType 
    { 
        None,
        BARBARIAN,
        AMAZON,
        SOSURISE,
        PALADINE
    }
    class App
    {
        public App() 
        {
            
            DataManager.GetInstance().LoadDatas();
            Console.WriteLine("**********");
            Console.WriteLine("**Diablo**");
            Console.WriteLine("***start!**");
            Console.WriteLine("**********");
            
            //용사여 처음오셨군요
            CharacterData[] characterDatas = DataManager.GetInstance().GetCharacterDatas();
            for (int i = 0; i < characterDatas.Length; i++)
            {
                var data = characterDatas[i];
                int idx = i + 1;
                Console.WriteLine("{0}. {1}", idx, data.name);//1.바바리안~4.팔라딘
            }
            //1.바바리안
            //2.아마존
            //3.소서리스
            //4.팔라딘
            //캐릭터 선택해주세요(숫자1~4):1
            //Console.WriteLine("1.바바리안\n2.아마존\n3.소서리스\n4.팔라딘");
            Console.Write("캐릭터 선택해주세요(숫자1~4):");
            string input = Console.ReadLine();
            int num = int.Parse(input);
            CharacterData selectedCharacterData = characterDatas[num-1];//캐릭터 선택 후 맨트
            Console.WriteLine("NPC:환영합니다 {0} 용사님.", selectedCharacterData.name);
            Console.WriteLine("NPC:무기를 드리겠습니다.");
            eCharacterType characterType = (eCharacterType)num;//캐릭터 선택하면 무기 출력
            
            //무기 가져오기
            
            WeaponData weaponData = DataManager.GetInstance().GetWeapoponData(selectedCharacterData.id);//선택한 캐릭터 ID를 넣으면 무기 가져오기
            Weapon defaultWeapon = new Weapon(weaponData.id);
            Console.WriteLine("{0}을 획득했습니다", weaponData.name);
            
            //대사
            if(characterType == eCharacterType.PALADINE)
            {
                Console.WriteLine("저 팔라딘인데...");
                Console.WriteLine(".");
                Console.WriteLine(".");
                Console.WriteLine(".");
                Console.WriteLine("NPC:대장장이가 휴가라서...");
            }
            


            //바바리안님 환영합니다
            //장검을 획득했습니다
            //장검을 착용했습니다
            //당신은 필드로 나갑니다
            //당신은 고블린무리를 발견 했습니다

            //명령어를 입력해주세요(<대상> 쳐, 도망, 소지품, 저장) : 고블린 쳐
            //당신은 고블린을 공격했습니다
            //고블린은 당신을 공격했습니다
            //고블린이 죽었습니다 
            //고블린이 골드10을 드랍했습니다


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

namespace Diablo
{
    class CharacterData
    {
        public int id;
        public string name;
        public float maxLife;
        public float maxMana;
        public float maxStamina;
        public int defaultWeaponId;
      
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;


namespace Diablo
{
    
    class DataManager
    {
        //dictionary
        private Dictionary<int, CharacterData> dicCharacterDatas = new Dictionary<int, CharacterData>();
        private Dictionary<int, WeaponData> dicWeaponDatas = new Dictionary<int, WeaponData>();
        private Dictionary<int, MonsterData> dicMonsterDatas = new Dictionary<int, MonsterData>();
        //singletone
        private static DataManager instance;
        private const string DATA_PATH = "./Datas";
        private  DataManager()
        {

        }

        public static DataManager GetInstance()
        {
            if (DataManager.instance == null) DataManager.instance = new DataManager();
            return DataManager.instance;
        }
        //-----------------------------
        public void LoadDatas()
        {
            //캐릭터
            string path = string.Format("{0}/{1}", DATA_PATH, "character_data.json");
            string json = File.ReadAllText(path);
            CharacterData[] characterDatas = JsonConvert.DeserializeObject<CharacterData[]>(json);
            foreach(var data in characterDatas)
            {
                this.dicCharacterDatas.Add(data.id, data);
            }
            //무기
            path = string.Format("{0}/{1}", DATA_PATH, "weapon_data.json");
            json = File.ReadAllText(path);
            WeaponData[] weaponDatas = JsonConvert.DeserializeObject<WeaponData[]>(json);
            foreach (var data in weaponDatas)
            {
                this.dicWeaponDatas.Add(data.id, data);
            }
            //몬스터
            path = string.Format("{0}/{1}", DATA_PATH, "monster_data.json");
            json = File.ReadAllText(path);
            MonsterData[] monsterDatas = JsonConvert.DeserializeObject<MonsterData[]>(json);
            foreach (var data in monsterDatas)
            {
                this.dicMonsterDatas.Add(data.id, data);
            }
            Console.WriteLine("데이터를 불러오는 중");
            Console.WriteLine("모든 데이터를 로드 했습니다.");
            Console.WriteLine("캐릭터 데이터{0}개", this.dicCharacterDatas.Count);
            Console.WriteLine("무기 데이터{0}개", this.dicWeaponDatas.Count);
            Console.WriteLine("몬스터 데이터{0}개", this.dicMonsterDatas.Count);
        }
        public CharacterData[] GetCharacterDatas()
        {
            return this.dicCharacterDatas.Values.ToArray();//Values 넣어줘야
        }

        public WeaponData GetWeapoponData(int characterId)//무기ID를 받아서 캐릭터의 무기를 지급
        {
            var characterData = this.dicCharacterDatas[characterId];//딕셔네리값의 캐릭터 아이디로 캐릭터 정보를 불러와서
            var weaponData = this.dicWeaponDatas[characterData.defaultWeaponId];//캐릭터 정보 안의 무기 정보를 구한다
            return weaponData;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Diablo
{
    class Weapon
    {
        private int id;
        public Weapon(int id)
        {
            this.id = id;
        }
    }
}

-----------------

텍스트 컬러입히기

// Test colors with blue background, white foreground.
                Console.BackgroundColor = ConsoleColor.Blue;
                Console.ForegroundColor = ConsoleColor.White;
                Console.Write(weaponData.name);
                Console.ResetColor();