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()
{ }
}
}