C#프로그래밍

주말과제 학교만들기 저장 불러오기 보상

다모아 2023. 7. 31. 14:38

App

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

namespace Mission
{
    public class App
    {
        //생성자
        public App()
        {
            DataManager.instance.LoadItemDatas();
            DataManager.instance.LoadMissionDatas();

            //신규유저 , 기존유저 판별
            //신규유저 : GameInfo객체를 새로 생성
            //기존유저 : game_info.json 읽고 역직렬화 => GameInfo객체
            //InfoManager에 GameInfo객체 넣기
            if (InfoManager.instance.IsNewbie())
            {
                Console.WriteLine("신규유저");
                GameInfo gameInfo = new GameInfo();
                gameInfo.Init();
                InfoManager.instance.Init(gameInfo);
                //기본 미션정보를 넣고 game_info.json으로 저장
                InfoManager.instance.SaveGameInfo();
            }
            else
            {
                Console.WriteLine("기존유저");
                InfoManager.instance.LoadGameInfo();
            }

            Game game = new Game();
            game.Start();
        }
        private bool FindItemName(string name)
        {
            return name == "단검"; ;
        }
    }
}

 

Button

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

namespace Mission
{
    public class Button
    {
        public string name;
        public Action onClick;

        //생성자
        public Button(string name)
        {
            this.name = name;
        }

        //대리자 호출
        public void Click()
        {
            Console.WriteLine("{0}이 클릭되었습니다.", this.name);
            //대리자 호출
            this.onClick();
        }

        
    }
}

 

DataManager

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

namespace Mission
{
    public class DataManager
    {
        //싱글톤 : 인스턴스가 1개다, 언제어디서든 접근이 가능
        public static readonly DataManager instance = new DataManager();
        Dictionary<int, MissionData> dicMissionDatas = new Dictionary<int, MissionData>();
        Dictionary<int, ItemData> dicItemDatas;

        private const string MISSION_DATA_PATH = "./mission_data.json";
        //생성자
        private DataManager()
        {

        }

        //아이템 로드
        public void LoadItemDatas()
        {
            //파일 읽기
            string json = File.ReadAllText("./reward_item_data.json");
            //역직렬화
            ItemData[] arr = JsonConvert.DeserializeObject<ItemData[]>(json);
            //사전에 넣기
            this.dicItemDatas = arr.ToDictionary(x => x.id);
            Console.WriteLine("아이템 데이터 로드 완료");

        }
        //데이터 로드
        public void LoadMissionDatas()
        {
            //파일 읽기
            string json = File.ReadAllText("./mission_data.json");
            //역직렬화
            MissionData[] arr = JsonConvert.DeserializeObject<MissionData[]>(json);
            //사전에 넣기
            foreach (var data in arr)
            {
                this.dicMissionDatas.Add(data.id, data);
            }
            Console.WriteLine("미션 데이터 로드 완료");
        }


        public List<MissionData> GetMissionDatas()
        {
            return this.dicMissionDatas.Values.ToList();
        }

        public ItemData GetItemData(int id)
        {
            return this.dicItemDatas[id];
        }

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

 

Game

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

namespace Mission
{
    public class Game
    {
        private Button btnMission;
        //생성자
        public Game()
        {
            Console.WriteLine("Game 생성자 호출");
            this.btnMission = new Button("미션버튼");
            this.btnMission.onClick = () =>
            {
                Console.WriteLine("미션창을 보여준다");
                this.PrintMission();
            };
        }

        public void Start()
        {
            Console.WriteLine("게임이 시작 되었습니다.");
            this.btnMission.Click();

            this.DoMission(1000, 1);
            this.btnMission.Click();

            this.Claim(1000);
        }
        private void PrintMission()
        {
            List<MissionData> missionDatas = DataManager.instance.GetMissionDatas();
            foreach(MissionData data in missionDatas)
            {
                ItemData itemData = DataManager.instance.GetItemData(data.item_id);
                string strReward = string.Format("{0}x{1}",itemData.name, data.item_amount);
                string name = string.Format(data.name, data.goal);

                MissionInfo missionInfo = InfoManager.instance.GetMissionInfo(data.id);

                string strProgress = string.Format("{0}/{1}", missionInfo.count, data.goal);
                Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", data.id, name, strProgress, strReward, (GameEnums.eMissionState)missionInfo.state); 
            }
        }

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

