정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.
입출력 | 예 |
---|---|
n | result |
10 | 30 |
4 | 6 |
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 함수를 완성해주세요.
입출력 | 예 |
---|---|
numbers | result |
[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를 이용하여 해결하였다.
데미지 계산 공식을 테스트해보며 수정이 많이 이루어졌다.
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}");
}
}
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());
}
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();
}
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();
}
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();
}
}
사망한 개체를 판단하여 승리와 패배를 출력함
우선 변경점이 아주 많았고 생각대로 구현되어서 성공적으로 진행된다는 생각이었으나, BattleScene에서 생성한 몬스터의 값들이 PlayerArkScene으로 전달하고 몬스터 앞에 번호 붙이기, 공격할 몬스터를 선택할 수 있게 만들기에서 막힌 상태이다. . . 다양하게 시도해볼 예정