C# 게임 저장, 로드
1. 기존 유저일 때, 아이템 추가해서 저장하기까지 하기(처음에 info가 비어있으므로 한번 저장해주어야한다.)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;
using System.Data;
namespace LoadAndSaveGame
{
internal class App
{
Hero hero;
GameInfo gameInfo = null;
bool isNewbie = true;
public App()
{
if (File.Exists("./game_info.json"))
{ //있다
//기존유저
isNewbie = false;
Console.WriteLine("기존유저");
//game_info.json 파일을 읽어와 역직렬화 -> GameInfo 객체 생성
string json = File.ReadAllText("./game_info.json");
Console.WriteLine(json);
gameInfo = JsonConvert.DeserializeObject<GameInfo>(json);
Console.WriteLine("gameInfo.itemInfos.Count : {0}", gameInfo.itemInfos.Count);
//hero.SetItem(item0);
// List<Item> items = hero.GetItems();
}
else
{ //없다
//신규유저
isNewbie = true;
//새로운 GameInfo 객체를 생성해서 기본값으로 설정한 뒤 저장
Console.WriteLine("신규유저");
gameInfo = new GameInfo();
gameInfo.Init();//기본값으로 설정
//직렬화: 객체-> 문자열
string json = JsonConvert.SerializeObject(gameInfo);
Console.WriteLine(json);
File.WriteAllText("./game_info.json", json);
Console.WriteLine("파일 저장 완료");
}
InfoManager.Instance.Init(gameInfo);
//---------------게임시작-----------------
this.hero = new Hero();
Console.WriteLine(isNewbie);
//아이템 획득
if(isNewbie == false)
{
//기존 유저
var info = new ItemInfo(100, 12);
Console.WriteLine(info);
var item = new Item(info);
hero.AddItem(item);//아이템 추가
List<Item> items = hero.GetItems();
this.SaveItems(items);
}
}
public Item GetItem(int id)
{
// ItemData data = DataManager.instance.GetItemData(id);
return new Item(new ItemInfo(id, 12));
}
public void SaveItems(List<Item> items)
{
List<ItemInfo> iteminfos = new List<ItemInfo>();
foreach (Item item in items)
{
iteminfos.Add(item.info);
Console.WriteLine("{0},{1}",item.info.id,item.info.damage);
}
InfoManager.Instance.gameInfo.itemInfos = iteminfos;
//직렬화
string json = JsonConvert.SerializeObject(InfoManager.Instance.gameInfo);
//파일 저장
File.WriteAllText("./game_info.json", json);
Console.WriteLine("파일 저장 완료");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LoadAndSaveGame
{
internal class GameInfo
{//게임 정보를 저장하는 객체
//인벤토리의 아이템 정보들 ItemInfo[]
public List<ItemInfo> itemInfos;//동적배열 - > 사용하기 전 인스턴스화해야함
//저장객체는 항상 필드를 public으로 쓰자 저장이 잘 안될 수 있다.
//몬스터 정보들
//영웅의 정보
//유저의 ID
public GameInfo() { }
//메서드
public void Init()//초기화(신규유저일떄 기본값)
{
this.itemInfos = new List<ItemInfo>();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LoadAndSaveGame
{
internal class Hero
{
List<Item> items = new List<Item>();//컬렉션 초기화해줘야한다.
ItemInfo itemInfo;
public Hero() {
}
public void SetItem(Item item)
{
this.items.Add(item);
}
public List<Item> GetItems() {
return this.items;
}
public void AddItem(Item item)
{
this.items.Add(item);
Console.WriteLine("아이템({0})이 추가되었습니다.", item.info.id);
//return item;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LoadAndSaveGame
{
//저장해야 하는 정보들을 관리하는 싱글톤 클래스
internal class InfoManager
{
public static readonly InfoManager Instance = new InfoManager();
public GameInfo gameInfo;
//싱글톤
//생성자
private InfoManager() { }
//메서드
public void Init(GameInfo gameInfo)
{
this.gameInfo = gameInfo;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LoadAndSaveGame
{
public class Item
{
public ItemInfo info
{
get;
private set;
}
public Item(ItemInfo info)
{
// Console.WriteLine("===========> {0}", info);
this.info = info;//info 할당
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LoadAndSaveGame
{
public class ItemInfo
{
// 인벤토리의 아이템 정보들
public int id;
public int damage;
//생성자
public ItemInfo(int id, int damage)
{
this.id = id;
this.damage = damage;
}
}
}
2. 위의 코드를 바탕으로 아이템 추가, 저장 후 기존 유저일때 아이템 가져와 거기에 추가하는것 코드 수정
'C# 기초' 카테고리의 다른 글
미션-json연습예제 복습 (0) | 2023.07.31 |
---|---|
C# LINQ (0) | 2023.07.31 |
JSON,데이터 관리 연습 3- 몬스터 잡으면 아이템 드롭, 가방에 넣기 (0) | 2023.07.28 |
JSON, 데이터 관리연습2-아이템 가방에 넣고 착용하기 (0) | 2023.07.28 |
JSON, 데이터 관리 연습 (0) | 2023.07.28 |