[240110]TIL

응징·2024년 1월 10일
0

TIL

목록 보기
13/36
post-thumbnail

알고리즘 세션강의

기억나는 것

this

this = 클래스내 변수를 뜻함

<사용할 예시>

string str

public 이름(string str)
{
	str = str; 
}

위의 코드 경우 어떤것이 파라미터 값인지 클래스 내의 값인지 구별하기 어렵다.

string str

public 이름(string str)
{
	this.str = str; 
}

때문에 this.이름 으로 클래스 내 변수를 구분해준다.

그 외

stack 후입선출
프로그램 평가 기준

팀프로젝트

At은 인덱스 Remove는 원소 판정

Remove와 RemoveAt의 차이

List floot = new List {"사과", "배", "키위"}

Remove("사과")는 원소 판정으로 찾아내서 없앰
RemoveAt(1)는 인덱스 판정으로 찾아내서 없앰

결과적으론 둘다 사과가 사라진다

break 문제

발단은 전투 구현에서 플레이어가 몬스터에게 공격을 가할때 Player Class내 Attack() 함수에서 Hp를 깎도록 구현하고 있었다.

Battle

public void Battle(Player player)
{
  .../ 생략


  while (!Isrun)
  {
      //if() 플레이어가 지거나 클리어할 경우 Isrun = true;
      BattleStatus(player);

      Console.WriteLine("0. 취소");
      Console.WriteLine();
      Console.WriteLine("대상을 선택해주세요.");
      Console.WriteLine();

      string Input = Console.ReadLine();
      if (Input == "0") Battle(player);
      else if (Input == "1" && MonsterRend.Count >= 1)
      {
          if(player.Attack(MonsterRend[0]))
          {
              MonsterRend.RemoveAt(0);
          }
      }
      else if (Input == "2" && MonsterRend.Count >= 2)
      {
          if (player.Attack(MonsterRend[1]))
          {
              MonsterRend.RemoveAt(1);
          }
      }
      else if (Input == "3" && MonsterRend.Count >= 3)
      {
          if (player.Attack(MonsterRend[2]))
          {
              MonsterRend.RemoveAt(2);
          }
      }
      else if (Input == "4" && MonsterRend.Count >= 4)
      {
          if (player.Attack(MonsterRend[3]))
          {
              MonsterRend.RemoveAt(3);
          }
      }
      else
      {
          ConsoleManager.RedColor("잘못된 입력입니다 ");
          Console.WriteLine();

      }

      if (MonsterRend.Count == 0)  //몬스터가 모두 죽었다면
      {
          Isrun = true; //반복중지
          Clear(player);
      }

      //몬스터 턴
      if (MonsterRend.Count != 0) MonsterTurn(MonsterRend, player);

      if (player.hp <= 0)
      {
          Isrun = true;
          Fail(player);
      }

  }

}
                        

Player.Attack

public void Attack(Monster mon)
 {
     Console.Clear();
     Random random = new Random();
     //mon.hp
     int minusHP = (int)(atk * (random.NextDouble() * (1.1 - 0.9) + 0.9)); //오차 범위 추가 (10퍼 내외 증감)

     Console.WriteLine();
     Console.WriteLine("{0} 의 공격!", name);
     Console.WriteLine("Lv. " + mon.GetLv().ToString() + mon.GetName() + " 을(를) 맞췄습니다.  [데미지 : {0}]", minusHP);
     Console.WriteLine();
     Console.WriteLine("Lv. " + mon.GetLv().ToString() + mon.GetName());

     //string Input = Console.ReadLine();

     if ((mon.hp - minusHP) <= 0) //죽었을 경우
     {
         Console.WriteLine("HP " + mon.hp.ToString() + " -> Dead");
     }
     else
     {
         Console.WriteLine("HP " + mon.hp.ToString() + " -> " + (mon.hp - minusHP));
     }
     Console.WriteLine();
     Console.WriteLine("0. 다음");

     bool Out = false;
     while (true)
     {
         if (Console.ReadLine() == "0") //실질적으로 hp깍기
         {
             mon.hp -= minusHP;
             break;
         }
         else
         {
             ConsoleManager.RedColor("잘못된 입력입니다 ");
             Console.WriteLine();
         }
     }

 }

