프로그래밍/C,C++

[명품 C++ programming]9장 Open challenge

수학가형 2022. 1. 6. 17:52

과제는 아니고 그냥 뭔가 될 거 같아서 풀어본 챌린지 문제

 

[open challenge]Human의 Food 먹기 게임

 

게임에는 Human, Monster, Food의 객체가 등장하며, 이들은 10x20 격저판에서 각각 정해진 규칙에 의해 움직인다. Human 객체는 사용자의 키에 의해 왼쪽(a 키), 아래(s 키), 위(d 키), 오른쪽(f 키)으로 한칸씩 움직이고, Monster는 한 번에 2칸씩, 왼쪽, 아래, 위, 오른쪽 방향으로 랜덤하게 움직인다. Food는 5번 중에 3번은 제자리에 있고, 나머지 2번은 4가지 방향 중 랜덤하게 한 칸씩 움직인다.

 

게임은 Hyman이 Monster를 피해 Food를 먹으면(Food의 위치로 이동) 성공으로 끝나고, Monster가 Food를 먹거나 Human이 Monster에게 잡히면 실패로 끝난다.

 

다음은 각 객체의 이동을 정의하는 move()와 각 객체의 모양을 정의하는 getShape() 함수를 순수 가상 함수로 가진 추상 클래스 GameObject이다. GameObject를 상속받아 Human, Monster, Food 클래스를 작성하라. 그리고 전체적인 게임을 진행하는 Game 클래스와 main() 함수를 작성하고 프로그램을 완성하라.

(파일이 너무 많아서 일부만 작성하고 나머지는 첨부파일 ㄱ)

코드-Game.cpp:

#include"Game.h"
 
 
Game::Game()
{
        cout << "\n<푸드 먹기 게임 ver1.0>\n\n";
        cout << "몬스터 M을 피해 푸드 F를 먹는 게입입니다." << endl;
 
        Player* p = new Player(3, 4, 0);
        Monster* m = new Monster(9, 1, 0);
        Food* f = new Food(17, 8, 0);
 
        field();  //최초 필드 생성
        spawn(p,m,f);  //최초 오브젝트 스폰
        printfield();  //최초 화면 프린트
 
        for (;;)  //무한반복문
        {
               despawn(p, m, f);
              
               m->move();
               f->move();
               p->move();
 
               spawn(p,m,f);
               printfield();
 
               admin = endtest(p, m, f);
               if (admin == 1)
               {
                       cout << "YOU DIED!" << endl;
                       break;
               }
 
               else if (admin == 2)
               {
                       cout << "YOU WIN!" << endl;
                       break;
               }
        }
}
 
void Game::field()
{
        for (int n = 0; n < YMAX; n++)  //필드 배경
        {
               for (int i = 0; i < XMAX; i++)
               {
                       fieldd[i][n] = '-';
               }
        }
}
 
void Game::printfield()
{
        for (int n=YMAX-1; n>=0; n--)  //필드 그리기
        {
               for (int i=0; i < XMAX; i++)
               {
                       cout << fieldd[i][n];
               }
               cout << endl;
        }
}
 
void Game::spawn(Player* p, Monster* m, Food* f)
{
        //푸드->플레이어->몬스터 순서로 그리자
        //food spawn
        int foodx = f->getX();
        int foody = f->getY();
        fieldd[foodx][foody] = f->getshape();
 
        //player spawn
        int playerx = p->getX();
        int playery = p->getY();
        fieldd[playerx][playery] = p->getshape();
 
        //monster spawn
        int mobx = m->getX();
        int moby = m->getY();
        fieldd[mobx][moby] = m->getshape();
}
 
void Game::despawn(Player* p, Monster* m, Food* f)
{
        //얘는 순서 상관 ㄴㄴ
        //food despawn
        int foodx = f->getX();
        int foody = f->getY();
        fieldd[foodx][foody] = '-';
 
        //player despawn
        int playerx = p->getX();
        int playery = p->getY();
        fieldd[playerx][playery] = '-';
 
        //monster despawn
        int mobx = m->getX();
        int moby = m->getY();
        fieldd[mobx][moby] = '-';
}
 
int Game::endtest(Player* p, Monster* m, Food* f)
{
        //플레이어 좌표 저장
        int xcod1;
        int ycod1;
 
        //비교오브젝트 좌표저장
        int xcod2;
        int ycod2;
 
        //몬스터에 의한 사망 판단
        xcod1 = p->getX();
        xcod2 = m->getX();
 
        ycod1 = p->getY();
        ycod2 = m->getY();
 
        if ((xcod1 == xcod2) && (ycod1 == ycod2))
               return 1;
 
        //푸드 힉득에 의한 승리판단
        xcod2 = f->getX();
        ycod2 = f->getY();
 
        if ((xcod1 == xcod2) && (ycod1 == ycod2))
               return 2;
 
        //몬스터가 푸드먹음 ㅋㅋ
        xcod1 = m->getX();
        ycod1 = m->getY();
        if ((xcod1 == xcod2) && (ycod1 == ycod2))
               return 1;
}

코드-Object.cpp:

#include"Object.h"
 
Object::Object(int x, int y, int speed)
{
        this->xcoord = x;
        this->ycoord = y;
        this->speed = speed;
}
 
int Object::getX()  //x좌표 반환
{
        return xcoord;
}
int Object::getY()  //y좌표 반환
{
        return ycoord;
}
int Object::getspeed()  //speed 반환
{
        return speed;
}

코드-player.cpp:

#include"Player.h"
 
void Player::move()
{
        cout << "wasd로 조작하고 엔터 입력: ";
        char input;
        cin >> input;
 
        switch (input)
        {
        case 'a':
               if (xcoord > 0)
                       xcoord--;
               break;
        case 'd':
               if (xcoord < XMAX-1)
                       xcoord++;
               break;
        case 'w':
               if (ycoord < YMAX-1)
                       ycoord++;
               break;
        case 's':
               if (ycoord > 0)
               ycoord--;
               break;
        default:
               break;
        }
}

결과:

나머지 파일:

https://drive.google.com/file/d/19IQaJdg3VIN1Pod-A0hJuZBrAyJo-dyO/view?usp=sharing 

 

MonsterGame2.zip

 

drive.google.com


문제 소스

책정보, 명품 C++ Programming : 네이버 책 (naver.com)

 

명품 C++ Programming

C++는 1979년 BJARNE STROUSTRUP에 의해 “C WITH CLASSES”라는 이름으로 시작되었지만, 지금은 시스템 소프트웨어, 응용 소프트웨어, 게임, 임베디드 소프트웨어, 모바일 프로그램 등 소프트웨어의 전 분

book.naver.com