앞으로는 여러가지 코드 카타 중 인상깊었던 문제 위주로 작성하려고 한다.
num1, num2 두 수가 입력되면 나누기를 한 후 곱하기 1000을 한 값을 출력하는 메서드를 작성하라.
public class Solution
{
public int solution(float num1, float num2)
{
float answer = 0;
answer = (num1 / num2) * 1000;
return (int)answer;
}
}
int
, float
그리고 명시적 형변환에 대해 기본적인 개념을 익힐 수 있었다.
입력된 angle 값에 따라 예각 직각 둔각 평각을 판단하는 메서드를 작성하라.
0 < angle < 90 : 1
angle = 90 : 2
90 < angle < 180 : 3
angle = 180 : 4
public class Solution
{
public int solution(int angle)
{
int answer = 0;
if (angle > 0 && angle <= 180)
{
if (angle < 90)
{
answer = 1;
return answer;
}
else if (angle == 90)
{
answer = 2;
return answer;
}
else if (angle < 180)
{
answer = 3;
return answer;
}
else
{
answer = 4;
return answer;
}
}
return answer;
}
}
if
문의 중첩으로 해결하였다. 3항연산자를 사용하면 한 줄로 완성시킬 수 있었겠지만 좀 더 기본 문법들을 숙련시키고 싶었다.
목표 중 몬스터와 플레이어의 데미지 공식이 있었다.
최소 데미지 = 공격력 - (공격력 / 10)
최대 데미지 = 공격력 + (공격력 / 10)
최소 데미지, 최대 데미지 사이 값 중 랜덤으로 결정되며 공격력 / 10의 값이 소수점일 경우 올림 처리
처음에는 int
, float
사이의 형변환으로 해결하려 했으나 테스트 중 특정 값에서 원하는 결과값이 도출되지 않았고, 구글링을 통해서 올림, 버림, 반올림에 대한 C# 클래스가 있음을 알게 되었다.
double Atk = 3;
double AtkDivide = Math.Ceiling(Atk / 10); // Math.Ceiling(double i) i값을 올림한다.
double MinAtk = Atk - AtkDivide;
double MaxAtk = Atk + AtkDivide;
int i = 1;
while (i <= 20)
{
i++;
double Damage = new Random().Next((int)MinAtk, (int)MaxAtk + 1);
Console.WriteLine(Damage);
}
데미지 공식 베이스 코드를 작성한 김에 플레이어와 몬스터 간의 데미지 메서드를 내가 맡아서 작성하기로 했다.
public static Character player;
public static Monster[] monsters;
public static void GameDataSetting()
{
player = new Character("Frost", "마법사", 1, 20, 5, 50, 200, 5000);
monsters = new Monster[10];
MonsterList(new Monster("가고일", "마계에서 온 흔히 볼 수 있는 가고일입니다.", 11, 10, 50, 10));
MonsterList(new Monster("골렘", "마기가 가득한 돌덩이들이 모여 만들어졌습니다.", 20, 10, 60, 10));
}
player, monster 클래스는 다른 스크립트에 작성되었다.
public static int PlayerAtkDamage()
{
double MinDamage = player.Atk - Math.Ceiling((double)player.Atk / 10);
double MaxDamage = player.Atk + Math.Ceiling((double)player.Atk / 10);
int atkDamage = new Random().Next((int)MinDamage, (int)MaxDamage + 1);
return atkDamage;
}
public static void PlayerTakeDamage(int damage)
{
player.Hp -= damage;
if (player.Hp <= 0)
{
Console.WriteLine($"{player.Name}이(가) 죽었습니다.");
}
else
{
Console.WriteLine($"{player.Name}이(가) {damage}의 데미지를 받았습니다.
남은 체력: {player.Hp}");
}
}
public static int MonsterAtkDamage()
{
int i = 0;
double MinDamage = monsters[i].Atk - Math.Ceiling((double)monsters[i].Atk / 10);
double MaxDamage = monsters[i].Atk + Math.Ceiling((double)monsters[i].Atk / 10);
int atkDamage = new Random().Next((int)MinDamage, (int)MaxDamage + 1);
return atkDamage;
}
public static void MonsterTakeDamage(int damage)
{
int i = 0;
monsters[i].Hp -= damage;
if (monsters[i].Hp <= 0)
{
Console.WriteLine($"{monsters[i].MonsterName}이(가) 죽었습니다.");
}
else
{
Console.WriteLine($"{monsters[i].MonsterName}이(가) {damage}의 데미지를 받았습니다.
남은 체력: {monsters[i].Hp}");
}
}
플레이어와 몬스터 클래스 및 메서드를 종속과 델리게이트를 사용하여 간소화하고 싶었지만 베이스 코드를 이미 팀원이 작성해 주셔서 코드를 엎자고 말하기는 시간 관계상 어려움이 있었다.
public static void BattleScene()
{
Console.Clear();
for (int i = 0; i < Monster.MonsterCnt; i++)
{
GameData.monsters[i].PrintMonsterDescription();
}
GameData.MonsterTakeDamage(GameData.PlayerAtkDamage());
GameData.PlayerTakeDamage(GameData.MonsterAtkDamage());
}
// 출력
가고일
골렘
가고일이(가) 19의 데미지를 받았습니다. 남은 체력: 31
Frost이(가) 9의 데미지를 받았습니다. 남은 체력: 41
하루종일 작성했다기엔 부족한 양이지만 코드 한 줄 작성하는데에 우여곡절이 많았다. 특히 우리 팀은 스크립트를 나눠서 시작했다 보니 참조에서 많은 오류가 있었다. 에러가 아닌데 디버그를 시작하면 참조가 불가능하다, null 값이다, 예외 처리가 되지 않았다 등등. . . 공부하면서 처음보는 에러들이 발생해서 많이 당황했지만 구글링과 다양한 시도를 통해서 우선은 데미지를 주고 받는 코드를 완성할 수 있었다. 약간의 성취감이 있지만 앞으로 구현해야할 기능들이 산더미기에 조금은 조급한 마음이 든다.