19. 팀 프로젝트 과제(2)

이규성·2023년 11월 20일
0

TIL

목록 보기
24/106

11/20 본격적인 분담 및 시작

📌알고리즘 코드 카타 (Algorithm Code Kata)

앞으로는 여러가지 코드 카타 중 인상깊었던 문제 위주로 작성하려고 한다.

두 수의 나눗셈

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

🤸🏻‍♀️Feedback

하루종일 작성했다기엔 부족한 양이지만 코드 한 줄 작성하는데에 우여곡절이 많았다. 특히 우리 팀은 스크립트를 나눠서 시작했다 보니 참조에서 많은 오류가 있었다. 에러가 아닌데 디버그를 시작하면 참조가 불가능하다, null 값이다, 예외 처리가 되지 않았다 등등. . . 공부하면서 처음보는 에러들이 발생해서 많이 당황했지만 구글링과 다양한 시도를 통해서 우선은 데미지를 주고 받는 코드를 완성할 수 있었다. 약간의 성취감이 있지만 앞으로 구현해야할 기능들이 산더미기에 조금은 조급한 마음이 든다.

0개의 댓글