C#/수업과제

텍스트 Rpg만들기

띵킹진 2022. 6. 21. 18:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.IO;

namespace Study09
{
    public class Game
    {
        private Character user;
        public Game()
        {
            this.LoadDatas();

            if (this.IsNewbie())
            {
                this.CreateCharacter();
            }
            else
            {
                Character character = new Character(this.LoadCharacterInfo());
                user = character;
            }
            user.DisplayStatus();

            user.GetExp(20);
            user.GetExp(30);
            user.GetExp(40);
            this.Save(user.CreateCharacterInfo());
        }

        private void LoadDatas()
        {
            DataManager.instance.LoadJobDatas();
            DataManager.instance.LoadRequireExpDatas();
        }

        private bool IsNewbie()
        {
            return !File.Exists("./character_info.json");
        }

        private void CreateCharacter()
        {
            Console.WriteLine("환영합니다. 용사님.");
            Console.WriteLine("닉네임을 입력해주세요.");
            string inputName = Console.ReadLine();
            Console.WriteLine();
            Console.WriteLine("반갑습니다. {0}님", inputName);
            Console.WriteLine("직업번호를 선택해주세요. (0):전사 (1):마법사 (2):도적");
            int inputJob = Convert.ToInt32(Console.ReadLine());
            if (inputJob == 1 || inputJob == 2 || inputJob == 3)
            {
                Character.eJob job = (Character.eJob)inputJob;
                Character user = new Character(inputName, job);
                Console.WriteLine("{0}님의 직업은 {1}로 선택되었습니다.", inputName, user.GetStringJob());
                this.user = user;
            }
            else
            {
                Console.WriteLine("잘못된 값이 입력되었습니다.");
                Console.WriteLine("캐릭터를 다시 생성합니다.");
                Console.WriteLine("----------------------------------------");
                this.CreateCharacter();
            }
        }

        private void Save(CharacterInfo info)
        { string json = JsonConvert.SerializeObject(info);
            File.WriteAllText("./character_info.json", json);
            Console.WriteLine("Save Complete!");
        }

        private CharacterInfo LoadCharacterInfo()
        {
            string json = File.ReadAllText("./character_info.json");
            return JsonConvert.DeserializeObject<CharacterInfo>(json);
        }


    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using Newtonsoft.Json;

namespace Study09
{
    public sealed class DataManager
    {
        public static readonly DataManager instance = new DataManager();

        private Dictionary<int, JobData> dicJobs;
        private Dictionary<int, RequireExpData> dicRequireExp;
        private DataManager()
        { 
        
        }

        public void LoadJobDatas()
        {
            string json_JobDatas = File.ReadAllText("./job_data.json");
            JobData[] arrJobDatas = JsonConvert.DeserializeObject<JobData[]>(json_JobDatas);
            this.dicJobs = arrJobDatas.ToDictionary(x => x.id);
        }

        public void LoadRequireExpDatas()
        {
            string json_RequireExpDatas = File.ReadAllText("./require_exp_data.json");
            RequireExpData[] arrRequireExpDatas = JsonConvert.DeserializeObject<RequireExpData[]>(json_RequireExpDatas);
            this.dicRequireExp = arrRequireExpDatas.ToDictionary(x => x.id);
        
        }

        public JobData GetCharacterDataByJob(Character.eJob job)
        {
            int intJob = (int)job;
            JobData data = this.dicJobs.Values.Where(x => x.job == intJob).First();
            return data;
        }

        public int GetRequireExpDataByLevel(int level)
        {
            RequireExpData requireExp = this.dicRequireExp.Values.Where(x => x.level == level).First();
            return requireExp.require_exp;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Study09
{
    public class JobData
    {
        public int id;
        public int job;
        public float max_hp;
        public float damage;
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Study09
{
    public class RequireExpData
    {
        public int id;
        public int level;
        public int require_exp;
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Study09
{
    public class Character
    {
        public class UpdateStatusEventArgs : EventArgs
        {
            public CharacterInfo Info { get; set; }
        }
        public event EventHandler<UpdateStatusEventArgs> onUpdateStatus;
        public enum eJob { Warrior, Wizard, Thief }
        private CharacterInfo info;
        public Character(string name, eJob job)
        {
            this.info = new CharacterInfo();
            this.info.Name = name;
            this.info.Job = (CharacterInfo.eJob)Convert.ToInt32(job);
            this.info.Level = 1;
            JobData data = DataManager.instance.GetCharacterDataByJob(job);
            this.info.Damage = data.damage;
            this.info.MaxHp = data.max_hp;
            this.info.Hp = this.info.MaxHp;
            this.info.Exp = 0;
            this.info.Require_Exp = DataManager.instance.GetRequireExpDataByLevel(this.info.Level);
        }

        public Character(CharacterInfo info)
        {
            this.info = info;
        }

        public void DisplayStatus()
        {
            Console.WriteLine("-----------------------------------------");
            Console.WriteLine("이름 : {0}",this.info.Name);
            Console.WriteLine("직업 : {0}",this.GetStringJob());
            Console.WriteLine("레벨 : {0}", this.info.Level);
            Console.WriteLine("경험치 : ({0} / {1}), {2}%", this.info.Exp, this.info.Require_Exp, ((float)this.info.Exp/this.info.Require_Exp)*100);
            Console.WriteLine("체력 : ({0} / {1})",this.info.Hp,this.info.MaxHp);
            Console.WriteLine("데미지 : {0}",this.info.Damage);
            Console.WriteLine("-----------------------------------------");
        }

        public string GetStringJob()
        {
            if (this.info.Job == CharacterInfo.eJob.Warrior)
                return "전사";
            if (this.info.Job == CharacterInfo.eJob.Wizard)
                return "마법사";
            if (this.info.Job == CharacterInfo.eJob.Thief)
                return "도적";
            else return "초보자";
        }

        public CharacterInfo CreateCharacterInfo()
        {
            return this.info;
        }

        private void DispatchUpdateStatusEvent()
        { if (this.onUpdateStatus != null)
            {
                this.onUpdateStatus(this, new UpdateStatusEventArgs() { Info = this.info });
            }
        }

        public void CharacterHit(int damage)
        {
            this.info.Hp -= damage;
            this.DispatchUpdateStatusEvent();
            this.DisplayStatus();
        }

        public void GetExp(int exp)
        {
            if (this.info.Exp + exp < this.info.Require_Exp)
            {
                this.info.Exp += exp;
                this.DispatchUpdateStatusEvent();
            }

            else
            {
                this.LevelUp(exp);
                Console.WriteLine("레벨업 하셨습니다");
            }
            this.DisplayStatus();
        }
        public void LevelUp(int exp)
        {
            this.info.Exp = this.info.Exp + exp - this.info.Require_Exp;
            this.info.Level++;
            this.info.Damage++;
            this.info.MaxHp += 10;
            this.info.Hp = this.info.MaxHp;
            this.info.Require_Exp = DataManager.instance.GetRequireExpDataByLevel(this.info.Level);
        }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Study09
{
    public class CharacterInfo
    {
        public enum eJob { Warrior, Wizard, Thief }
        public string Name;
        public eJob Job;
        public int Level;
        public float Damage;
        public int Require_Exp;
        public int Exp;
        public float Hp;
        public float MaxHp;

        public CharacterInfo()
        { }
    }
}