C#프로그래밍

주말과제 미션 만들기

노재두내 2023. 7. 30. 22:31

내가 하는 게임 쿠키런의  주간미션을 만들것이다.

mission_data.xlsx
reward_item_data.xlsx

파일을 잘 읽어옴

람다가 잘 이해되지 않아 foreach로 순회를 돌려고 했는데 new 해서 딕셔너리를 생성하지 않고 실행했다가 System.NullReferenceException: 개체 참조가 개체의 인스턴스로 설정되지 않았습니다 오류가 떴다 . 제대로 생성 후 다시 실행하니 제대로 들어갔다.

이제 준비단계까지는 완벽하게 이해되고 익숙해졌다 !

 

일단 Info로 관리하는건 이해가 잘 안돼서 기존 방법으로 하려고 한다.

 

id가 1000번인 미션 잘 불러와지는지 확인 

 

 

this.mission.onComplete = () =>
            {
                //보상 아이템 생성
                int rewardItemId = this.mission.GetRewardItemId();
                RewardItem rewardItem = this.CreateItem(rewardItemId);
                MissionData rewardAmount= this. 
                Console.WriteLine("아이템이 지급{0}: {1}개",rewardItem.Name,);
                
            };

이 부분에서 미션 완료시 지급되는 아이템의 수량을 출력하고 싶은데 MissionData에 있는 reward_item_amount를 어떻게 불러와야할지 모르겠다. ---> 생각해보니 GetRewardItemId 도 mission데이터에서 가져오는것이므로 참고하여서 

public int GetRewardItemAmount()
        {
            return this.data.reward_item_amount;
        }

미션클래스에 아이템 수량을 가져오는 메서드를 만들고

this.mission.onComplete = () =>
            {
                //보상 아이템 생성
                int rewardItemId = this.mission.GetRewardItemId();
                RewardItem rewardItem = this.CreateItem(rewardItemId);

                //보상 아이템 개수 
                int rewardItemAmount = this.mission.GetRewardItemAmount();
                
                Console.WriteLine("아이템이 지급{0}: {1}개",rewardItem.Name,rewardItemAmount);
                
            };

위와 같이 불러왔다.

실행화면 모습

 

-------------------------------------------------------전체 코드 -------------------------------------------------------------------------

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

namespace Assignment
{
    public class App
    {
        public Game game;
        //생성자
        public App()
        {
            DataManager.instance.LoadMissionDatas();
            DataManager.instance.LoadRewardItemDatas();

            //------------------서비스시작-------------------
            this.game = new Game();
            this.game.Start();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;

namespace Assignment
{
    public class DataManager
    {
        public static readonly DataManager instance = new DataManager();
        private Dictionary<int, MissionData> dicMissionDatas = new Dictionary<int, MissionData>();
        private Dictionary<int, RewardItemData> dicRewardItemDatas;
        private DataManager()
        {

        }
        public void LoadMissionDatas() {
            string json = File.ReadAllText("./mission_data.json");
            //역직렬화 문자열->객체
            MissionData[] missionDatas = JsonConvert.DeserializeObject<MissionData[]>(json);
            //딕셔너리에 추가
            foreach(var data in missionDatas)
            {
                dicMissionDatas.Add(data.id, data);
            }
            Console.WriteLine("미션 데이터 로드 완료 :{0}",dicMissionDatas.Count);
        }

        public void LoadRewardItemDatas()
        {
            string json = File.ReadAllText("./reward_item_data.json");
            RewardItemData[] rewardDatas = JsonConvert.DeserializeObject<RewardItemData[]>(json);
            dicRewardItemDatas = rewardDatas.ToDictionary(x => x.id);
            Console.WriteLine("보상아이템 데이터 로드 완료:{0}", dicRewardItemDatas.Count);
            //Console.WriteLine(json);
        }

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

        public RewardItemData GetItemData(int id)
        {
            return this.dicRewardItemDatas[id];
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Assignment
{
    public class Game
    {
        private User user;
        private Mission mission;
        public Game()
        {

        }
        public void Start()
        {
            Console.WriteLine("게임이 실행되었습니다.");
            //유저 생성
            this.user = this.CreateUser("염세영");
            //id가 1000번인 미션생성
            this.mission = this.CreateMission(1000);
            //Console.WriteLine(mission);
            this.mission.onComplete = () =>
            {
                //보상 아이템 생성
                int rewardItemId = this.mission.GetRewardItemId();
                RewardItem rewardItem = this.CreateItem(rewardItemId);

                //보상 아이템 개수 
                int rewardItemAmount = this.mission.GetRewardItemAmount();
                
                Console.WriteLine("아이템이 지급{0}: {1}개",rewardItem.Name,rewardItemAmount);
                
            };
            this.mission.Complete();
        }
        
        public User CreateUser(string name)
        {
            return new User(name);
        }
        public Mission CreateMission(int id)
        {
            MissionData data = DataManager.instance.GetMissionData(id);
            return new Mission(data);
        }
        public RewardItem CreateItem(int id)
        {
            RewardItemData data = DataManager.instance.GetItemData(id);
            return new RewardItem(data);
        }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Assignment
{
    public class Mission
    {
        public MissionData data;
        public Action onComplete;
        //생성자
        public Mission(MissionData data)
        {
            this.data = data;
        }
        public int GetRewardItemId()
        {
            return this.data.reward_item_id;
        }
        public int GetRewardItemAmount()
        {
            return this.data.reward_item_amount;
        }
        public void Complete()
        {
            Console.WriteLine("미션{0}을 완료했습니다.", this.data.name);
            this.onComplete();
        }
    }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Assignment
{
    public 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 Assignment
{
    public class RewardItem
    {
        private RewardItemData data;
        public string Name
        {
            get
            {
                return this.data.name;
            }
        }
        public RewardItem(RewardItemData data)
        {
            this.data = data;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Assignment
{
    public class RewardItemData
    {
        public int id;
        public string name;
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Assignment
{
    public class User
    {
        private State state;
        public string name;
        public User(string name)
        {
            this.name = name;
        }
        
    }
}

 

시간 부족으로 아직 미션 progress는 구현하지 못했다.  나중에 추가할 것