간단한 프로그램

던전에서 몬스터 잡는 게임 구현하기

c++을 이용해서 간단하게 만드는 텍스트 프로그램형 게임이다.

 

- 몬스터의 수를 랜덤으로생성 (3~5)한후 50프로의 확률로 방마다 생성 할지 말지 결정한다.

 

- 몬스터를 생성하지않으면 ' ' 생성하면 'M' 로 표현한다.

 

- 공격기술은 가위바위보형태를 만들어서 같은기술일경우 무효화 

- 그외에는 기술간 차이로 이기게 구현한다.

 

- 필살기는 상대가 뭘내든 상관없이 무조건 이기는 형태로 만든다.

 

- 이길경우 레벨과 현레벨만큼 스킬포인트를 받는다.

 

- 받은 스킬포인트는 기술공격력을 올리거나 크리티컬 혹은 회피율을 올린다.

 

- 스킬을 올리고 난이후 방에서 쉴지 다음방으로 이동할지 결정할수있다.

// Acedemy_20210607_Game.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//

#include <iostream>
#include <Windows.h>
using namespace std;

int randNum(int min, int max);

enum monsterStat { HP, MP, Damage };

int lastDungeonIndex = 0;
string boader = "=";
string wall = "|";
bool monsterExist[20] = {};
static const char* Skill[] = { "파이어볼", "아이스 블래스터", "썬더 스트라이크" };

int skillDamage[] = { 10, 10, 10 };
void DungeonMaker();
void DungeonDraw();
int SpecialDamage();
bool randBool(int percent);

struct Unit {
	string name;
	int HP;
	int damage;

	void Initiate(int levelIndex, string monsterName[]) {
		HP = randNum(10 + levelIndex * 10, 20 + levelIndex * 15);
		damage = randNum(5 + levelIndex * 5, 15 + levelIndex * 5);
		name = monsterName[levelIndex];
	}
};

struct PlayerUnit : public Unit
{
	int MP;
	int critical;
	int level;
	int douge;
	int skillPoint;

	void Initiate() {
		HP = 50;
		MP = 30;
		critical = 20;
		level = 1;
		douge = 20;
		skillPoint = 0;
	}
};



