Unreal 개발 본 캠프 22일차

HappyCircle·2025년 12월 29일

Unreal 개발

목록 보기
39/163

오늘 학습 진행 내용

C++ 복습 반복 타이핑

포인터 관련 부분 활용 실습 반복 타이핑 개념 복습 진행

#include <iostream>
using namespace std;
//1단계: 주소 추출 (& 연산자)
void print_num_reference(int& number) {
	cout << &number << endl;
};

void print_ch_reference(char& ch) {
	std::cout << &ch << endl;
};

void print_ll_reference(long long& number) {
	cout << &number << endl;
};

void print_double_reference(double& number) {
	cout << &number << endl;
};

void print_bool_reference(bool& boolean) {
	cout << &boolean << endl;
};
// 주소값 연결 (= &)
void connect_address(int num, int* ptr) {
	ptr = &num;
}

int main() {
	//1단계: 주소 추출 (& 연산자)
	int num = 10;
	print_num_reference(num);

	double pi = 3.14;
	print_double_reference(pi);

	int age = 20;
	print_num_reference(age);

	long long big = 10000;
	print_ll_reference(big);

	bool check = true;
	print_bool_reference(check);

	//2단계: 포인터 변수 선언(*연산자)
	int* ptr;
	double* d_ptr;
	char* ch_ptr;
	bool* b_ptr;
	int* number_pointer;

	cout << sizeof(num) << endl; //4바이트
	cout << sizeof(number_pointer) << endl; //8바이트

	//3단계: 주소값 연결 (= &)
	num = 10;
	connect_address(num, ptr);
	cout << *ptr << endl;

	pi = 3.14;
	double* dd_ptr;
	dd_ptr = &pi;

	char ch = 'A';
	char* cp;
	cp = &ch;

	bool flag = true;
	bool* bp = &flag;

	int myAge = 30;
	int* pAge = &myAge;

	int number = 100;
	int* p;
	p = &number;

	long long bigData = 9999;
	long long* lp = &bigData;

	int target = 7;
	ptr = &target;
	cout << &target << endl;
	cout << ptr << endl;

	//4단계: 타입 일치 (Type Matching)
	int score = 100;
	int* p_score;
	p_score = &score;
	
	float rate = 5.5;
	// int* p_rate = &rate; 이거는 잘못된 타입 연결로 에러 발생 코드
	float* p_rate = &rate;

	char grade = 'A';
	char* p_grade = &grade;

	//double* p = &num; 잘못된 타입 연결로 에러 발생 코드

	//5단계: 값 읽기 (Dereference, 역참조)
	number = 50;
	p = &number;
	cout << *p << endl;
}

주소 추출 (& 연산자) 함수로 처리

#include<iostream>
using namespace std;
template<typename T>
void setValue(T* value1,T value2) {
	if (value1 == nullptr) {
		return;
	}
	*value1 = value2;
}

template<typename T>
void setAddress(T* ptr, T origin) {
	if (ptr == nullptr) {
		return;
	}
	ptr = &origin;
}

void setPI(float* pi) {
	if (pi == nullptr) {
		return;
	}
	*pi = 3.14;
}

void ShowAddress(float* pi) {
	cout << pi << endl;
}

int main() {
	float PI;
	char ch;
	int* ptr = nullptr;
	double* d_ptr = nullptr;
	char* cp = nullptr;
	bool* bp = nullptr;
	bool flag = true;

	setPI(&PI);
	ShowAddress(&PI);

	setValue(&PI, (float) 3.14);
	setValue(&ch, 'A');
	setValue(&flag, true);
	setAddress(d_ptr,(double)PI);
	setAddress(cp, ch);
	setAddress(bp, flag);
	return 0;

}

주소값 연결 (= &) 함수로 처리

#include <iostream>
using namespace std;
void SetAge(int* ptr) {
	if (ptr == nullptr) {
		return;
	}
	*ptr = 20;
}

void ShowIntAddress(int* ptr) {
	if (ptr == nullptr) {
		return;
	}
	cout << ptr << endl;
}

void ShowIntValueFromAddress(int* ptr) {
	if (ptr == nullptr) {
		return;
	}
	cout << *ptr << endl;
}

template<typename T>
void ShowValueFromAddress(T* ptr) {
	cout << *ptr << endl;
}

void ConnectIntToPointer(int& num, int*& ptr) { //포인터 초기화되지 않은 변수  해결 위해서 포인터 값을 대입만 처리 (int* p; p=&value; 형태)
	ptr = &num;

}
int main() {
	int age = 0;
	SetAge(&age);
	ShowIntAddress(&age);
	ShowIntValueFromAddress(&age);

	float pi = 3.14;
	char ch = 'A';
	ShowValueFromAddress(&pi);
	ShowValueFromAddress(&ch);

	int* p;
	int number = 50;
	ConnectIntToPointer(number, p);
	cout << *p << endl;
	return 0;
}

포인터, 참조 활용 스왑 구현

#include <iostream>
using namespace std;

void Swap(int* a, int* b) {
	if (a == nullptr || b == nullptr) {
		return;
	}
	int temp = *a;
	*a = *b;
	*b = temp;
}
void SwapReference(int& a, int& b) {
	int temp = a;
	a = b;
	b = temp;
}

void SwapPtrReference(int* a, int& b) {
	if (a == nullptr) {
		return;
	}
	int temp = *a;
	*a = b;
	b = temp;
}

int main() {

	int a = 10;
	int b = 20;
	int c = 30;
	int d = 40;
	int e = 50;
	int f = 60;

	Swap(&a, &b);
	SwapReference(c, d);
	SwapPtrReference(&e, f);

	cout << a << endl; // a=20
	cout << b << endl; // b=20
	cout << c << endl; // c=40
	cout << d << endl; // d=30
	cout << e << endl; // e=60
	cout << f << endl; // f=50
}

