C++) CMD로만 플레이 가능한 RPG 게임!

320x100

실행

Woong's Adventure.exe
0.06MB

1. 해당 파일을 다운받는다.

2. 실행시킨다.

소개

갑자기 나타난 드래곤에게 마을을 빼앗겨 다시 마을을 탈환하고 공주를 구출하기 위해 여행을 떠나는 용사(웅이)의 모험을 C++ 콘솔로 나타낸 게임

기획 의도

이전에 학원에서 Java 관련 과제를 수행하던 중 text 기반으로 만들었던 간단한 게임 과제를 좀 더 이미지화한 게임으로 만들고 싶었다. 또한 콘솔로 이미지를 나타내기 위해 C++ 언어를 사용했는데, 한동안 웹 개발 공부에 치우쳐 C++을 다룰 상황이 없었기 때문에 좋은 기회였다. 추가로 객체 지향 프로그래밍과 MVC 패턴을 배웠기 때문에 이를 활용할 기회로 삼아 하나의 프로젝트를 개발해 보고 싶었다.

게임 스토리

Woong 아일랜드는 평화로운 세계입니다.

주변 곳곳에 몬스터가 도사리고 하지만 몬스터 개체 수도 거의 없고, 대부분은 연약한 슬라임들 이었고 간혹 곰과 고블린과 같이 조금 강한 몬스터가 있긴 하지만, 개체 수는 슬라임에 비해 현저히 적기도 하고 크게 공격성을 띄지 않아 위협적이지 않았습니다.

하지만 그런 와중 갑자기 용이 나타났습니다.

용은 전설 속의 생물이며, 다른 몬스터들을 조종한다는 전설이 있습니다.

포악한 용은 몬스터들 또한 공격적으로 만들고, 곰과 고블린의 개체 수를 증가시켰습니다.

현재 용은 Woong 아일랜드의 왕가를 인질로 잡고 사람으로 변해 궁전 내에서 호의호식을 하고 있습니다.

평화에 물들었던 세계는 단숨에 어둠이 됐고, 용을 퇴치하기 위해 수많은 용사들이 싸움을 걸었지만 빈번히 실패했습니다.

그러던 와중, 전설의 용사 '' 환생인 '웅이' 태어났습니다. 하지만 평범한 삶을 살기를 바랐던 웅이의 부모님은 웅이가 웅의 환생임을 사람들에게 숨기고 다녔습니다.

하지만 웅이가 15살이 되던 , 학교 전투 수업에 참여한 웅이는 남들과는 다른 재능이 있음을 깨닫고, 부모님에게 자신이 전설의 용사 웅의 환생임을 들었습니다.

피할 없는 운명이라 여긴 웅이는 곧장 여행길에 떠날 준비를 했으며, 안에 갇힌 왕족을 구하고, 또래인 공주를 구해 세계의 평화와 공주 모두를 얻겠다고 다짐하게 여행길에 떠났습니다.

 

게임 설명

게임에는 레벨(Level) 존재합니다. 현재 존재하는 최고의 용사의 레벨이 22라는 소문이 있지만, 용은 무려 30레벨입니다.

웅이는 전설의 용사 웅의 환생인 만큼, 남들과는 확연히 다른 성장 속도를 갖고 있습니다. 슬라임 마리를 잡아도 무려 4업을 하고, 포악한 곰을 잡는다면 7레벨, 고블린을 잡는다면 9레벨이 상승합니다.

웅이의 시작은 1레벨이지만, 슬라임, , 고블린을 꾸준히 잡는다면 금세 30레벨이 되어 용을 잡을 있을 것입니다.

웅이는 용을 잡을 있게 때까지 수없이 수풀을 헤쳐가며 여행을 것입니다. 걷다가 몬스터를 만날 수도 있고 만나지 않을 수도 있지만, 만나게 된다면 싸움은 피할 없을 것입니다.

