오븐 노트

[C++] 포인터 실습 본문

Develop/C++

[C++] 포인터 실습

오 븐 2022. 7. 5. 07:29
#include <iostream>
using namespace std;

struct StatInfo
{
	int hp; // +0
	int attack; // +4
	int defence; //+8
};

void EnterLobby();
StatInfo CreatePlayer(); // 포인터x
void CreateMonster(StatInfo* info); // 포인터o
// player 승리 시 true 패배시 false
bool StartBattle(StatInfo* player, StatInfo* monster);

int main()
{
	EnterLobby();

	return 0;
}

void EnterLobby()
{
	cout << "로비에 입장했습니다" << endl;

	StatInfo player; // 포인터x
	player.hp = 0xbbbbbbbb;
	player.attack = 0xbbbbbbbb;
	player.defence = 0xbbbbbbbb;
	// 스택 프레임
	// [매개변수][RET][지역변수(temp(c, c, c))] CreatePlayer[매개변수][RET][지역변수]
	// [매개변수][RET][지역변수(temp(c, c, c), player(b, b, b))] CreatePlayer[매개변수][RET][지역변수]
	// [매개변수][RET][지역변수(temp(c, c, c), player(b, b, b))] CreatePlayer[매개변수(&temp)][RET][지역변수]
	// [매개변수][RET][지역변수(temp(c, c, c), player(b, b, b))] CreatePlayer[매개변수(&temp)][RET][지역변수(ret(100, 10, 2))]
	// [매개변수][RET][지역변수(temp(100, 10, 2), player(b, b, b))] CreatePlayer[매개변수(&temp)][RET][지역변수(ret(100, 10, 2))]
	// [매개변수][RET][지역변수(temp(100, 10, 2), player(100, 10, 2))] CreatePlayer[매개변수(&temp)][RET][지역변수(ret(100, 10, 2))]
	// 실제 mmorpg의 경우, info가 수천 바이트에 달할수 있는데 이때 이런식의 연산이 반복된다면 성능적인 부하가 올 수 있다.
	player = CreatePlayer();

	StatInfo monster; // 포인터o
	monster.hp = 0xbbbbbbbb;
	monster.attack = 0xbbbbbbbb;
	monster.defence = 0xbbbbbbbb;
	// [매개변수][RET][지역변수(monster(b, b, b))] CreateMonster[매개변수(&monster)][RET][지역변수()]
	// [매개변수][RET][지역변수(monster(40, 8, 1))] CreateMonster[매개변수(&monster)][RET][지역변수()]
	// 포인터이기 때문에 원본으로 작업되어서 어셈블리 기준 비교적 효율 매우 좋음
	CreateMonster(&monster);

	bool victory = StartBattle(&player, &monster);

	if (victory)
		cout << "승리!" << endl;
	else
		cout << "패배!" << endl;

	// 구조체끼리 복사할 경우
	// player.hp = monster.hp;
	// player.attack = monster.attack;
	// player.defence = monster.defence;
	// 아래 주석이 위 주석과 같으므로 mmorpg에서의 구조체 복사는 부하가 올 수 있다.
	// player = monster;
}


StatInfo CreatePlayer()
{
	StatInfo ret;

	cout << "플레이어 생성" << endl;

	ret.hp = 100;
	ret.attack = 10;
	ret.defence = 2;

	return ret;
}

void CreateMonster(StatInfo* info)
{
	cout << "몬스터 생성" << endl;

	info->hp = 40;
	info->attack = 8;
	info->defence = 1;
}

bool StartBattle(StatInfo* player, StatInfo* monster)
{
	while (true)
	{
		int damage = player->attack - monster->defence;
		if (damage < 0)
			damage = 0;

		monster->hp -= damage;
		if (monster->hp < 0)
			monster->hp = 0;

		cout << "몬스터 HP : " << monster->hp << endl;

		if (monster->hp == 0)
			return true;

		damage = monster->attack - player->defence;
		if (damage < 0)
			damage = 0;

		cout << "플레이어 HP : " << player->hp << endl;

		player->hp -= damage;
		if (player->hp < 0)
			player->hp = 0;

		if (player->hp == 0)
			return false;
	}
}

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
 
C++ 카테고리의 글은 인프런 Rookiss님의 강의를 공부하며 정리하는 내용입니다.
이미 알고 있는 내용도 다시 정리 되어있을 수 있습니다.

 

모든 글은 제가 공부하기 위해 작성합니다.

'Develop > C++' 카테고리의 다른 글

[C++] 포인터 vs 참조  (0) 2022.07.10
[C++] 참조 기초  (0) 2022.07.10
[C++] 포인터 연산  (0) 2022.07.01
[C++] 포인터 기초 #2  (0) 2022.07.01
[C++] 포인터 기초 #1  (0) 2022.06.30