2022. 1. 12. 14:47ㆍC#/수업 내용
쓰레드?
예외처리. tryParse?
out, ref?
11일자 포스팅에 작은 오류가 있었다.
게임을 실행할 때마다 게임 진행상태 정보를 불러오는데, 불러올 때마다
이 코드에 의해 데미지가 증가되는 것.
이 코드는 Weapon을 만들 때 호출되는 생성자에 들어있는 코드이다.
아마 프로그램이 실행되고, 게임 진행상태 정보에 들어있는 Weapon 멤버 변수를 가져올 때
자동으로 이 생성자가 실행되는 것 같다.
그래서 Weapon의 강화수치에 따른 데미지 계산 공식을 바꿨다.
생성자에 멤버값 초기화변수를 넣는 대신에 Init() 메서드를 만들어야 하는 이유를 몸으로 겪었다.
버그 수정.
이하 수업 과제------------------------------------------------------------------------------
1) 실행파일의 경로에 생성한 Datas 폴더 안에 웨폰 데이터, 캐릭터 데이터, 몬스터 데이터를 json파일로 저장한다.
2) 프로그램에서 데이터를 읽고 쓰기 위해 데이터를 총괄하는 클래스 DataMgr를 만들고 LoadData() 메서드로 json 파일을 역직렬화 및 딕셔너리에 저장한다.
3) 저장한 데이터를 기반으로 게임 첫 시작 시 캐릭터 직업 선택 문구를 구현한다.
4) 각 캐릭터 직업에 맞는 무기를 지급한다.
5) 몬스터가 있는 필드로 나가 고블린 무리와 싸운다.
5-1) 몬스터를 맞닥뜨리면 해당 몬스터의 정보 텍스트가 나온다.
5-2) 나 한대, 몬스터 한대 번갈아가면서 공격한다. 공격 성공 시 적의 남은 체력상태가 표시된다.
5-3) 고블린에게 패배하면 해당 캐릭터의 정보와 모든 게임 정보가 삭제된다.
5-4) 고블린에게 승리하면 골드 보상을 얻고 무기 보상을 얻는다.
1) 실행파일의 경로에 생성한 Datas 폴더 안에 웨폰 데이터, 캐릭터 데이터, 몬스터 데이터를 json파일로 저장한다.
2) 프로그램에서 데이터를 읽고 쓰기 위해 데이터를 총괄하는 클래스 DataMgr를 만들고 LoadData() 메서드로 json 파일을 역직렬화 및 딕셔너리에 저장한다.
class DataMgr
{
private const string Datas_Path = "./Datas";
private const string GAME_INFO_PATH = "game_info.json";
private const string WEAPON_DATA_PATH = "weapon_data2.json";
private const string CHARACTER_DATA_PATH = "character_data.json";
private const string MONSTER_DATA_PATH = "monster_data.json";
private Dictionary<int, weapon_data> dictWeaponData = new Dictionary<int, weapon_data>();
private Dictionary<int, Character_data> dictCharacterData = new Dictionary<int, Character_data>();
private Dictionary<int, Monster_data> dictMonsterData = new Dictionary<int, Monster_data>();
public void LoadData()
{
string path = string.Format("{0}/{1}", Datas_Path, WEAPON_DATA_PATH);
string json = File.ReadAllText(path);
this.dictWeaponData = JsonConvert.DeserializeObject<weapon_data[]>(json).ToDictionary(x => x.id);
foreach(KeyValuePair<int, weapon_data> weapon in dictWeaponData)
{
Console.WriteLine(weapon.Value.name);
}
path = string.Format("{0}/{1}", Datas_Path, CHARACTER_DATA_PATH);
json = File.ReadAllText(path);
this.dictCharacterData = JsonConvert.DeserializeObject<Character_data[]>(json).ToDictionary(x => x.id);
foreach (KeyValuePair<int, Character_data> character in dictCharacterData)
{
Console.WriteLine(character.Value.default_attack_action_text);
}
path = string.Format("{0}/{1}", Datas_Path, MONSTER_DATA_PATH);
json = File.ReadAllText(path);
this.dictMonsterData = JsonConvert.DeserializeObject<Monster_data[]>(json).ToDictionary(x => x.id);
foreach (KeyValuePair<int, Monster_data> monster in dictMonsterData)
{
Console.WriteLine(monster.Value.name);
}
}
}
3) 저장한 데이터를 기반으로 게임 첫 시작 시 캐릭터 직업 선택 문구를 구현한다.
4) 각 캐릭터 직업에 맞는 무기를 지급한다.
class DataMgr
{
private static DataMgr instance;
public GameInfo gi;
private Dictionary<int, weapon_data> dictWeaponData = new Dictionary<int, weapon_data>();
private Dictionary<int, Character_data> dictCharacterData = new Dictionary<int, Character_data>();
private Dictionary<int, Monster_data> dictMonsterData = new Dictionary<int, Monster_data>();
public void DiscernUserType()
{
if (File.Exists(GAME_INFO_PATH))
{
Console.WriteLine("기존 유저입니다.");
string getJson = File.ReadAllText(GAME_INFO_PATH);
this.gi = JsonConvert.DeserializeObject<GameInfo>(getJson);
this.gi.CheckWeaponStatus();
this.gi.CheckMyStatus();
} else
{
Console.WriteLine("신규 유저입니다.");
this.gi = new GameInfo();
Console.WriteLine("");
Console.WriteLine("당신은 누구인가요?");
for (int i = 0; i < 4; i++)
{
Console.WriteLine("\n{0} => {1}", i, GetCharacterData(i).name);
}
Console.WriteLine("");
string choice = Console.ReadLine();
int choice2 = Convert.ToInt32(choice);
Console.WriteLine("");
Character_data charData = GetCharacterData(choice2);
this.gi.me = new Adventurer(charData.id, charData.name);
this.gi.me.Init();
Console.WriteLine("{0}를 결정하셨습니다.", this.gi.me.name);
Console.WriteLine("신규 유저를 위해 5단계 무기를 지급했습니다.");
weapon_data data = GetWeaponData(charData.default_weapon_id);
Weapon startWeapon = new Weapon(data.id, data.name, data.damage, data.sellPrice, data.grade, 5);;
this.gi.EquipWeapon(startWeapon);
this.gi.CheckWeaponStatus();
this.gi.CheckMyStatus();
string saveJson = JsonConvert.SerializeObject(this.gi);
File.WriteAllText(GAME_INFO_PATH, saveJson);
}
}
public Character_data GetCharacterData(int id)
{
return dictCharacterData[id];
}
public weapon_data GetWeaponData(int id)
{
return dictWeaponData[id];
}
}
class GameInfo
{
public Adventurer me;
public Weapon startWeapon;
public void CheckMyStatus()
{
Console.WriteLine("[Status]\n{0} Lv.{7}\nHealth : {1} / {2}\nMana : {3} / {4}\nStamina : {5} / {6}\n\n[Ability Point]\nstr : {8}\nagi : {9}\nint : {10}\n\nGold : {11}",
me.name, me.hp, me.max_hp, me.mana, me.max_mana, me.stamina, me.max_stamina, me.level, me.str, me.agi, me.inte, me.gold);
}
public void CheckWeaponStatus()
{
Console.WriteLine("{0} {1}단계 / 무기 공격력 : {2} / 아이템 가격 : {3}",
startWeapon.name, startWeapon.reinforcement, startWeapon.damage, startWeapon.sellPrice);
}
public void EquipWeapon(Weapon weapon)
{
this.startWeapon = weapon;
}
}
class Character_data
{
public int id;
public string name;
public float max_hp;
public int max_stamina;
public int max_mana;
public int default_weapon_id;
public string default_attack_action_text;
}
class Adventurer
{
public int id;
public string name;
public float max_hp;
public float hp;
public int max_stamina;
public int stamina;
public int max_mana;
public int mana;
public int level;
public int str;
public int agi;
public int inte;
public int gold;
public Adventurer(int id, string name)
{
this.id = id;
this.name = name;
}
public void Init()
{
this.max_hp = DataMgr.GetInstance().GetCharacterData(this.id).max_hp;
this.hp = this.max_hp;
this.max_stamina = DataMgr.GetInstance().GetCharacterData(this.id).max_stamina;
this.stamina = this.max_stamina;
this.max_mana = DataMgr.GetInstance().GetCharacterData(this.id).max_mana;
this.mana = this.max_mana;
this.level = 1;
this.str = 0;
this.agi = 0;
this.inte = 0;
this.gold = 0;
}
}
[다음에 해야할 것]
5) 몬스터가 있는 필드로 나가 고블린 무리와 싸운다.
5-1) 몬스터를 맞닥뜨리면 해당 몬스터의 정보 텍스트가 나온다.
5-2) 나 한대, 몬스터 한대 번갈아가면서 공격한다. 공격 성공 시 적의 남은 체력상태가 표시된다.
5-3) 고블린에게 패배하면 해당 캐릭터의 정보와 모든 게임 정보가 삭제된다.
5-4) 고블린에게 승리하면 골드 보상을 얻고 무기 보상을 얻는다.
6) 게임 세이브를 하면 현재 진행 상태와 모든 정보가 저장돼서, 다시 로드했을 때 모든 상태가 유지된 채로 마지막으로 방문한 맵에서 다시 시작한다.
'C# > 수업 내용' 카테고리의 다른 글
22.01.17 텍스트기반 게임 만들기 Part.2 (0) | 2022.01.17 |
---|---|
22.01.11 싱글턴 패턴 (0) | 2022.01.11 |
22.01.08 Dictionary 키값쌍과 JSON 연동 (0) | 2022.01.08 |
22.01.05 대리자 delegate Part.2 (0) | 2022.01.05 |
22.01.04 대리자 delegate (0) | 2022.01.04 |