int main()
{
	PlayerUnit player;
	player.Initiate();
	string monsterName[5] = { "고블린", "오크", "트롤", "엘프", "헬하운드" };
	Unit monster[5] = {};

	cout << "던전에 입장했다" << endl;
	srand((int)time(NULL));
	int monsterCount = randNum(1, 5);
	for (size_t i = 0; i < monsterCount; i++)
	{
		monster[i].Initiate(i, monsterName);
	}

	int tempMonsterCount = monsterCount;

	for (size_t i = 0; i < 20; i++)
	{
		if (tempMonsterCount == 0)
		{
			lastDungeonIndex = i;
			break;
		}
		if (rand() % 2 == 0)
		{
			monsterExist[i] = true;
			tempMonsterCount--;

		}
	}

	cout << "해당 던전에는 " << monsterCount << "의 수만큼의 몬스터가 존재한다" << endl;
	cout << "방을 돌아 모든 몬스터를 처치 하라" << endl;
	DungeonMaker();

	int playerIndex = 0;
	int currentlyMonsterIndex = 0;
	wall[playerIndex * 5 + 1] = 'P';
	bool isAlive = true;
	//int skillPoint = 0;
	while (isAlive && monsterCount > 0)
	{
		cout << "플레이어의 현재 체력/마력은 " << player.HP << "/" << player.MP << "입니다.." << endl;
		Sleep(1000);
		wall[playerIndex * 5 + 1] = 'P';
		DungeonDraw();
		if (wall[playerIndex * 5 + 4] == 'M')
		{
			cout << "해당 방에는 몬스터가 존재합니다. 전투모드에 진입하겠습니다." << endl;
			cout << monster[currentlyMonsterIndex].name << "를(을) 만났다" << endl;
			while (monster[currentlyMonsterIndex].HP > 0 && player.HP > 0)
			{
				cout << "플레이어 HP: " << player.HP << " /MP: " << player.MP << endl;
				cout << monster[currentlyMonsterIndex].name << " HP: " << monster[currentlyMonsterIndex].HP << endl;
				int playerInput, computerInput;
				cout << "당신의 기술을 선택하세요 (1: " << Skill[0] << ", 2: " << Skill[1] << ", 3 : " << Skill[2] << " 4 : 콤보 블러스터 5: 설명) : ";
				cin >> playerInput;
				computerInput = rand() % 3;
				cout << endl;
				playerInput--;
				if (playerInput < 0 || playerInput > 4)
				{
					cout << "해당 입력값에 대응하는 기술이 없습니다 1 2 3중 하나를 입력해주세요." << endl;
					continue;
				}

				if (playerInput == 3)
				{
					if (player.MP >= 20)
					{
						cout << "              콤보 블러스트         " << endl;
						Sleep(500);
						cout << "대충 효과음 1" << endl;
						Sleep(500);
						cout << "대충 효과음 2" << endl;
						Sleep(500);
						cout << "대충 효과음 3" << endl;
						Sleep(1000);
						monster[currentlyMonsterIndex].HP -= SpecialDamage();
						cout << monster[currentlyMonsterIndex].name << "의 체력은 " << SpecialDamage() << "만큼 감소하였습니다.현재 몬스터의 체력은 "
							<< monster[currentlyMonsterIndex].HP << "입니다" << endl;
						player.MP -= 20;
						cout << "당신의 마나는 현재 " << player.MP << "입니다" << endl;
						continue;
					}
					else {
						cout << "마나가 부족합니다" << endl;
					}

				}
				else if (playerInput == 4) {
					cout << Skill[0] << "은 " << Skill[1] << "을 이기고 " << endl;
					cout << Skill[1] << "은 " << Skill[2] << "을 이기고 " << endl;
					cout << Skill[2] << "은 " << Skill[0] << "을 이깁니다 " << endl;
					cout << "콤보블러스터는 상대가 뭐든 상관없이 이깁니다 대신 마나를 10 소비합니다." << endl;
					continue;
				}
				int result = playerInput - computerInput;

				cout << "당신의 기술은 " << Skill[playerInput] << " 이며 " << monster[currentlyMonsterIndex].name << "의 기술은 " << Skill[computerInput] << " 입니다 " << endl;
				if (result == 0)
				{
					cout << endl;
					Sleep(500);
					cout << "대충 효과음 1" << endl;
					Sleep(1000);
					cout << endl;
					cout << "서로 상쇄되었습니다." << endl;
				}
				else if (result == -1 || result == 2) {
					cout << endl;
					Sleep(500);
					cout << "대충 효과음 1" << endl;
					Sleep(1000);
					cout << endl;

					if (randBool(player.douge))
					{
						cout << "당신은 적의 공격을 회피했습니다." << endl;
					}
					else {
						player.HP -= monster[currentlyMonsterIndex].damage;
						cout << monster[currentlyMonsterIndex].name << "가 이겼습니다. 당신의 체력은 " << monster[currentlyMonsterIndex].damage << "만큼 감소하였습니다.현재 체력은 " << player.HP << "입니다" << endl;
					}
				}
				else {
					cout << endl;
					Sleep(500);
					cout << "대충 효과음 2" << endl;
					Sleep(1000);
					cout << endl;
					int multiplier = 1;
					if (randBool(player.critical))
					{
						cout << "크리티컬이 발동되었습니다 당신의 데미지가 두배로 적용됩니다.." << endl;
						multiplier = 2;
					}
					monster[currentlyMonsterIndex].HP -= skillDamage[playerInput] * multiplier;
					cout << "당신이 이겼습니다. " << monster[currentlyMonsterIndex].name << "의 체력은 " << skillDamage[playerInput] * multiplier
						<< "만큼 감소하였습니다.현재 체력은 " << monster[currentlyMonsterIndex].HP << "입니다" << endl;
				}
			}
			if (player.HP > 0)
			{
				cout << endl;
				Sleep(1000);
				wall[playerIndex * 5 + 4] = ' ';
				cout << "해당 방의 몬스터를 제거했습니다. 일반모드에 진입하겠습니다." << endl;
				Sleep(1000);
				cout << endl;
				player.level++;
				cout << "레벨이 올랐습니다. 스킬포인트를 " << player.level << " 얻었습니다. 스킬을 올려주세요." << endl;
				player.skillPoint += player.level;
				currentlyMonsterIndex++;
			}
			else {
				cout << "당신은 죽었습니다. 게임을 종료합니다." << endl;
				isAlive = false;
			}

		}
		else {
			cout << "해당 방에는 몬스터가 존재하지않습니다." << endl;
		}

		while (player.skillPoint > 0)
		{
			Sleep(1000);
			cout << endl;
			cout << "스킬포인트가 " << player.skillPoint << "남았습니다. 강화시킬려는 기술을 선택해주세요" << endl;
			for (size_t i = 0; i < 3; i++)
			{
				cout << i + 1 << ": " << Skill[i] << " : 현재 데미지 : " << skillDamage[i] << "||" << "선택시 5증가" << endl;
			}

			cout << "4: 크리티컬확률 : " << player.critical << " || " << "선택시 10증가" << endl;
			cout << "5: 회피확률 : " << player.douge << " || " << "선택시 10증가" << endl;

			int playerInput;
			cin >> playerInput;

			switch (playerInput)
			{
			case 1:
				skillDamage[0] += 5;
				cout << Skill[0] << " : 현재 데미지 : " << skillDamage[0] << "입니다." << endl;
				player.skillPoint--;
				break;
			case 2:
				skillDamage[1] += 5;
				cout << Skill[1] << " : 현재 데미지 : " << skillDamage[1] << "입니다." << endl;
				player.skillPoint--;
				break;
			case 3:
				skillDamage[2] += 5;
				cout << Skill[2] << " : 현재 데미지 : " << skillDamage[2] << "입니다." << endl;
				player.skillPoint--;
				break;
			case 4:
				player.critical += 10;
				cout << "크리티컬확률 : " << player.critical << "입니다" << endl;
				player.skillPoint--;
				break;
			case 5:
				player.douge += 10;
				cout << "회피확률 : " << player.douge << "입니다" << endl;
				player.skillPoint--;
				break;
			default:
				cout << "잘못된 입력입니다 다시 입력해 주세요." << endl;
				break;
			}
		}

		if (isAlive)
		{
			cout << "다음 행동을 정해주세요 (1: 다음방으로 이동 2: 휴식하기 (HP회복 10, MP 5회복)) : ";
			int nextBehavior;
			cin >> nextBehavior;
			if (nextBehavior == 2)
			{
				cout << "잠을 자기 시작합니다" << endl;
				for (size_t i = 0; i < 4; i++)
				{
					Sleep(500);
					cout << "Z ";
				}
				cout << endl;
				player.HP += 10;
				player.MP += 5;
			}
			wall[playerIndex * 5 + 1] = ' ';
			cout << "다음방으로 이동하겠습니다." << endl;
			cout << endl;
			Sleep(200);
			cout << endl;
			Sleep(200);
			cout << endl;
			Sleep(200);
			cout << "======================================================================================" << endl;
			cout << endl;
			playerIndex++;
		}
		system("cls");
	}
	if (monsterCount > 0)
	{
		cout << "데드 앤드 ....." << endl;
	}
	else {
		cout << "당신은 이겼습니다 축하 축하" << endl;
	}

}

//skill 3개
//baseAttack 1개

void DungeonMaker() {

	for (size_t i = 0; i < lastDungeonIndex; i++)
	{
		if (monsterExist[i] == true)
		{
			wall += "   M";
		}
		else {
			wall += "    ";
		}
		wall += "|";
		boader += "=====";
	}
}

int SpecialDamage() {
	return skillDamage[0] + skillDamage[1] + skillDamage[2];
}

void DungeonDraw() {
	cout << boader << endl;
	cout << wall << endl;
	cout << boader << endl;
}


int randNum(int min, int max)
{
	int x = max - rand() % min;
	return x;
}

bool randBool(int percent) {
	int x = rand() % 100;
	return x <= percent ? true : false;
}



Acedemy_20210610_6_HW.cpp
0.01MB

'간단한 프로그램' 카테고리의 다른 글

슬라이딩 퍼즐 구현하기  (0) 2021.06.14
빙고 게임 구현하기  (0) 2021.06.10
야구게임 구현하기  (0) 2021.06.09
별표찍기  (0) 2021.06.06
구구단 구현하기  (0) 2021.06.05
가위바위보 구현하기  (0) 2021.06.03
(C++) cout로 그림 그리기  (0) 2021.06.01