C#프로그래밍
주말과제 미션 만들기
노재두내
2023. 7. 30. 22:31
내가 하는 게임 쿠키런의 주간미션을 만들것이다.


파일을 잘 읽어옴


람다가 잘 이해되지 않아 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는 구현하지 못했다. 나중에 추가할 것