미션-json연습예제 복습
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;
}
}
'C# 기초' 카테고리의 다른 글
C# LINQ (0) | 2023.07.31 |
---|---|
C# 게임 저장, 로드 (0) | 2023.07.28 |
JSON,데이터 관리 연습 3- 몬스터 잡으면 아이템 드롭, 가방에 넣기 (0) | 2023.07.28 |
JSON, 데이터 관리연습2-아이템 가방에 넣고 착용하기 (0) | 2023.07.28 |
JSON, 데이터 관리 연습 (0) | 2023.07.28 |