[TIL] 23-12-20

Lev·2023년 12월 20일
0

📓TIL Archive

목록 보기
8/33

Text RPG

💡 콘솔
DOS (Disk Operating System)

  • 다른 운영체제가 없던 시절의 OS
  • 콘솔창 기반이다.

콘솔창

  • VS에서 F5를 눌렀을 때, 내 프로그램이 콘솔창에 명령을 내리는 것이다.
  • 콘솔창에서 사용하는 명령어들도 다 어딘가에 존재하는 프로그램이다. e.g. dir, cls
#include <iostream>
#include <conio.h>	// _getch()를 사용하기 위해

// 보여주기만 하는 함수이기 때문에, 변경되지 말아야 할 변수는 const로 선언
void StatusRender(const char* _Name, int _Hp, int _Att)
{
	int Size = printf_s("%s", _Name);	// %s => 문자열
	// int Size = StringCount(_Name);
	// int Size = static_cast<int>(strlen(_Name));
	// 다 같은 의미... 이지만 printf_s를 활용하는 것이 아이디어가 좋다

	for (int i = 0; i < 50 - Size; i++)
	{
		int a = 0;
		printf_s("-");
	}

	printf_s("\n");	// (1)
	printf_s("공격력 %d\n", _Att);
	printf_s("체력 %d\n", _Hp);

	for (int i = 0; i < 50; i++)
	{
		printf_s("-");
	}

	printf_s("\n");
}

// 데이터적으로 실제 데미지를 주는 함수 (3)
void DamageLogic(const int& _Att, int& _DefHp)
{
	_DefHp -= _Att;	// 축약연산자 (2)
}

// 화면에 공격 행동을 렌더링하는 함수 (3)
void DamageRender(const char* _Name, const int& _Att)
{
	printf_s("%s 가 %d의 공격력으로 공격했습니다.\n", _Name, _Att);
}

/*
// 두 함수를 합쳐서 사용하는 것도 가능하다
void Damage(const char* _Name, const int& _Att, int& _DefHp)
{
	DamageLogic(_Att, _DefHp);
	DamageRender(_Name, _Att);
}
*/

int main()
{
	// 존재하게 하기 위해 상태를 설정
	char PlayerName[100] = "Fighter";
	int PlayerHp = 100;
	int PlayerAtt = 10;

	char MonsterName[100] = "Orc";
	int MonsterHp = 50;
	int MonsterAtt = 5;

	// 게임의 main 루프 => 여기서 모든 일이 일어난다!
	// 한번의 루프가 도는 것 : 프레임
	while (true)
	{
		// 눈에 보이게 하기 위해 출력
		StatusRender(PlayerName, PlayerHp, PlayerAtt);
		StatusRender(MonsterName, MonsterHp, MonsterAtt);

		{
			int Input = _getch();	// 아무 키를 입력할 때까지 기다리는 함수
		}

		DamageLogic(PlayerAtt, MonsterHp);

		system("cls");	// 콘솔창에 명령을 요청하는 함수
		StatusRender(PlayerName, PlayerHp, PlayerAtt);
		StatusRender(MonsterName, MonsterHp, MonsterAtt);
		DamageRender(PlayerName, PlayerAtt);
		
		{
			int Input = _getch();
		}

		DamageLogic(MonsterAtt, PlayerHp);

		system("cls");
		StatusRender(PlayerName, PlayerHp, PlayerAtt);
		StatusRender(MonsterName, MonsterHp, MonsterAtt);
		DamageRender(PlayerName, PlayerAtt);
		DamageRender(MonsterName, MonsterAtt);
		
		{
			int Input = _getch();
		}

		system("cls");
	}
}

\ 특수문자를 통해 특수한 출력기호 사용 가능 (1)

  • \n ⇒ 줄을 바꾸라는 의미 (한 글자로 본다)

축약 연산자 (2)

  • 사칙연산, 비트단위 등 거의 모든 연산자로 가능

렌더링과 로직 함수는 분리되는 것이 좋다 (3)

  • 한 함수는 두가지 이상의 목적을 가지면 안되기 때문
  • 굳이 하나로 합치고 싶다면, 한 개의 목적을 가진 함수를 두 개 모아서 만드는 것이 유리하다.

난수

정의되지 않은 수가 나오는 것… 이지만

  • 실제론 시드값이라는 특정 값을 정해진 복잡한 공식에 따라 변형시킨 수가 나오는 것
  • 따라서 시드값이 바뀌어야 결과값도 바뀐다.
  • 주로 현재 시간, 변수의 주소 등 프로그램을 실행할 때마다 달라지는 값을 시드값으로 사용한다.
#include <iostream>

