반응형

개요

 

이번에는 C++의 클래스와 생성자들을 이용한 몬스터 게임을 만들어 보았습니다.

 


설명

 

게임은 각기 다른 형태와 이름을 가진 몬스터 6마리가 랜덤으로 맵을 움직이면서 아이템을 획득하고 

아이템을 다 휙득하면 종료하는 간단한 프로그램입니다. 아이템은 각각의 배열에 초기에 전부

세팅되어 있으며 몬스터가 한번 먹으면 다시 만들어지지는 않습니다.

 


Monster.h

 

#include <Windows.h>
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include "Item.h"
// 몬스터가 랜덤하게 움직이는거 까지 구현함
using namespace std;
static int move_count = 0;  // 몬스터들의 전체 움직임 체크를 위한 전역변수
static int add = 128;	// 전체 아이템수
class Monster {	// 몬스터 클래스

public:
	string name;    // 몬스터의 이름
	string shape;   // 몬스터의 모양
	int x, y;	    // 현재 위치
	int check;		// 몬스터가 먹은 아이템수
	Monster(int startx, int starty, string sname, string sshape,int scheck) {
		this->x = startx;
		this->y = starty;
		this->name = sname;
		this->shape = sshape;
		this->check = scheck;
		//this->s = sname;
		srand((unsigned int)time(NULL)); // 랜덤하게 움직인다.
	}

	void move();    // 몬스터의 움직임
	int getX() { return x; };	// 몬스터의 현재 X의 값 리턴
	int getY() { return y; };	// 몬스터의 현재Y의 값 리턴
	
	bool crush(Item* p) {
		if (this->x == p->getX() && this->y == p->getY()) {
			return true;
		}
		else {
			return false;
		}
	}
};


void Monster::move() {
	for (;;) {
		// int n = rand() % 8; // 4가지의 랜덤한 경우
		if (y == 0 && x == 0) {    // 왼쪽 구석에 위치했을때!
			int n2 = rand() % 3;
			if (n2 == 0) {
				y++;
				move_count++;
				break;
			}
			else if (n2 == 1) {
				x++;
				move_count++;
				break;
			}
			else if (n2 == 2) {
				y++;
				x++;
				move_count++;
				break;
			}
		}
		else if (x == 0 && 0<y &&y<15) {	// 맨위쪽 줄에 위치해있을때! 
			int n2 = rand() % 5;
			if (n2 == 0) {
				y++;
				move_count++;
				break;
			}
			else if (n2 == 1) {
				y++;
				x++;
				move_count++;
				break;
			}
			else if (n2 == 2) {
				x++;
				move_count++;
				break;
			}
			else if (n2 == 3) {
				y--;
				x++;
				move_count++;
				break;
			}
			else if (n2 == 4) {
				y--;
				move_count++;
				break;
			}

		}

		else if (y == 0 && 0<x && x<7) {	// 맨 왼쪽에 위치해 있을때!
			int n2 = rand() % 5;
			if (n2 == 0) {
				x--;
				move_count++;
				break;
			}
			else if (n2 == 1) {
				x--;
				y++;
				move_count++;
				break;
			}
			else if (n2 == 2) {
				y++;
				move_count++;
				break;
			}
			else if (n2 == 3) {
				y++;
				x++;
				move_count++;
				break;
			}
			else if (n2 == 4) {
				x++;
				move_count++;
				break;
			}
		}
		else if (x==7 && y == 0) {	// 왼쪽 아래에 위치해 있을때!
			int n2 = rand() % 3;
			if (n2 == 0) {
				x--;
				move_count++;
				break;
			}
			else if (n2 == 1) {
				x--;
				y++;
				move_count++;
				break;
			}
			else if (n2 == 2) {
				y++;
				move_count++;
				break;
			}

		}
		else if (x == 7 && 15>y &&y>0) {	// 맨아래 위치해 있을때!
			int n2 = rand() % 5;
			if (n2 == 0) {
				y--;
				move_count++;
				break;
			}
			else if (n2 == 1) {
				y--;
				x--;
				move_count++;
				break;
			}
			else if (n2 == 2) {
				x--;
				move_count++;
				break;
			}
			else if (n2 == 3) {
				x--;
				y++;
				move_count++;
				break;
			}
			else if (n2 == 4) {
				y++;
				move_count++;
				break;
			}
		}

		else if (y == 15 && x == 7) {	// 오른쪽 끝에 위치했을때!
			int n2 = rand() % 3;
			if (n2 == 0) {
				x--;
				move_count++;
				break;
			}
			else if (n2 == 1) {
				x--;
				y--;
				move_count++;
				break;
			}
			else if (n2 == 2) {
				y--;
				move_count++;
				break;
			}
		}
		else if (y == 15 && 0<x && x<7) {	// 가장 오른쪽에 있을때!
			int n2 = rand() % 5;
			if (n2 == 0) {
				x--;
				move_count++;
				break;
			}
			else if (n2 == 1) {
				x--;
				y--;
				move_count++;
				break;
			}
			else if (n2 == 2) {
				y--;
				move_count++;
				break;
			}
			else if (n2 == 3) {
				y--;
				x++;
				move_count++;
				break;
			}
			else if (n2 == 4) {
				x++;
				move_count++;
				break;
			}
		}
		else if (y == 15 && x == 0) {	// 가장 오른쪽맨위에 위치했을때!
			int n2 = rand() % 3;
			if (n2 == 0) {
				y--;
				move_count++;
				break;
			}
			else if (n2 == 1) {
				y--;
				x++;
				move_count++;
				break;
			}
			else if (n2 == 2) {
				x++;
				move_count++;
				break;
			}

		}
		else {	// 특수한 경우에 속하지 않을 경우!
			int n2 = rand() % 8;
			if (n2 == 0) {
				y++;
				move_count++;
				break;
			}
			else if (n2 == 1) {
				y--;
				move_count++;
				break;
			}
			else if (n2 == 2) {
				x++;
				move_count++;
				break;
			}
			else if (n2 == 3) {
				x--;
				move_count++;
				break;
			}
			else if (n2 == 4) {
				y--;
				x--; 
				move_count++;
				break;
			}
			else if (n2 == 5) {
				y--;
				x++;
				move_count++;
				break;
			}
			else if (n2 == 6) {
				y++;
				x++;
				move_count++;
				break;
			}
			else if (n2 == 7) {
				y++;
				x--;
				move_count++;
				break;
			}
			

		}
	}
}


 


