20. 팀 프로젝트 과제(3)

이규성·2023년 11월 21일
0

TIL

목록 보기
25/106

11/21 이어서 진행한다.

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

짝수의 합

정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.

입출력
nresult
1030
46
using System;

public class Solution
{
    public int solution(int n)
    {
        if (n % 2 == 0)
        {
            int answer = 0;
            while (n > 0)
            {                        
                answer += n;
                n -= 2;
            }
            return answer;
        }
        else
        {
            n -= 1;
            int answer = 0;
            while (n > 0)
            {                        
                answer += n;
                n -= 2;
            }
            return answer;
        }
        
    }
}

먼저 n값이 짝수인지 홀수인지 구분지었고 반복문의 사용으로 해결하였다.

배열의 평균값

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return하도록 solution 함수를 완성해주세요.

입출력
numbersresult
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]5.5
[89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]94.0
using System;

public class Solution
{            
    public double solution(int[] numbers)
    {        
        int i = 0;
        double answer = 0;

        while (i < numbers.Length)
        {
            answer += numbers[i];
            i++;                                        
        }
        return answer / numbers.Length;

    }
}

배열된 데이터를 어떻게 반복문에 넣을지 고민의 시간이 있었고, Length를 이용하여 해결하였다.

📌팀 프로젝트

데미지 계산 공식을 테스트해보며 수정이 많이 이루어졌다.

GameData.cs

