[게임 개발 : 히어로 체스] 4. 히어로 체스 완성

WIGWAG·2023년 1월 26일
0

히어로 체스

목록 보기
5/5

개요

여러 프로그래밍 패턴을 적용하면서 만들어보려고 했지만 이 게임에 맞지 않는 패턴을 억지로 적용하는데 무리가 있었다. 그래서 일단 게임을 전부 완성하고 난 후에 몇가지 패턴들을 적용해보려고 생각했다. 모든 영웅들의 능력을 만드는 것이 꽤나 힘들었지만 그래도 결국엔 완성시켰다.

게임 설명

<초기 화면>

각 진영에 성과 영웅 7명이 배치되어 있다. 지형 타일은 기능은 없지만 게임이 실행될 때마다 랜덤으로 배치되도록 구현했다. 게임의 진행 순서는 다음과 같다.

[선택 페이즈] -> [이동&공격 페이즈] -> [능력 사용 페이즈] -> [턴 교체]

<선택 페이즈>

자신의 영웅들이 있는 칸의 테두리가 파란색으로 표시되고 이번 턴에 조작하고 싶은 영웅 하나를 선택한다. 게임 창 하단에 선택한 영웅의 능력에 대한 설명을 제공해준다.

<이동&공격 페이즈>

선택한 영웅의 상하좌우의 칸의 테두리가 초록색으로 표시되고 해당 칸을 선택할 시에 선택한 칸의 위치로 이동한다. 만약 캐릭터의 상하좌우에 자신의 영웅이 있거나 칸의 범위를 벗어난 경우에 초록색 표시가 나타나지 않는다. 캐릭터의 상하좌우에 상대 영웅이 있다면 빨간 색 표시가 나타나고 상대 영웅이 있는 칸을 선택할 시에 상대 영웅은 제거되고 선택한 자신의 영웅을 상대 영웅이 있던 칸으로 이동한다.

<능력 사용 페이즈>

영웅마다 보유한 능력이 각각 다르고 선택한 영웅의 능력의 범위가 노란색 표시 또는 보라색 표시 또는 회색 표시로 나타난다. 능력을 사용한 후에 자신의 턴이 끝나고 상대의 턴이 진행된다.

✨1. 마법사
능력 적용 범위 : 아군 영웅
능력 설명 : 아군 영웅 한 명과 위치를 교체한다.

  • 능력 적용 범위 표시
  • 능력 사용 후

✨2. 사신
능력 적용 범위 : 주위에 있는 적군 영웅
능력 설명 : 주위에 있는 적군 영웅 한 명을 제거한다.

  • 능력 적용 범위 표시
  • 능력 사용 후

✨3. 닌자
◈ 카피할 영웅을 선택한 후에 그 영웅의 능력 적용 칸을 선택한다.
능력 적용 범위 : 주위에 있는 아군 또는 적군 영웅
능력 설명 : 주위에 있는 영웅 한 명의 능력을 카피 후 자신의 턴동안 사용한다.

  • 능력 적용 범위 표시
  • 카피한 영웅의 능력 범위 표시

✨4. 고스트
능력 적용 범위 : 주위에 있는 적군 영웅
능력 설명 : 적군 진영 끝에 도달 시 한 명을 제거하고 초기 위치로 돌아온다.
               초기 위치에 영웅이 존재할 때 능력 사용 후 그 영웅은 제거된다.

  • 능력 적용 범위 표시
  • 능력 사용 후

✨5. 전사
◈ 주위의 모든 적군 영웅에게 적용되기 때문에 선택할 필요가 없다.
능력 적용 범위 : 주위에 있는 적군 영웅
능력 설명 : 주위에 있는 적군 영웅 모두를 무력화한다.

  • 능력 적용 범위 표시 X
  • 능력 사용 후

✨6. 디펜더

능력 적용 범위 : 자신 기준 가로 또는 세로 방향
능력 설명 : 가로 또는 세로 방향으로 이동한다. (장애물이 있으면 막힌다.)
               디펜더는 공격 행동을 할 수 없고 공격 대상이 될 수 없다.

  • 능력 적용 범위 표시
  • 능력 사용 후

✨7. 기사
능력 적용 범위 : 주위에 있는 아군 영웅
능력 설명 : 주위에 있는 아군 영웅 한 명을 기사의 이동 방향으로 이동시킨다.

  • 능력 적용 범위 표시
  • 능력 사용 후

<승자 결정>

  • 목숨이 1일 때
    성이 불에 타게 된다.
  • 목숨이 0일 때
    승자가 결정되고 메시지창에 나타나면서 승자를 알려준다.

<메뉴>

[새 게임]을 누르면 메시지 창이 나타나고 확인을 누르면 새로운 게임이 시작된다.
[종료]를 누르면 게임이 종료된다.


널 객체 패턴

코드를 구현하는 과정에서 게임 프로그래밍 패턴 책에서 배운 패턴 하나를 써먹을 수 있었다.
영웅이 공격받거나 능력으로 인해 보드에서 제거된다면 영웅 객체들을 모아놓은 리스트에서도 제거해야 한다. 하지만 특정 영웅이 제거된다면 부모클래스인 C_Hero클래스의 메서드를 사용하는 다형성을 활용할 수가 없어서 메서드를 사용할 때마다 영웅이 리스트에 있는 지 체크하는 조건을 걸어둔다면 상당히 번거로울 것이다. 그러므로 다형성을 적용하되 실제 오버라이드한 메서드 내부에는 아무 일도 하지 않는 널 객체를 만들면 앞서 말한 번거로움을 피할 수 있다.

특정 영웅이 제거될 때 리스트에서 영웅을 제거 후에 널 객체를 할당한다.

class C_None : public C_Hero
{
public:
    C_None(int x, int y)
        : C_Hero(x, y, N_IMAGES)
    {}
    virtual ~C_None() override {}
    virtual void Render(HDC memdc) override {}
    virtual void Move_Per_Frame(int dest_x, int dest_y) override{}
};
profile
윅왁의 프로그래밍 개발노트

0개의 댓글