Item.h

 

class Item {
	
public:
	int x, y;	// 아이템의 위치 좌표
	Item(int ix, int iy) {
		this->x = ix;
		this->y = iy;
	}
	int getX() { return x; };
	int getY() { return y; };


};

 


Map.h

 

#include "Monster.h"


class Map {

	int item_count = 0;
	string board[8][16];	// 8*16 맵 새성
	Monster* m1 = new Monster(0, 1,"몬스터","A",0);
	Monster* m2 = new Monster(2, 6, "도깨비","B",0);
	Monster* m3 = new Monster(1, 1, "별그대", "C",0);
	Monster* m4 = new Monster(3, 3, "고스트", "D",0);
	Monster* m5 = new Monster(4, 12, "헬보이", "E",0);
	Monster* m6 = new Monster(6, 15, "흡혈귀", "F",0);
	
	
public:
	
	Map() {
		srand((unsigned)time(NULL));
		
		for (int i = 0; i < 8;i++) { // 격자판 배열 초기화
			for (int j = 0; j < 16; ++j) {
				board[i][j] = "=";	// 특수문자가 깨져서 이렇게 사용
				//board[i][j] 
				
			}
		}
	}

	

	void game();	// 게임 진행 함수
	

	void past_move() {	// 움직이고난 다음 = 값이 넣어 움직인것 처럼 보이게 한다.
		board[m1->getX()][m1->getY()] = '=';
		board[m2->getX()][m2->getY()] = '=';
		board[m3->getX()][m3->getY()] = '=';
		board[m4->getX()][m4->getY()] = '=';
		board[m5->getX()][m5->getY()] = '=';
		board[m6->getX()][m6->getY()] = '=';
	}

