게임 개발자를 위한 C++ 문법 2-1 ing

1. WHY
- 개념 전체적으로 정리, 과제1 진행하기
2. WHAT
- 클래스 class: 객체를 만들어 내기 위한 틀, 만들어 낼 객체의 속성과 메서드의 집합을 담아놓은 것
- 객체 object: 클래스로부터 만들어지는 실체, 클래스로 선언된 변수
- 인스턴스 instance: 객체가 메모리에 할당된 상태, 런타임에 구동되는 객체, 객체와 같은 의미로 쓰이기도 함
- 힙(동적) 메모리: new -> delete
//변수 동적 할당
void func1() {
int* ptr = new int(10); // 힙 메모리에 정수 10 할당
cout << "Value: " << *ptr << endl;
delete ptr; // 메모리 해제
}
//배열 동적 할당
void func2() {
int* arr = new int[5]; // 힙 메모리에 정수 배열 5개 할당
for (int i = 0; i < 5; ++i) {
arr[i] = i * 10;
cout << "arr[" << i << "] = " << arr[i] << endl;
}
delete[] arr; // 배열 메모리 해제
}
스마트 포인터는 다음 시간에
3. HOW
1단계 : 요구사항 분석 및 설계
정보 입력
int status[5] -> HP, MP, 공격력, 방어력, 레벨 저장
HP/MP 입력 받기 -> 50 이하 -> 다시 입력 -> while
공격/방어력 입력 받기 -> 0 이하 -> 다시 입력 -> while
스탯 관리 시스템
1. HP UP 2. MP UP 3. 공격력 UP 4. 방어력 UP 5. 현재 능력치 6. Level Up 0. 나가기
선택지 출력 -> int로 입력 받기 -> 선택지 실행
함수
void setPotion() //포션 지급 함수 -> 기본 5개 지급
void printSystem() //시스템 선택지 출력
void hpUp() //HP 강화 +20 //포션 -1 ->포션 갯수 체크
void mpUp() //MP 강화 +20 //포션 -1 ->포션 갯수 체크
void atkUp() //공격력 강화 2배
void defUp() //방어력 강화 2배
void printStatus() //상태 출력
void lvUp() //레벨업 //포션 각 +1
2단계 : 코드 작성 및 구현
#include <iostream>
using namespace std;
void setPotion(int count, int* p_HPPotion, int* p_MPPotion) { // 포션 지급 함수, 카운트 만큼 포션 증가
*p_HPPotion += count;
*p_MPPotion += count;
}
void printSystem() {
cout << "1. HP UP" << endl;
cout << "2. MP UP" << endl;
cout << "3. 공격력 UP" << endl;
cout << "4. 방어력 UP" << endl;
cout << "5. 현재 능력치" << endl;
cout << "6. Level UP" << endl;
cout << "0. 나가기" << endl;
}
void hpUp(int& hp, int& po) {
if (po < 1)
{
cout << "포션이 부족합니다." << endl;
return;
}
hp += 20;
po--;
cout << "* HP가 20 증가되었습니다. 포션이 1개 차감됩니다." << endl;
cout << "현재 HP: " << hp << endl;
}
void mpUp(int& mp, int& po) {
if (po < 1)
{
cout << "포션이 부족합니다." << endl;
return;
}
mp += 20;
po--;
cout << "* MP가 20 증가되었습니다. 포션이 1개 차감됩니다." << endl;
cout << "현재 MP: " << mp << endl;
}
void atkUp(int& atk) {
atk *=2;
cout << "* 공격력이 2배로 증가되었습니다." << endl;
cout << "현재 공격력: " << atk << endl;
}
void defUp(int& def) {
def *= 2;
cout << "* 방어력이 2배로 증가되었습니다." << endl;
cout << "현재 방어력: " << def << endl;
}
void printStatus(int(&arr)[5], int& hpp, int& mpp) {
cout << "* HP: " << arr[0] << ", MP: " << arr[1] << ", 공격력: " << arr[2] << ", 방어력: " << arr[3] << endl;
cout << "* Lv: " << arr[4] << ", 남은 HP/MP 포션 수: " << hpp << "/" << mpp << endl;
}
void lvUp(int& lv, int& hpp, int& mpp) {
lv++;
setPotion(1, &hpp, &mpp);
cout << "* 레벨업! HP/MP 포션이 지급됩니다." << endl;
cout<<"남은 HP/MP 포션 수: " << hpp << "/" << mpp << endl;
}
int main() {
int status[5] = { 0,0,0,0,1 }; // HP,MP,공격력,방어력,레벨 초기화
while (status[0] <= 50 || status[1] <= 50) { // HP와 MP를 입력
cout << "HP와 MP를 입력해주세요: ";
cin >> status[0] >> status[1];
if (status[0] <= 50 || status[1] <= 50)
cout << "HP나 MP의 값이 너무 작습니다. 다시 입력해주세요." << endl;
}
while (status[2] <= 0 || status[3] <= 0) { // 공격과 방어를 입력
cout << "공격력과 방어력을 입력해주세요: ";
cin >> status[2] >> status[3];
if (status[2] <= 0 || status[3] <= 0)
cout << "공격력이나 방어력의 값이 너무 작습니다. 다시 입력해주세요." << endl;
}
int HPPotion = 0; // 포션 갯수
int MPPotion = 0;
cout << "* 포션이 지급되었습니다. (HP, MP 포션 각 5개)" << endl;
setPotion(5, &HPPotion, &MPPotion); // 포션 지급
cout << "##############################################" << endl;
cout << "스탯 관리 시스템" << endl;
printSystem();
while (true) {
int num;
cout << "번호를 선택해주세요: ";
cin >> num;
if (num == 0)
{
cout << "프로그램을 종료합니다." << endl;
break;
}
else if (num == 1)
hpUp(status[0], HPPotion);
else if (num == 2)
mpUp(status[1], MPPotion);
else if (num == 3)
atkUp(status[2]);
else if (num == 4)
defUp(status[3]);
else if (num == 5)
printStatus(status, HPPotion, MPPotion);
else if (num == 6)
lvUp(status[4], HPPotion, MPPotion);
else
cout << "잘못된 입력" << endl;
}
return 0;
}
3단계 : 테스트 및 디버깅


