Skip to content

Latest commit

 

History

History
226 lines (129 loc) · 10.7 KB

DesignDocument.md

File metadata and controls

226 lines (129 loc) · 10.7 KB

MineSweeper - Dungeons 디자인 문서

조원: 김태현, 정민경, 이영민

본 문서는 MineSweeper - Dungeons의 대략적인 구성과 세부적인 구현 방식, 이유 등을 설명한 디자인 문서입니다.

본 프로그램은 bangtal 라이브러리를 기반으로 만들어졌습니다.

게임 설계

MineSweeper - Dungeons는 지뢰찾기를 기반으로 한 게임이며, 기존 지뢰찾기에서는 볼 수 없었던 조원들의 독창적인 아이디어를 추가하여 더욱 흥미진진하게 바꾼 게임입니다.

조원들끼리 논의한 결과, 기존의 지뢰찾기 게임은 플레이어 입장에서 다음과 같은 문제가 있었습니다.

  • 숙련자가 아니라면 체감 난이도가 너무 높다.
  • 숙련자라면 게임이 너무 단조롭다.
  • 지뢰를 단 한번이라도 밟으면 진행도와 관계없이 바로 패배한다.
  • 모든 지뢰를 찾았을 때 그 보상이 너무 적다. 게임을 진행할 동기가 쉽게 생기지 않는다.
  • 몇몇 경우 오로지 운에 의지해야할 상황이 생긴다.

이를 모두 고려한 결과, 다음과 같은 요소를 게임에 추가하기로 하였습니다.

  • 지뢰를 밟을 경우 바로 패배하는 것이 아닌, 미니게임을 해서 플레이어에게 만회할 기회를 주도록 한다.
  • 여러 특수한 아이템을 곳곳에 배치하여 이를 얻는 것을 2차적인 목표로 삼을 수 있도록 한다.
  • 아이템들을 사용하여 플레이어가 더 전략적인 선택을 하고, 운에만 의지하던 상황을 타개할 수 있게 한다.
  • 탈출구를 발견한 이후에도 해당 스테이지를 계속 진행할 수 있도록 하여 플레이어가 위험을 감수하고 아이템을 노리는 선택지를 준다.
  • 난이도가 올라가는 여러 스테이지를 구성하여 게임의 반복적인 단조로움을 해소한다.
  • 몬스터 조우 횟수가 엔딩에 영향을 미치게 하여 숙련에 대한 동기와 보상을 제공한다.

이러한 추가 구성요소를 통해 게임을 보다 더 재미있게 플레이할 수 있도록 하였습니다. 게임의 전체적인 난이도는 지뢰찾기 초보자에게 맞춰져 있습니다.

컨벤션

  • 선언은 .h에, 구현은 .cpp에 작성합니다.
  • 한 헤더파일에는 여러 클래스가 들어있을 수 있지만 그것들은 모두 한 동작을 위한 부품이어야 합니다. 즉, 한 헤더파일의 코드는 하나의 역할만 수행해야 합니다.
  • 모든 헤더파일의 맨 첫 부분에는 해당 헤더파일에서 가장 주된 클래스 명과, 그 클래스가 어떤 역할을 하는지 명시합니다.
  • 파일명은 그 파일의 가장 주된 클래스 명과 같게 합니다.
  • 매직넘버는 사용하지 않습니다.
  • 모든 리소스 파일 경로는 resource.h에서만 등장해야 합니다.
  • #define 문은 자료형을 명확하게 정의하지 않으므로 constexpr를 사용합니다.
  • constexpr를 사용한 선언은 해당 선언을 사용하는 가장 가까운 헤더에 위치합니다.
  • 클래스의 모든 멤버 변수와 멤버 함수마다 역할을 설명하는 주석을 작성합니다. 이 주석들은 모두 헤더에 작성합니다.
  • 멤버 변수는 한 줄 주석으로, 멤버 함수는 여러 줄 주석으로 주석을 작성합니다.
  • 클래스 명은 대문자로 시작하는 camel case로 작성합니다.
  • 변수는 소문자로 시작하는 camel case로, 함수는 대문자로 시작하는 camel case로 작성합니다.
  • getter와 setter는 모두 소문자로 시작하는 camel case로 작성합니다.