	void setXY() {	// 몬스터의 현재 위취화 상태 
		board[m1->getX()][m1->getY()] = m1->shape;	// 몬스터의 모양 출력
		board[m2->getX()][m2->getY()] = m2->shape;
		board[m3->getX()][m3->getY()] = m3->shape;
		board[m4->getX()][m4->getY()] = m4->shape;
		board[m5->getX()][m5->getY()] = m5->shape;
		board[m6->getX()][m6->getY()] = m6->shape;
	}


	void show() {
		cout << "**********************************************필독************************************************" << endl;
		cout << "가끔 C++ Runtime Ribery 오류가 나오는데 검색 해보니 설치된 타사 프로그램 및" << endl;
		cout << "서비스가 Windows 에서 충돌을 야기시키기 때문에 나타난다고 합니다." << endl;
		cout << "그러한 오류가 발생시 한번만 더 실행해 주시면 감사하겠습니다. ㅠ" << endl;
		cout << "                             ** Monster Game **" << endl << endl;
		system("cls");
		
		cout << endl << endl << endl << endl;
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 16; j++) {
				cout <<" "<<board[i][j]<<" ";
			}
			cout << endl;
		}	
		cout << endl << endl;
		cout << "전체 이동 횟수 = " << move_count << endl;
		cout << "남은 아이템 수 = " << add << endl<<endl;
		cout << "     " << m1->name << " " << m1->shape << "  " << m1->check << "  " << endl;
		cout << "     " << m2->name << " " << m2->shape << "  " << m2->check << "  " << endl;
		cout << "     " << m3->name << " " << m3->shape << "  " << m3->check << "  " << endl;
		cout << "     " << m4->name << " " << m4->shape << "  " << m4->check << " " << endl;
		cout << "     " << m5->name << " " << m5->shape << "  " << m5->check << " " << endl;
		cout << "     " << m6->name << " " << m6->shape << "  " << m6->check << " " << endl;
		Sleep(20);
	}
	void set();
	void Add_Item();
};

void Map::set() {
	
}

void Map::Add_Item() {
	
	

	

}

void Map::game() {
	int count = 0;
	int gamecount = 0;
	Item* i[8][16];	// 아이탬 객체 128개 생성
	for (int a = 0; a < 8; a++) {
		for (int b = 0; b < 16; b++) {
			i[a][b] = new Item(a, b);
		}
	}

	while (true) {
		
		setXY();
		show();
		past_move();
		m1->move();
		m2->move();
		m3->move();
		m4->move();
		m5->move();
		m6->move();

		for (int a = 0; a < 8; a++) {
			for (int b = 0; b < 16; b++) {
				if (m1->crush(i[a][b])) {	// 몬스터가 아이템을 먹으면 작동
					m1->check++;
					add--;
					delete i[a][b];
				}
				else if (m2->crush(i[a][b])) {
					m2->check++;
					add--;
					delete i[a][b];
				}
				else if (m3->crush(i[a][b])) {
					m3->check++;
					add--;
					delete i[a][b];
				}
				else if (m3->crush(i[a][b])) {
					m3->check++;
					add--;
					delete i[a][b];
				}
				else if (m4->crush(i[a][b])) {
					m4->check++;
					add--;
					delete i[a][b];
				}
				else if (m5->crush(i[a][b])) {
					m5->check++;
					add--;
					delete i[a][b];
				}
				else if (m6->crush(i[a][b])) {
					m6->check++;
					add--;
					delete i[a][b];
				}
			}
		}
		if (add == 0) {
			
			cout << "게임종료" << endl;
			show();
			delete m1, m2, m3, m4, m5, m6;
			break;
		}
		
	}
}



 


main.cpp

 

#include "Map.h"

int main() {

	Map* M = new Map;
	M->game();
	delete M;

	return 0;
}

 


이번에 코딩하면서 느낀 점은 생성자와 소멸자 클래스에 대해서 나름대로 개념을 잡고 있다고

생각하였지만 생각보다 내가 많이 모자라다는 것을 알게 되었으며 더욱더 열심히 해야겠다고

느끼게 되었습니다 ㅠ

 


 

반응형

+ Recent posts