/*
int Random = 0;	// 난수의 시드값

void SeedChange(int _Value)	// srand() 역할
{
	Random = _Value;
}

int Randomint()	// rand() 역할
{
	return ++Random;
}
*/

int main()
{
	int Value = 0;
	__int64 Address = reinterpret_cast<__int64>(&Value);

	srand(Address);	// srand() : 시드값을 설정하는 함수
	// Value 변수가 메모리 상에 위치한 주소를 시드값으로 사용
	
	for (int i = 0; i < 5; i++)
	{
		int Number = rand();	// rand() : 특정 공식에 따라 난수를 생성하는 함수
		// 따로 설정하지 않으면, 시드값 1에 따른 난수를 반환한다
		printf_s("%d\n", Number);
	}

	return 0;
}

자료형 (이어서)

unsigned

signed int
0b 0 0000000 00000000 00000000 00000000

  • signed ⇒ 부호비트를 사용하겠다는 뜻
  • int에서 맨 앞의 부호비트는 부호를 결정하는데에 사용된다.
  • 따라서, 2^31 - 1 까지의 양수와, 2^31 만큼의 음수를 표현할 수 있다.

unsigned int
0b 00000000 00000000 00000000 00000000

  • unsigned ⇒ 부호비트를 사용하지 않겠다는 뜻
  • 2^32 -1 까지의 양수를 표현할 수 있다.
int main()
{
    signed int Value = -1;
		// int에는 사실 unsigned가 생략되어 있었던 것

    unsigned int UValue = -1;    // 4294967295
		// 음수가 되는 것이 아니라, 맨 앞 비트도 값을 표현하는 데에 사용되어 2^32 - 1 이 된다
}

typedef

자료형에 별명 붙이기

typedef unsigned int uint;

typedef uint pint;

typedef pint dint;
// uint pint dint 모두 다 같은 자료형을 의미한다(...)

// typedef unsigned int* puint;
// 이런식으로...도 사용 가능하지만 사용하지 않는게 좋을 것 같다

int main()
{
    uint Value = 20;    // 컴파일러가 uint를 unsigned int로 치환시킨다
}

size_t

unsigned __int64를 typedef로 이름붙인 것

  • 하지만 최대값이 18446744073709551615인 만큼, for문을 돌릴 때 굳이 사용할 필요는… 없다.

📢 기억해두면 좋은 VS단축키 & 정보

  • Shift + Up or Down ⇒ 드래그와 같은 효과
  • 범위 선택 + Alt + Up or Down ⇒ 범위 통째로 윗줄 또는 아랫줄로 이동
  • Ctrl + K+ C ⇒ 주석
  • 파일명 위에 커서 + Ctrl + Shift + G ⇒ 파일 열기?(iostream과 같은 파일 내용 확인 가능)
  • Ctrl + A ⇒ 문서 코드 전체 선택
  • Ctrl + K + F ⇒ 자동 줄맞춤
  • 자료형 또는 함수 클릭 + F12 ⇒ 선언한 곳으로 이동
    (VS를 다시 켠 이후에는 링크를 생성 중이라 느릴 수 있다)

OOP : 객체지향프로그래밍

객체(Object)라는 개념만을 사용해서 코딩하는 것

  • 프로그래밍 패러다임 중 한가지 종류
  • C++은 사실 멀티패러다임 언어이다. (절차지향, 객체지향, 템플릿메타, 함수형? 등…)
  • 객체지향은 기본은 private함에 있으므로, 전역을 지양하고 모든 것을 개념 안에 묶어야 한다.
  • 객체 = 개념이 메모리화된 것
// 사용자 정의 자료형
// class = 개념을 만들겠다는 뜻
class Monster	// 개념
{
	// 상태
	char Name[100];
	int Hp;
	int Att;
	int Speed;
	
	// 행동
	void Att(int& _OtherHp);
	void Damage(int _Att);
	void SatusRender();
};

int main()
{
	// 자료형 == 개념
	int;	// 개념만으로는 아무것도 할 수가 없다
	int A = 0;	// 개념을 A라는 객체로 메모리화하면 사용할 수 있다

	Monster NewMonster = Monster();	// 객체화
	int NewInt = int(); // 사실 int도 class처럼 초기화할 수 있다
    // int가 실제로 어떻게 구성되어 있는지는 알 수 없으나,
    // 유사한 형태이므로 int를 기반으로 class를 설명할 수 있다
}
profile
⋆꙳⊹⋰ 𓇼⋆ 𝑻𝑰𝑳 𝑨𝑹𝑪𝑯𝑰𝑽𝑬 ⸝·⸝⋆꙳⊹⋰

0개의 댓글