객체지향

최대한 객체지향을 고려하며 코드를 작성, 모듈화 하였습니다. src 폴더에 있는 소스코드는 대략적으로 다음과 같이 분류할 수 있습니다.

  • 진입점이 있는 MineSweeper.cpp
  • 타이틀과 엔딩, 각 스테이지를 관리하고 게임의 승패 등을 처리하는 Stage 클래스
  • 각 스테이지의 지뢰찾기 보드를 관리하고 클릭 이벤트 등을 처리하는 Board 클래스
  • 지뢰찾기 보드의 전체 데이터를 무작위로 생성하고 데이터에 접근하게 해주는 MineField 클래스
  • Board에서 각 칸에 보여질 Cell 클래스와 그 Cell을 가릴 Block 클래스
  • 각 Block을 클릭할 때 그 이벤트를 처리하여 조건에 따라 특정 코드를 실행하는 BlockBreakHandler 클래스
  • 목숨과 아이템들을 관리하고 그 작동을 구현하는 Item 클래스
  • 몬스터 칸을 클릭할 때 전투에 입장하고 전투의 진행과 승패를 처리하는 Combat 클래스

이외에도 게임 가이드를 출력하는 GameGuide 클래스와 Combat 클래스를 상속하는 여러 전투 클래스, 들이 있습니다. 각 클래스에 대한 자세한 내용은 이하 내용에 서술되어 있습니다.

다음은 각 클래스들이 어떤 관계로 구성되어 있는지를 표현한 그림입니다.

클래스 소개

MineSweeper.cpp

  • 프로그램의 진입점이 있는 파일로, Stage 클래스의 객체를 생성하고 이를 실행합니다.

Stage

  • 본 게임은 최소 하나 이상의 스테이지를 가질 수 있습니다. 따라서 각 스테이지마다 보드를 초기화하는 클래스가 필요합니다.

  • 또한 각 스테이지 사이에 스크립트 화면을 넣어 스토리 진행 상황을 플레이어가 알 수 있습니다.

  • 일정한 시간마다 루프를 도는 타이머를 만들어 현재 보드의 상태를 확인할 수 있도록 하였습니다.

  • 보드의 상태마다 다음 스테이지로 넘어갈 수 있도록 하거나 플레이어의 패배를 알려줍니다.

  • 게임의 재시작을 담당합니다.

Board

  • MineField 클래스에 있는 데이터에 접근해 스테이지마다 보드를 초기화합니다.

  • 지뢰를 밟았는지 확인하는 이벤트 핸들러를 생성하고 관리합니다.

  • 획득한 아이템과 체력을 관리합니다.

  • 보드는 항상 하나만 존재해야 하는 싱글톤입니다. 중복된 다른 보드가 생성되어 프로그램이 꼬이는 상황을 막아줍니다.

BlockBreakHandler

  • 블럭이 깨진 것을 확인하고 몬스터칸인지 아닌지 체크합니다.

  • 몬스터칸이라면 무작위 전투 상황에 진입합니다.

  • 빈칸이라면 경계까지 블럭을 제거해 나갑니다.

  • 숫자칸이라면 해당 칸만 블럭을 제거합니다.

  • 새로 깨진 칸에 아이템이 있다면 해당 아이템을 아이템 클래스로 전해줍니다.

  • 탈출구가 있다면 보드의 상태를 바꿉니다.

Item

  • 현재 플레이어가 가지고 있는 아이템과 체력을 관리합니다.

  • 아이템을 키보드와 마우스로 선택할 수 있도록 입력을 처리합니다.

  • 아이템들과 그 개수를 화면에 보여줍니다.

  • 우클릭이 없는 관계로 몬스터 표시 기능과 블럭을 없애는 기능을 바꿀 수 있는 기능을 따로 구현했습니다.

  • 종류

    1. 주변 9칸을 모두 확인하는 몬스터탐지기
    2. 사용하면 다음 1번의 전투를 회피하는 스프레이
    3. 체력 +1

