C# 게임 저장, 로드
2023. 7. 28.

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;
        }
    }
}

 

아이템 추가후 json에 저장되었는지 확인

2. 위의 코드를 바탕으로 아이템 추가, 저장 후 기존 유저일때 아이템 가져와 거기에 추가하는것 코드 수정

 

 

myoskin