팀프로젝트 발제

[CH2: 팀 프로젝트] 텍스트 콘솔 RPG

발제 설명

여러분들은 팀원분들과 텍스트 기반의 콘솔 RPG 게임을 제작합니다.
CH2 게임 개발자를 위한 C++ 문법 과정에서 익힌 내용을 바탕으로 개발합니다.

플레이

  • 몬스터와 전투를 할 수 있습니다.
  • 상점을 이용할 수 있습니다.

전투

  • 턴 방식으로 몬스터와 전투를 벌입니다.
  • 플레이어와 몬스터 모두 각 턴에 자동으로 행동을 결정합니다.
  • 플레이어는 ‘공격’ 혹은 ‘아이템 사용’ ****행동이 가능합니다.

승리

  • 전투에서 승리하면 골드와 경험치를 얻습니다.
  • 경험치는 레벨업을 하는데 사용합니다.
  • 골드는 상점에서 아이템을 구매하는데 사용합니다.

보스

  • 주인공 레벨이 10이 되면, 보스 몬스터와 마지막 전투를 진행합니다.
  • 승리할 경우 게임의 엔딩이 진행됩니다!

구현

  • 필수 기능을 만들어주세요.
  • 도전 기능을 만들어주세요.
  • 이외의 기능은 자유롭게 구현해주세요.

필수 기능 가이드
1. 플레이어 캐릭터 생성

  • 플레이어는 캐릭터 생성시 이름을 설정 할 수 있습니다.
  • 캐릭터는 레벨 1, 초기 체력 200, 공격력 30, 경험치 0으로 시작합니다.
  • 각 레벨업에 필요한 경험치는 100으로 동일합니다.
  • 게임 플레이 중,언제든지 캐릭터 상태 확인할 수 있어야 합니다.

2. 몬스터

  • 몬스터도 이름, 체력, 공격력을 가집니다.
  • 몬스터의 스탯은 캐릭터 레벨에 비례해서 랜덤하게 설정합니다.
    • 체력: (레벨 × 20) ~ (레벨 × 30)
    • 공격력: (레벨 × 5) ~ (레벨 × 10)

3. 전투 시스템

  • 랜덤으로 난입하는 몬스터와 턴제로 싸웁니다.
  • 전투 시작 조건은 다음과 같아요.
    • 캐릭터 생성 직후,
    • 전투 승리 후 상점 방문을 스킵한 경우,
    • 상점 이용 후 다시 전투가 시작됩니다.
  • 전투에서 승리하면 다음과 같은 보상을 받습니다.
    • 경험치는 50을 획득합니다.
    • 골드는 10~20을 랜덤으로 획득합니다.
    • 30% 확률로 아이템이 떨어집니다.
  • 경험치가 100이상이 되면 레벨업을 합니다.

4. 레벨업

  • 레벨이 오를 때마다 체력과 공격력이 상승합니다.
  • 체력: (현재 체력 + (레벨 × 20))
  • 공격력: (현재 공격력 + (레벨 × 5))
  • 이후, 최대치까지 체력을 회복합니다.
  • 최대 레벨은 10으로 제한합니다.

5. 아이템

  • 아이템은 체력 +50(vhtus 또는 공격력 +10을 증가시킵니다.
  • 플레이어 캐릭터는 전투 중에 아이템을 랜덤하게 사용됩니다.
  • 아이템을 사용하는 조건은 자유롭게 설정해주세요.
  • 아이템은 사용 순간 사라지고, 효과는 바로 캐릭터에게 반영됩니다.

6. 게임 로그 확인

  • 공격, 피해, 아이템 사용, 골드 획득 등 중요한 이벤트는 콘솔에 나열하여 표시합니다.
  • 로그를 통해 오늘 어떤 몬스터를 얼마나 잡았는지 한 눈에 확인 가능해야 합니다.

도전 기능 가이드
1. 몬스터 보스전

  • 레벨 10 달성 시, “이제 일반 몬스터는 상대도 안 된다!” 라는 메시지를 출력하세요.
  • “보스 몬스터”가 등장합니다! 별도의 연출을 넣어주어도 좋습니다.
  • 보스의 스탯은 기존 몬스터의 1.5배 범위를 랜덤으로 설정합니다.
  • 보스를 클리어하면 게임 엔딩을 진행해요.

2. 상점 시스템

  • 전투가 끝나면 플레이어에게 상점을 입장할 것인지 물어보세요.
  • 상점에서는 골드로 아이템을 구매/판매 가능해요.
  • 아이템 구매
    • 골드를 사용해서 아이템을 구매할 수 있어요.
    • 구매 아이템은 인벤토리에 즉시 추가됩니다.
  • 아이템 판매
    • 보유한 아이템을 골드로 판매할 수있어요.
    • 판매 가격은 구입 원가의 60%입니다.
    • 판매된 아이템은 인벤토리에서 즉시 제거되요.
  • 아이템 목록은 자유롭게 제작할 수 있습니다.
  • 아이템은 가격이 정해져 있어야 합니다. 유동적으로 변할 수 없어요.

오늘 팀프로젝트 진행 내용
프로젝트 진행 계획 및 프로젝트 진행 일정 중 스케줄 정리
10:00~10:30 오늘 진행 계획 공유 및 진행 사항 공유
20:30~21:00 오늘 진행 사항 공유 및 피드백 진행

12/29 - 프로젝트 진행 아이디어 발제(구현하고 싶은 기능 아이디어 공유, 어떤 기능들이 필요한지에 대해서 논의)

profile
개발합시다!

0개의 댓글