MineField

  • 특정 스테이지의 몬스터, 아이템, 탈출구 등의 위치 데이터를 저장, 관리합니다.
  • 주어진 크기의 2차원 배열을 생성합니다.
  • 배열의 각 칸에 몬스터를 무작위로 배치합니다.
  • 몬스터가 없는 칸을 순회하며 주위의 몬스터 개수만큼 해당 칸에 숫자를 저장합니다.
  • 몬스터가 없는 칸에 아이템을 무작위로 배치합니다.
  • 몬스터와 아이템이 없는 칸에 탈출구를 배치합니다.
  • 클래스에 []연산자를 오버로딩하여 바로 배열에 저장된 값을 참조할 수 있도록 하였습니다.

Cell

  • 몬스터, 숫자, 탈출구 이미지를 해당 칸 위치에서 보여줍니다.
  • 이를 가릴 Block 오브젝트를 갖습니다.
  • 블럭이 깨지면 해당 칸에 있는 아이템의 이미지를 보여주고 지웁니다.
  • 현재 칸이 보이는 상태인지 관리합니다. BlockBreakHandler는 이것을 이용해 새로운 칸이 보이게 되었는지 끊임없이 체크합니다.

Block

  • 해당 위치에 있는 Cell을 가립니다.
  • 곡괭이 상태로 클릭하면 사라지고 Cell이 보이는 상태라고 바꿉니다.
  • 위험 표시 상태로 클릭하면 위험 표시가 있는 블럭으로 이미지를 바꿉니다.
  • 위험 표시 이미지에서는 곡괭이 상태로 클릭해도 반응이 없도록 하였습니다.
  • 마우스 클릭 콜백 함수를 Block 클래스 외부에서 받을 수 있도록 구현했습니다.

Combat

  • Combat.h는 몬스터 칸을 눌렀을 때 진입할 전투 상황의 인터페이스를 제공합니다.
  • 모든 전투 상황 클래스는 Combat 추상 클래스를 상속받습니다.
  • 현재 구현한 전투 상황 클래스는 모두 다음과 같습니다
    1. 가위바위보
    2. 홀짝
    3. 몬스터 쏴맞추기
    4. 주사위를 굴려서 더 높은 주사위 눈 갖기
    5. 주사위 눈 맞추기
  • 모든 전투 상황 객체들은 BlockBreakHandler에 의해 무작위로 생성됩니다.

GameGuide

  • 게임 방법을 설명하는 이미지들을 하나로 묶어 관리합니다.
  • 타이틀 화면에서 How To Play 버튼을 눌러 진입합니다.

resource.h

  • 게임에서 사용하는 모든 리소스의 파일 경로를 관리합니다.

  • 리소스가 교체될 때 이 헤더파일만 변경하면 됩니다.

역할

다음은 각 팀원들이 주로 담당한 역할을 나열한 것입니다. 모든 팀원들은 각자 정해진 역할에 따라 코드를 작성했으며 모두 프로젝트에 충분히 기여할 수 있었습니다.

자기 역할이 아니더라도 더 나은 방법이 있다면 의논 후 이를 적극 반영하였습니다. 따라서 특정 역할이 어떤 팀원에게 속해있다 해도 절대적으로 해당 팀원만 기여한 것이 아님을 밝힙니다.

김태현

  • Board, Cell, BlockBreakHandler, MineField, Item, GameGuide
  • Combat과 이를 상속하는 전투 상황
  • 디자인 문서

정민경

  • BlockBreakHandler, Stage
  • 모든 음악 및 효과음
  • 스테이지 별 난이도 및 레벨 디자인
  • 유튜브 영상

이영민

  • Block, Item
  • 배경 및 블럭, 타이틀, 가이드, 아이템의 이미지
  • 스크립트 작성 및 스크립트 이미지
  • README 작성