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객체 넣기
GameInfo gameInfo = null;
if (InfoManager.instance.IsNewbie())
{
Console.WriteLine("신규유저");
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();
}
}
}
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();
}
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}", data.id, name, strProgress, strReward);
}
}
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);
missionInfo.count = count;
InfoManager.instance.SaveGameInfo();
}
}
}
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 MissionInfo(int id, int count)
{
this.id = id;
this.count = count;
}
}
}
완료가 되면 상태가 표시되어야한다.
[진행상태, 완료를 했지만 보상을 받지 않은 상태, 완료했고 보상도 받은 상태]
상태 저장 [ 0 , 1 , 2 ]
저장을 할 때는 enum으로 한다
App
------------------------
게임시작 전 아이템 데이터, 보상 데이터 가져오기
InfoManager에 GameInfo객체 넣기
신규유저인지 기존유저인지 확인 ..> 변하는데이터 InfoManager로 IsNewbie
Init[초기화] -> 신규유저일 경우
InfoManager에 SaveGameInfo
'C#프로그래밍' 카테고리의 다른 글
HelloWorld (0) | 2024.06.25 |
---|---|
주말과제 학교만들기 저장 불러오기 보상 (0) | 2023.07.31 |
FindItemName, Find, List (0) | 2023.07.31 |
주말과제 (0) | 2023.07.28 |
장비 착용, 몬스터 공격, 인벤토리, 아이템 지급 (0) | 2023.07.28 |