반응형
개요
이번에는 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;
}
이번에 코딩하면서 느낀 점은 생성자와 소멸자 클래스에 대해서 나름대로 개념을 잡고 있다고
생각하였지만 생각보다 내가 많이 모자라다는 것을 알게 되었으며 더욱더 열심히 해야겠다고
느끼게 되었습니다 ㅠ
반응형
'알고리즘 & 자료구조 > C++' 카테고리의 다른 글
C++ 비행기 예약 프로그래밍 (0) | 2020.06.01 |
---|---|
C++ (클래스와 파일,백터를 이용한 Hangman Game) (0) | 2020.05.13 |
C++ (클래스와 백터를 이용한Hangman Game) (0) | 2020.04.24 |
C++ (기본 C언어 문법을 이용한 숫자 맞추기 게임) (0) | 2020.04.09 |