미션-json연습예제 복습
2023. 7. 31.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;
namespace Mission
{
    public class App
    {
       

        public App() {
            
            //데이터 로드
            DataManager.Instance.LoadMissionDatas();
            DataManager.Instance.LoadRewardItemDatas();
            GameInfo gameInfo = null;
            if (InfoManager.Instance.IsNewbie())
            {
                Console.WriteLine("신규유저");
                gameInfo = new GameInfo();
                gameInfo.Init();//미션 info

                InfoManager.Instance.Init(gameInfo);//게임 info
                //기본 미션정보를 넣고 game_info.json으로 저장
                InfoManager.Instance.SaveGameInfo();

            }
            else
            {
                Console.WriteLine("기존유저");
                InfoManager.Instance.LoadGameInfo();
            }


            //출력
            Game game = new Game();
            game.Start();
        }

        private bool FindItemName(string itemName)
        {
            return itemName =="단검";

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

namespace Mission
{
    internal class Button
    {
        public Action onClick;//Action
        public string button_name;
        //생성자
        public Button(string button_name) { 

            this.button_name = button_name;
        }


        //메서드
        public void Click()
        {
            this.onClick();//대리자 호출
        }
    }
}
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Mission
{
    //싱글톤: 인스턴스가 1개다, 언제 어디서든 접근이 가능
    internal class DataManager
    {
        public static readonly DataManager Instance = new DataManager();
        private Dictionary<int,MissionData> dicMissionDatas = new Dictionary<int, MissionData> ();
        //MissionData는 인스턴스가 필요하므로 생성
        private Dictionary<int, RewardItemData> dicRewardItemDatas;//인스턴스 생성안함
    //생성자
    private DataManager() 
        { 
        
        }
    public void LoadMissionDatas()
        {
            //파일읽기
            string json = File.ReadAllText("./mission_data.json");
            //파일이 잘 나오는지 읽어봄
          //  Console.WriteLine(json);

            //역직렬화
            MissionData[] missionDatas = JsonConvert.DeserializeObject<MissionData[]>(json);
            //테스트
            //사전에 넣기

            foreach (MissionData data in missionDatas)//foreach 돌릴때는 인스턴스가 반드시필요함
            {
                this.dicMissionDatas.Add(data.id, data);
                //혼자할 때 이부분에서 오류남(이미 추가된 키라고 오류났었음)
               // Console.WriteLine("{0},{1}", mission.id, mission.name);
            }
            //역직렬화


        }
    public void LoadRewardItemDatas()
        {
            //파일 읽기
            string json = File.ReadAllText("./reward_item_data.json");
            //역직렬화 
            RewardItemData[] arr = JsonConvert.DeserializeObject<RewardItemData[]>(json);

            //arr에 있는 요소들의 id를 키값으로 새로운 사전 객체를 생성 
            this.dicRewardItemDatas = arr.ToDictionary(x => x.id);
            Console.WriteLine("아이템 데이터 로드 완료");
        }
        public RewardItemData GetRewardItemData(int id)
        {
           // Console.WriteLine(id);
            return this.dicRewardItemDatas[id];
        }

        //public void GetMissionDatas()
        //    {
        //        List<MissionData> missionDatas = this.dicMissionDatas.Values.ToList();
        //        //안에있는 딕셔너리가 새로운 리스트로 빠져나옴
        //        //:Value들만 뽑아야함-딕셔너리는 키-값 쌍이므로
        //        foreach( MissionData data in missionDatas)
        //        {
        //            // Console.WriteLine("{0},{1}", data.name,data.goal);
        //            string name = string.Format(data.name, data.goal);
        //            Console.WriteLine(name);
        //        }


        //    }

        public List<MissionData> GetMissionDatas()
        {
            
            //새로운 List를 생성해서 반환 
            return this.dicMissionDatas.Values.ToList();
        }

        public RewardItemData GetItemData(int id)
        {
            return this.dicRewardItemDatas[id];
        }

        public MissionData GetMissionData(int id)
        {
            return this.dicMissionDatas[id];
        }
      

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

namespace Mission
{
    internal class Game
    {
        private Button btnMission;
        
        //생성자
        public Game() {

            this.btnMission = new Button("미션 버튼");//버튼 생성
            this.btnMission.onClick = () =>
            {//onClick 변수에 메서드가 들어간다: onClick은 대리자다
                Console.WriteLine("미션창을 보여준다.");
                this.PrintMission();

            };
        }

        //메서드
        public void Start()
        {
            Console.WriteLine("게임이 시작되었습니다.");
            //미션버튼 클릭
            this.btnMission.Click();
            this.DoMission(1000, 1);
        }

        public void PrintMission()
        {
            List<MissionData> missionDatas = DataManager.Instance.GetMissionDatas();
            foreach (MissionData data in missionDatas)
            {
                RewardItemData rewardItemData = DataManager.Instance.GetRewardItemData(data.reward_item_id);       
                string strReward = string.Format(" {0}x{1}", rewardItemData.name,data.reward_item_amount);
                string name = string.Format(data.name, data.goal);
                string strProgress = string.Format("{0}/{1}", 0, data.goal);
                // Console.WriteLine(name + strReward);
                Console.WriteLine("{0}\t{1}\t{2}", name, strProgress, strReward);
            }
        }

        private void DoMission(int id, int count)
        {
            MissionData data = DataManager.Instance.GetMissionData(id);
            string name = string.Format(data.name, data.goal);
            Console.WriteLine("{0}를 {1}개 했습니다.", name, count);

            GameInfo gameInfo = InfoManager.Instance.GetGameInfo();
            MissionInfo missionInfo = gameInfo.missionInfos.Find(x => x.id == id);
            missionInfo.count = count;
            InfoManager.Instance.SaveGameInfo();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Mission
{
    internal class GameInfo
    {
        public List<MissionInfo> missionInfos; 

        public GameInfo() { }

        //메서드
        public void Init()
        {
            this.missionInfos = new List<MissionInfo>();//리스트 객체 생성

            //선택사항 
            //기본 미션 정보를 저장 
            foreach (MissionData data in DataManager.Instance.GetMissionDatas())
            {
                this.missionInfos.Add(new MissionInfo(data.id, 0));
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;

namespace Mission
{
    internal class InfoManager
    {
        //저장 객체들을 관리 하는 싱글톤 클래스
        public static readonly InfoManager Instance = new InfoManager();
        private GameInfo gameInfo;

        //생성자
        private InfoManager() { }


        //메서드
        public void Init(GameInfo gameInfo)
        {
            this.gameInfo = new GameInfo();
        }

        public bool IsNewbie()
        {
            return !File.Exists("./mission_info.json");
        }

        public void SaveGameInfo()
        {
            //직렬화
            string json = JsonConvert.SerializeObject(this.gameInfo);
            Console.WriteLine(json);
            //파일로 저장
            File.WriteAllText("./mission_info.json",json);
            Console.WriteLine("저장완료");
        }

        public void LoadGameInfo() {

            var json = File.ReadAllText("./mission_info.json");
            this.gameInfo = JsonConvert.DeserializeObject<GameInfo>(json);//역직렬화
            Console.WriteLine("game_info.json 로드 완료");
        
        }

        public MissionInfo GetMissionInfo(int id)
        {
            return this.gameInfo.missionInfos.Find(x => x.id == id);
        }

        public GameInfo GetGameInfo()
        {
            return this.gameInfo;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Mission
{
    internal class MissionData
    {//바인딩 클래스
        public int id;
        public string name;
        public int goal;
        public int reward_item_id;
        public int reward_item_amount;
     //생성자가 필요없다.

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

namespace Mission
{
    //미션 정보를 저장하는 저장 객체 
    public class MissionInfo
    {
        public int id;
        public int count;   //완료한 미션수 
        //생성자 
        public MissionInfo(int id, int count)
        {
            this.id = id;
            this.count = count;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Mission
{
    internal class RewardItemData
    {
        public int id;
        public string name;
    }
}

Mission.zip
4.98MB

myoskin