> 잘못된 선택지 입력 시 false > false == 0 > 프로그램 종료(0번)로 인식 > 입력 실패 처리 추가
if (cin.fail()) {
cin.clear(); // fail 상태 복구
cin.ignore(1000, '\n'); // 잘못된 입력 버퍼 비우기
cout << "번호를 입력해주세요.\n";
continue;
}
if (!(cin >> num)) {
cout << "출력오류\n";
}
4. RESULT
https://github.com/yoonseo4343/NBC_Cpp_P1
#include <iostream>
using namespace std;
void setPotion(int count, int* p_HPPotion, int* p_MPPotion) { // 포션 지급 함수, 카운트 만큼 포션 증가
*p_HPPotion += count;
*p_MPPotion += count;
}
void printSystem() {
cout << "1. HP UP" << endl;
cout << "2. MP UP" << endl;
cout << "3. 공격력 UP" << endl;
cout << "4. 방어력 UP" << endl;
cout << "5. 현재 능력치" << endl;
cout << "6. Level UP" << endl;
cout << "0. 나가기" << endl;
}
void hpUp(int& hp, int& po) {
if (po < 1)
{
cout << "포션이 부족합니다." << endl;
return;
}
hp += 20;
po--;
cout << "* HP가 20 증가되었습니다. 포션이 1개 차감됩니다." << endl;
cout << "현재 HP: " << hp << endl;
}
void mpUp(int& mp, int& po) {
if (po < 1)
{
cout << "포션이 부족합니다." << endl;
return;
}
mp += 20;
po--;
cout << "* MP가 20 증가되었습니다. 포션이 1개 차감됩니다." << endl;
cout << "현재 MP: " << mp << endl;
}
void atkUp(int& atk) {
atk *=2;
cout << "* 공격력이 2배로 증가되었습니다." << endl;
cout << "현재 공격력: " << atk << endl;
}
void defUp(int& def) {
def *= 2;
cout << "* 방어력이 2배로 증가되었습니다." << endl;
cout << "현재 방어력: " << def << endl;
}
void printStatus(int(&arr)[5], int& hpp, int& mpp) {
cout << "* HP: " << arr[0] << ", MP: " << arr[1] << ", 공격력: " << arr[2] << ", 방어력: " << arr[3] << endl;
cout << "* Lv: " << arr[4] << ", 남은 HP/MP 포션 수: " << hpp << "/" << mpp << endl;
}
void lvUp(int& lv, int& hpp, int& mpp) {
lv++;
setPotion(1, &hpp, &mpp);
cout << "* 레벨업! HP/MP 포션이 지급됩니다." << endl;
cout<<"남은 HP/MP 포션 수: " << hpp << "/" << mpp << endl;
}
int main() {
int status[5] = { 0,0,0,0,1 }; // HP,MP,공격력,방어력,레벨 초기화
while (status[0] <= 50 || status[1] <= 50) { // HP와 MP를 입력
cout << "HP와 MP를 입력해주세요: ";
cin >> status[0] >> status[1];
if (status[0] <= 50 || status[1] <= 50)
cout << "HP나 MP의 값이 너무 작습니다. 다시 입력해주세요." << endl;
}
while (status[2] <= 0 || status[3] <= 0) { // 공격과 방어를 입력
cout << "공격력과 방어력을 입력해주세요: ";
cin >> status[2] >> status[3];
if (status[2] <= 0 || status[3] <= 0)
cout << "공격력이나 방어력의 값이 너무 작습니다. 다시 입력해주세요." << endl;
}
int HPPotion = 0; // 포션 갯수
int MPPotion = 0;
cout << "* 포션이 지급되었습니다. (HP, MP 포션 각 5개)" << endl;
setPotion(5, &HPPotion, &MPPotion); // 포션 지급
cout << "##############################################" << endl;
cout << "스탯 관리 시스템" << endl;
printSystem();
while (true) {
int num;
cout << "번호를 선택해주세요: ";
cin >> num;
if (cin.fail()) {
cin.clear(); // fail 상태 복구
cin.ignore(1000, '\n'); // 잘못된 입력 버퍼 비우기
cout << "번호를 입력해주세요.\n";
continue;
}
if (num == 0)
{
cout << "프로그램을 종료합니다." << endl;
break;
}
else if (num == 1)
hpUp(status[0], HPPotion);
else if (num == 2)
mpUp(status[1], MPPotion);
else if (num == 3)
atkUp(status[2]);
else if (num == 4)
defUp(status[3]);
else if (num == 5)
printStatus(status, HPPotion, MPPotion);
else if (num == 6)
lvUp(status[4], HPPotion, MPPotion);
else
cout << "잘못된 입력" << endl;
}
return 0;
}
5. NEXT
구글 가이드 맞추기..
6. 참고
https://blog.naver.com/techref/223795571598
Mouse Without Borders 다운로드 사용법 : 무료로 여러 PC를 연결하는 방법
하나의 키보드와 마우스로 여러 대의 컴퓨터를 자유롭게 제어할 수 있다면 얼마나 편리할까요? 듀얼 컴퓨터...
blog.naver.com
하나의 키보드와 마우스로 여러 대의 컴퓨터 제어하는 방법
Is-a, Has-a의 개념 차이 > Is-a: 상속 관계 > Has-a: 포함 관계
class Base final {
};
> 상속을 못함
class Base {
public:
virtual void func();
};
class Child : public Base {
public:
void func() final; // 여기서 override는 가능
};
class GrandChild : public Child {
public:
void func(); // ❌ Child에서 final 했기 때문에 override 불가
};
> 상속받은 클래스에서 해당 가상 함수를 더 이상 override 못하게 막음
Adventurer* p = new Warrior();
p->attack(); // Warrior 버전이 호출
> p는 Adventurer* 타입이지만 vptr이 Warrior의 vtable을 가리키고 있으므로 Warrior의 attack()이 호출됨.
'내배캠Unreal_TIL > C++' 카테고리의 다른 글
| [TIL] 2025-12-16 | C++ STL, vector, map, sort(), find(), Iterator (2) | 2025.12.16 |
|---|---|
| [TIL] 2025-12-15 | C++ 스마트 포인터, 템플릿 (0) | 2025.12.15 |
| [C++] Google C++ Style Guide, 구글 코드 컨벤션 (1) | 2025.12.11 |
| [TIL] 2025-12-11 | C++ 객체지향 프로그래밍, 상속과 다형성 (0) | 2025.12.11 |
| [TIL] 2025-12-10 | C++ 포인터와 레퍼런스, 클래스와 생성자 익히기, 멤버 초기화 리스트 (0) | 2025.12.10 |