웅이의 레벨이 30레벨이 되는 순간, 용에게 도전할 있습니다. 다만, 용은 매우 강한 개체이니 신중하게 가시길 바랍니다.

몬스터 또는 용과 전투를 벌이다 죽는다면 레벨이 1만큼 감소합니다.

용사는 1/3 확률로 스킬을 사용합니다. 스킬은 직업별로 다르며, 초보자 또한 스킬이 있습니다.

용은 30레벨 이후에만 만나는 것이 아닙니다. 이전에도 지나가는 용에게 들킬 있으며, 만나는 즉시 죽게됩니다.

웅이와 함께 모험을 떠나 공주와 세계를 구할 있기를 바랍니다.

 

전체 구성원

용사

  • 초보자
  • 검사
  • 마법사
  • 궁수

몬스터

  • 슬라임
  • 고블린

기타

  • 공주

필요 콘솔 그림과 난이도

괄호 안 기재된 내용이 난이도

 

그림이 굉장히 허접하니 맨 아래 주어지는 깃허브에서 다운받아 수정해주실 분이 있다면 수정 후 공유 부탁드립니다 ㅡ,ㅡ

용사

  • 기본(중)

용사 - 기본

  • 걷기(중)

용사 - 걷기

  • 사망(중)

용사 - 사망

무기(용사의 직업은 무기를 통해 나타낼 것)

  • 초보자(하)

초보자 검

  • 검사(하)

전사 검

  • 마법사(하)

법사 스태프

  • 궁수(하)

궁수 활

몬스터

  • 슬라임(중하)

몬스터 - 슬라임

  • 곰(중)

몬스터 - 곰

  • 고블린(중상)

몬스터 - 고블린

  • 용(상)

몬스터 - 용

공주(상)

공주

 

게임 스토리 설명 맵

게임 설명 맵

게임 시작 화면

레벨업

 

구현 설명

MVC 구조

디자인 패턴 중 가장 유명한 MVC을 이용해 프로젝트를 작성.

MVC 패턴에 대해 더 자세히 알고 싶다면 https://opentutorials.org/course/697/3828 을 통한 학습을 바랍니다.

 

Model

- 용사 객체(header file)

모든 용사 클래스의 기반이 되는 Soldier 클래스를 만들어 필요한 필드들과 함수들을 정의한다. 전사, 법사, 궁수 클래스들은 모두 Soldier 클래스를 상속받으므로 함수들은 virtual 함수로 정의한다.

#pragma once
#include <iostream>
#include <string>

using namespace std;

namespace adventure {
	class Soldier {
	public:
		Soldier();
		virtual ~Soldier();

		virtual unsigned int LevelUp();
		virtual unsigned int Attack() const;
		virtual int Receive(int damage);
		virtual void Evolution();
		virtual unsigned int Skill() const;
		virtual bool IsDead();
		virtual unsigned int Dead();
		virtual void Status() const;
		virtual void Heal();

		int GetMaxHealth() const;
		int GetCurHealth() const;
		unsigned int GetStrength() const;
		unsigned int GetNimble() const;
		unsigned int GetIntelligence() const;
		unsigned int GetAttack() const;
		unsigned int GetLevel() const;
		string GetJobW() const;

		void SetMaxHealth(int num);
		void SetCurHealth(int num);
		void SetStrength(int num);
		void SetNimble(int num);
		void SetIntelligence(int num);
		void SetAttack(int num);
		void SetLevel(int num);
		void SetJobW(string name);

	private:
		int maxHealth;
		int curHealth;
		unsigned int strength;
		unsigned int nimble;
		unsigned int intelligence;
		unsigned int attack;
		unsigned int level;
		string job;
	};
}

 

- 몬스터 객체(header file)

#pragma once
#include <iostream>
#include <string>

namespace adventure {
	class Monster {
	public:
		Monster();
		virtual ~Monster();