            GameInfo gameInfo = InfoManager.instance.GetGameInfo();
            MissionInfo missionInfo = gameInfo.missionInfos.Find(x => x.id == id);

            GameEnums.eMissionState state = (GameEnums.eMissionState)missionInfo.state;

            if(state == GameEnums.eMissionState.Done)  {
                Console.WriteLine("이미 완료된 미션입니다.");
                return;
            }

            if(state == GameEnums.eMissionState.Doing && count >= missionData.goal)
            {
                count = missionData.goal;
                //Doing -> Done
                missionInfo.state = (int)GameEnums.eMissionState.Done;
            }
            missionInfo.count = count;
            InfoManager.instance.SaveGameInfo();
        }
        public void Claim(int id)
        {
            MissionInfo info = InfoManager.instance.GetMissionInfo(id);
            GameEnums.eMissionState state = (GameEnums.eMissionState)info.state;
            if(state == GameEnums.eMissionState.Done)
            {
                MissionData missionData = DataManager.instance.GetMissionData(info.id);
                ItemData itemData = DataManager.instance.GetItemData(missionData.item_id);
                Console.WriteLine("{0}:{1}를 지급 받았습니다.", itemData.id, itemData.name);
                info.state = (int)GameEnums.eMissionState.Complete;
                InfoManager.instance.SaveGameInfo();
            }
        }

    }
}

 

GameEnums

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

namespace Mission
{
    public class GameEnums
    {
        //생성자
        public enum eMissionState
        {
            Doing, Done, Complete
        }
    }
}

 

GameInfo

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

namespace Mission
{
    public class GameInfo
    {
        public List<MissionInfo> missionInfos;
        //생성자
        public GameInfo()
        {

        }

        //신규유저일 경우만 호출할 것
        public void Init()
        {
            //List 인스턴스 생성
            this.missionInfos = new List<MissionInfo>();
            //선택사항
            //기본 미션 정보를 저장
            foreach(MissionData data in DataManager.instance.GetMissionDatas()) {
                this.missionInfos.Add(new MissionInfo(data.id, 0));
            }

        }
    }
}

 

InfoManager

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft;
namespace Mission
{
    //저장 객체들을 관리하는 싱글톤 클래스
    public class InfoManager
    {
        public static readonly InfoManager instance = new InfoManager();
        private GameInfo gameInfo;
        private const string GAME_INFO_FILE_PATH = "./game_info.json";
        //생성자
        private InfoManager()
        {

        }

        public void Init(GameInfo gameInfo)
        {
            this.gameInfo = gameInfo;
        }
        
        //신규유저인가? : game_info.json파일이 없다.
        public bool IsNewbie()
        {
            return !File.Exists(GAME_INFO_FILE_PATH);
        }

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

        public void LoadGameInfo()
        {
            var json = File.ReadAllText(GAME_INFO_FILE_PATH);
            //역직렬화
            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;
        }
    }
}

 

ItemData

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

namespace Mission
{
    public class ItemData
    {
        public int id;
        public string name;
    }
}

 

MissionData

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

namespace Mission
{
    public class MissionData
    {
        //id name    goal item_id item_amount
        //int string int int int

        public int id;
        public string name;
        public int goal;
        public int item_id;
        public int item_amount;

    }
}

 

MissionInfo

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 int state; //0: doing, 1: done, 2: complete

        //생성자
        public MissionInfo(int id, int count, int state = 0)
        {
            this.id = id;
            this.count = count;
            this.state = state;
        }
    }
}

 

'C#프로그래밍' 카테고리의 다른 글

결합연산자  (0) 2024.06.25
HelloWorld  (0) 2024.06.25
주말과제 미션만들기 [학교]  (0) 2023.07.31
FindItemName, Find, List  (0) 2023.07.31
주말과제  (0) 2023.07.28