public static int PlayerAtkDamage() // Character class에 생성하고 싶었으나, script가 나누어져 호출 문제로 GameDate.cs에 생성함 Enemy 데이터가 만들어지면 EnemyAtkDamage() 메서드 생성 예정
{
    // 아이템을 장착하면 캐릭터의 스탯에 반영한다.
    double MinDamage = (GetSumBonusAtk() > 0 ? player.Atk + GetSumBonusAtk() : player.Atk) - Math.Ceiling((double)player.Atk / 10);
    //double MinDamage = player.Atk - Math.Ceiling((double)player.Atk / 10);

    double MaxDamage = (GetSumBonusAtk() > 0 ? player.Atk + GetSumBonusAtk() : 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, int i) // 이하동문
{            
    player.Hp -= damage;
    if (player.Hp <= 0)
    {
        player.Hp = 0;
        Console.WriteLine($"{player.Name}이(가) {monsters[i].MonsterName}에게 {damage}의 데미지를 받았습니다. 남은 체력: {player.Hp}\n");                
        Console.WriteLine($"{player.Name}이(가) 죽었습니다.");
    }
    else
    {
        Console.WriteLine($"{player.Name}이(가) {monsters[i].MonsterName}에게 {damage}의 데미지를 받았습니다. 남은 체력: {player.Hp}\n");
    }
}
public static int MonsterAtkDamage(int i) // 마찬가지의 이유로 GameDate.cs에 생성항. 
{            
    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) // 이하동문
{            
    monsters[i].Hp -= damage;
    if (monsters[i].Hp <= 0)
    {
        Program.MonsterDead(i);
        monsters[i].Hp = 0;
        Console.WriteLine($"{monsters[i].MonsterName}이(가) {damage}의 데미지를 받았습니다. 남은 체력: {monsters[i].Hp}");                
        Console.WriteLine($"{monsters[i].MonsterName}이(가) 죽었습니다.");
    }
    else
    {
        Console.WriteLine($"{monsters[i].MonsterName}이(가) {damage}의 데미지를 받았습니다. 남은 체력: {monsters[i].Hp}");
    }
}
  1. 아이템 장착 시 데미지 공식에 반영시킴
  2. 개체가 사망할 시 Hp = 0으로 고정시키고 텍스트 출력

Scene.cs\BattleScene()

public static void BattleScene()
{
    Console.Clear();

    int bonusAtk = GameData.GetSumBonusAtk();
    int bonusDef = GameData.GetSumBonusDef();
    int bonusHp = GameData.GetSumBonusHp();
    int bonusMp = GameData.GetSumBonusMp();

    // 랜덤으로 생성하여 보자
    RandomMonsterCount();
    
    //for (int i = 0; i < new Random().Next(1, 5); i++)
    //{
    //    int RandomMonsterCount = new Random().Next(0, 3);
    //    GameData.monsters[RandomMonsterCount].PrintMonsterDescription();
    //}


    Console.WriteLine();

    Console.WriteLine($"{GameData.player.Name}({GameData.player.Job})");
    Program.PrintTextWithHighlights($"Atk :", (GameData.player.Atk + bonusAtk).ToString(), bonusAtk > 0 ? string.Format("(+{0})", bonusAtk) : "");
    Program.PrintTextWithHighlights($"Def :", (GameData.player.Def + bonusDef).ToString(), bonusDef > 0 ? string.Format("(+{0})", bonusDef) : "");
    Program.PrintTextWithHighlights($"Hp :", (GameData.player.Hp + bonusHp).ToString(), bonusHp > 0 ? string.Format("(+{0})", bonusHp) : "");
    Program.PrintTextWithHighlights($"Mp :", (GameData.player.Mp + bonusMp).ToString(), bonusMp > 0 ? string.Format("(+{0})", bonusMp) : "");

    Console.WriteLine();
    Console.WriteLine("0. 나가기");
    Console.WriteLine("1. 공격 시작");
    int keyinput = Program.CheckValidInput(0, 1);
    switch (keyinput)
    {
        case 0:
            DisplayTown();
            break;
        case 1:
            PlayerAtkScene();
            break;
    }

    //GameData.MonsterTakeDamage(GameData.PlayerAtkDamage());
    //GameData.PlayerTakeDamage(GameData.MonsterAtkDamage());
}
  1. 전투 진입 시 랜덤한 숫자로 몬스터를 생성시킴
  2. 플레이어의 정보 출력

Scene.cs\PlayerAtkScene()

 public static void PlayerAtkScene()
 {            
     Console.Clear();

     // 랜덤으로 생성된 몬스터를 여기로 바로 가져와야하는데 연결을 어떻게 시켜야 할까?
     RandomMonsterCount();

     int bonusAtk = GameData.GetSumBonusAtk();
     int bonusDef = GameData.GetSumBonusDef();
     int bonusHp = GameData.GetSumBonusHp();
     int bonusMp = GameData.GetSumBonusMp();

     //for (int i = 0; i < Monster.MonsterCnt; i++)
     //{
     //    GameData.monsters[i].PrintMonsterDescription(true, i + 1);
     //}

     Console.WriteLine();

     Console.WriteLine($"{GameData.player.Name}({GameData.player.Job})");
     Program.PrintTextWithHighlights($"Atk :", (GameData.player.Atk + bonusAtk).ToString(), bonusAtk > 0 ? string.Format("(+{0})", bonusAtk) : "");
     Program.PrintTextWithHighlights($"Def :", (GameData.player.Def + bonusDef).ToString(), bonusDef > 0 ? string.Format("(+{0})", bonusDef) : "");
     Program.PrintTextWithHighlights($"Hp :", (GameData.player.Hp + bonusHp).ToString(), bonusHp > 0 ? string.Format("(+{0})", bonusHp) : "");
     Program.PrintTextWithHighlights($"Mp :", (GameData.player.Mp + bonusMp).ToString(), bonusMp > 0 ? string.Format("(+{0})", bonusMp) : "");

     Console.WriteLine();
     Console.WriteLine("공격할 몬스터의 번호를 선택하세요. ");
     Console.WriteLine();
     Console.WriteLine("0. 마을로 돌아가기 ");
     Console.WriteLine();

     int keyinput = Program.CheckValidInput(0, Monster.MonsterCnt); // 죽어서 선택을 못하게 하려면 배열에서 삭제..? 그럼 아예 콘솔창에서 사라질텐데 어쩌지
     switch (keyinput)
     {
         case 0:
             DisplayTown();
             break;
         default:
             GameOver();
             if (GameData.monsters[keyinput - 1].Hp <= 0)
             {
                 Console.WriteLine("잘못된 선택입니다. 아무 키를 입력하여 플레이어 공격 화면으로 돌아갑니다. ");
                 Console.ReadKey();
                 PlayerAtkScene();
             }
             GameData.MonsterTakeDamage(GameData.PlayerAtkDamage(), keyinput - 1);
             break;
     }
     Console.WriteLine("\n아무 키 입력 시 다음 턴으로 넘어갑니다. ");
     Console.ReadKey();
     GameOver();

     MonsterAtkScene();
 }
  1. 생성된 몬스터를 번호로 선택하여 공격
  2. 사망한 개체가 있는지 판단하고, 있다면 GameOver 메서드로 어떤 결과창을 호출할지 판단

Scene.cs\MonsterAtkScene()

 public static void MonsterAtkScene()
{
    Console.Clear();

    for (int i = 0; i < Monster.MonsterCnt; i++)
    {
        GameData.monsters[i].PrintMonsterDescription(true, i + 1);
    }
    Console.WriteLine();
    Console.WriteLine("몬스터가 공격합니다. ");
    Console.WriteLine();
    for (int i = 0; i < Monster.MonsterCnt; i++)
    {
        if (GameData.monsters[i].Hp > 0)
        {
            GameData.PlayerTakeDamage(GameData.MonsterAtkDamage(i), i);
            if (GameData.player.Hp <= 0)
            {
                Console.WriteLine("\n아무 키 입력 시 전투 결과창으로 넘어갑니다. ");
                Console.ReadKey();

                GameOver();
            }
        }
    }

    Console.WriteLine("\n아무 키 입력 시 다음 턴으로 넘어갑니다. ");
    Console.ReadKey();
    PlayerAtkScene();
}
  1. 위에서부터 순서대로 플레이어를 공격
  2. 사망한 몬스터는 공격하지 않는다.
  3. 몬스터가 모두 사망하면 GameOver 호출하여 판단

Scene.cs\GameOver()

public static void GameOver() // 플레이어와 몬스터의 hp를 계속 판단하여 if 플레이어가 죽었을 시 출력, else if 몬스터가 전부 죽었을 시 출력
{
    if (GameData.player.Hp <= 0)
    {
        Console.Clear();
        Console.WriteLine("패배하였습니다. . .\n");
        Console.WriteLine(GameData.player.Name + "은(는) 눈 앞이 캄캄해졌다. ");
        Console.WriteLine();
        Console.WriteLine("\n아무 키 입력 시 마을로 돌아갑니다. ");
        Console.ReadLine();
        Reset();
        DisplayTown();
    }
    else if (GameData.monsters[0].Hp <= 0 && GameData.monsters[1].Hp <= 0 && GameData.monsters[2].Hp <= 0) // 배열로 조건을 하나로 만들고 싶지만 호출 등에 문제가 있어서 코드가 길어짐, 랜덤 생성 몬스터 메서드와 겹칠 시 문제 발생 우려됨
    {
        Console.Clear();
        Console.WriteLine("전투에서 승리하였습니다 ! \n");
        Console.WriteLine("처치한 몬스터 수 " + "랜덤으로 생성한 값");
        Console.WriteLine("\n아무 키 입력 시 마을로 돌아갑니다. ");
        Console.WriteLine();
        Console.ReadLine();
        DisplayTown();
    }
}

사망한 개체를 판단하여 승리와 패배를 출력함

🤸🏻‍♀️Feedback

우선 변경점이 아주 많았고 생각대로 구현되어서 성공적으로 진행된다는 생각이었으나, BattleScene에서 생성한 몬스터의 값들이 PlayerArkScene으로 전달하고 몬스터 앞에 번호 붙이기, 공격할 몬스터를 선택할 수 있게 만들기에서 막힌 상태이다. . . 다양하게 시도해볼 예정

0개의 댓글