💡 콘솔
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;
}
signed int
0b 0 0000000 00000000 00000000 00000000
unsigned int
0b 00000000 00000000 00000000 00000000
int main()
{
signed int Value = -1;
// int에는 사실 unsigned가 생략되어 있었던 것
unsigned int UValue = -1; // 4294967295
// 음수가 되는 것이 아니라, 맨 앞 비트도 값을 표현하는 데에 사용되어 2^32 - 1 이 된다
}
자료형에 별명 붙이기
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로 치환시킨다
}
unsigned __int64
를 typedef로 이름붙인 것
📢 기억해두면 좋은 VS단축키 & 정보
- Shift + Up or Down ⇒ 드래그와 같은 효과
- 범위 선택 + Alt + Up or Down ⇒ 범위 통째로 윗줄 또는 아랫줄로 이동
- Ctrl + K+ C ⇒ 주석
- 파일명 위에 커서 + Ctrl + Shift + G ⇒ 파일 열기?(iostream과 같은 파일 내용 확인 가능)
- Ctrl + A ⇒ 문서 코드 전체 선택
- Ctrl + K + F ⇒ 자동 줄맞춤
- 자료형 또는 함수 클릭 + F12 ⇒ 선언한 곳으로 이동
(VS를 다시 켠 이후에는 링크를 생성 중이라 느릴 수 있다)
객체(Object)라는 개념만을 사용해서 코딩하는 것
// 사용자 정의 자료형
// 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를 설명할 수 있다
}