Battle() 함수 내에서 player.Attack() 함수를 실행했을 때 보통 player.Attack() 함수 기능을 전부 종료하면 다시 BattleSetting() 에서 남은 아래 줄을 읽기 시작할텐데 전혀 관련이 없는 씬으로 이동하였다.

참고로 이동한 씬은 Battle()함수가 끝나면 돌아가는 함수이다.

결과적으로 해결하긴 했다.

Player.Attack


.../ 생략


bool Out = false;
while (!Out)
{
  if (Console.ReadLine() == "0") //실질적으로 hp깍기
  {
      mon.hp -= minusHP;
      Out = true;
  }
  else
  {
      ConsoleManager.RedColor("잘못된 입력입니다 ");
      Console.WriteLine();
  }
}

if (mon.hp <= 0) return true;
else return false;

break문 대신 bool 변수로 종료조건을 수정하였다.

문제는 왜 해결됬는지 이유를 모르겠다는 것...

처음에는 break문이 break 이후 코드를 읽는 것을 멈추는건가 생각했으나 보통 break는 특정 반복문에서 사용되여 보통 반복문을 빠져나올때 사용한다고 한다. 이것에 대한 의문은 더 찾아봐야 할듯

파일 잠김 오류

빌드 중에 종종 렉이 걸리면서 파일잠김 오류라면서 아래 오류가 뜨게되는 일이 많았었다.

User
심각도	코드	설명	프로젝트	파일	줄	비표시 오류(Suppression) 상태	세부 정보
오류	MSB3027	"C:\SpartaCodingClub\c#문법 종합\팀과제 TextGame\TextRPG_18\TextRPG_18\obj\Debug\net8.0\apphost.exe"을(를) "bin\Debug\net8.0\TextRPG_18.exe"(으)로 복사할 수 없습니다. 재시도 횟수(10)를 초과하여 작업을 수행하지 못했습니다. 파일이 "TextRPG_18 (10120)"에 의해 잠겨 있습니다.	TextRPG_18	C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets	5198	

꽤나 자주 있는 일인데 해결 방법은 간단했다. 해당 파일 내 bin파일과 obj 파일을 삭제하면 되는데 보통 이런 현상이 있을경우 bin파일은 작업상태가 열려 있어서 삭제가 불가능 하다고 뜨게 된다. 때문에 매번 컴퓨터를 재부팅을 하며 문제를 해결했었다.

하지만 이번엔 구체적으로 어떤 파일이 삭제가 안되는지 확인했다. TextRPG_18.exe 실행 파일이 문제였다. 당연히 파일내에서 삭제하려면 작업중인 파일을 삭제 할 수 없다고 뜨기 때문에 작업관리자에서 삭제하려고 했으나, 도저히 실행파일을 찾을 수 없었다.

그렇기에 강제종료를 하기로 했다.

명령프롬프트 taskkill

taskkill /F /IM 프로세스이름.exe 

명령 프롬프트 내에서 위와 같이 입력하면 실행파일을 강제종료 할 수 있다. 이제 더이상 컴퓨터 재부팅 안해도 됨!

&

오늘 한 일

알고리즘 세션 강의 수강

전투 필수구현 완료

void Battle
몬스터 턴 추가
플레이어 실패 판정
플레이어 클리어 판정
콘솔 종료

Class Player
Attack 수정 (+ 몬스터 다이 여부)

Class Monster
몬스터 피격 (+ 추가 공격 여부)

Class ConsoleManager

GreenColor 함수추가

profile
Unity 개발 위주로 정리합니다

0개의 댓글