		virtual unsigned int Attack();
		virtual unsigned int Receive(int receive);
		virtual unsigned int Dead();
		virtual void Status();
		virtual void Heal();

		int GetMaxHealth();
		int GetCurHealth();
		unsigned int GetAttack();
		unsigned int GetLevel();
		std::string GetName();

		void SetMaxHealth(int num);
		void SetCurHealth(int num);
		void SetAttack(int num);
		void SetLevel(int num);
		void SetName(std::string name);

	private:
		int maxHealth;
		int curHealth;
		unsigned int attack;
		unsigned int level;
		std::string name;
	};
}

 

View

콘솔상 이미지를 나타내기 위한 파트로써, gotoXY(int x, int y) 라는 함수를 통해 콘솔에서의 위치를 조정하여 그림을 그릴 수 있도록 하고 용사, 몬스터 등 각각의 x, y좌표를 받고 해당하는 콘솔의 위치에 나타날 수 있도록 표현.

그리고 여러 그림들을 조합해 스토리를 진행하기 위한 함수들을 정의.

#pragma once
#include <iostream>
#include <string>
#include <cstdlib>
#include <Windows.h>
#include <ctime>

using namespace std;

namespace adventure 
{
	class GameView
	{
	public:
		GameView();
		~GameView();

		// 콘솔상에서 포인터 이동
		void gotoXY(int x, int y);

		// 부품 조합
		void Story();
		void Explain();
		void Initial(unsigned int job); // 기본 화면
		void Fight(unsigned int curMonster);
		void Walk(unsigned int job);
		void SoldierCurHealth(int health);
		void MonsterCurHealth(int health,int monster);

		// 그림
		void InitialConsole();
		void Border();
		void Ground();
		void Soldier(int x, int y);
		void SoldierWeapon(int num, int x, int y); // num을 이용해 무기의 종류를 받는다
		void SoldierWalk(int x, int y);
		void SoldierDead(int x, int y);
		void Monster(int num, int x, int y); // num을 이용해 몬스터의 종류를 입력받는다
		void Princess(int x, int y);
	};
}

 

Controller

전투 시 용사나 몬스터의 체력이 깎이거나 체력이 0이 되었을 시 싸움이 종료되어 한 쪽의 승리로 끝나는 등 클래스들을 실제로 다루는 부분

#pragma once
#include <windows.h>
#include <conio.h>

#include "Monster.h"
#include "Bear.h"
#include "Goblin.h"
#include "Slime.h"

#include "Soldier.h"
#include "Archer.h"
#include "Magician.h"
#include "Warrior.h"

#include "GameView.h"

using namespace std;

namespace adventure
{
	class GameController
	{
	public:
		GameController();
		~GameController();
		void AttackMonster(boolean bSkill);
		void AttackSoldier();
		unsigned int ChangeJob();
		unsigned int Dead();
		void Fight();
		int FightDragon();
		void GameStart();
		void SoldierStatus();
		void Setting();
		void Walk();
		void test();

	private:
		GameView gv = GameView();
		Soldier* user = new Soldier();
		Monster* monster = new Monster();

		unsigned int curMonster;
		unsigned int job;
		int key;
		int slime;
	};
}

 

실제 게임 화면

게임 화면1
게임 화면2
게임 화면3

 

Total Source-code(Github)

https://github.com/WOOOOOOOONG/Woongs-Adventure

 

GitHub - WOOOOOOOONG/Woongs-Adventure: 갑자기 나타난 드래곤에게 마을을 빼앗겨 다시 마을을 탈환하고 공

갑자기 나타난 드래곤에게 마을을 빼앗겨 다시 마을을 탈환하고 공주를 구출하기 위해 여행을 떠나는 웅이의 모험을 C++ 콘솔로 나타낸 게임 - GitHub - WOOOOOOOONG/Woongs-Adventure: 갑자기 나타난 드래

github.com

 

320x100