• 콘솔 마작 프로젝트 링크 Github
  • 마작 프로젝트 마인드맵 Draw.IO Link

이모지에 마작 패가 모두 구현되어 있는것을 보고 당차게 시작 한 프로젝트
그러나 기껏해야 온라인 마작 초보정도인 내가 구현하려고하니 헷갈리는 마작의 룰이 많았다.

깃헙 프로젝트의 Readme.md 파일을 정리 하면서
지금까지 구현한 내용과 앞으로 구현할 내용들을 정리해보자.


클래스 다이어그램

구현한 내용들

Program.cs

  • 프로그램 실행에 있어 전체적인 부분을 담당.
    • main 메서드에서 실행
    • Action() 부분 메서드는 보통 유저의 행동 혹은 CPU의 행동이 일어날때 실행
    • 숫자 - 이모지간 반환, Stopwatch 등 활용하는 유틸 메서드도 추가.

Players.cs

  • 게임을 진행하는 플레이어와 관련된 부분을 담당
    • 플레이어의 정보를 갖고있는 플레이어 구조체, 플레이어의 행동을 정의하는 메서드로 되어있다.
    • 플레이어 구조체에는 손에 들고있는 핸드, 버림패, 이름, 점수 등등 변수 정의
    • Print() 부분 메서드는 현재 유저의 정보들을 프린트
    • 유저들 초기화나 마작패를 뽑는 행동 등이 구현되어있다.

Deck.cs

  • 마작 타일들의 모음을 정의하는 부분을 담당.
    • PublicDeck은 플레이어에게 초기 패 분배 이후, 공용으로 쓰는 마작패들을 정의하는 구조체
    • 덱 만들기, 덱 정렬, 덱 셔플 등의 메서드를 만들었다.

Games.cs

  • 게임 진행과 관련된 부분들을 담당.
    • 현재 진행중인 게임의 정보를 저장하는 Game 구조체
    • Print() 부분 메서드는 현재 게임 상황들을 프린트 해 준다.
    • 게임 초기화, 게임 승 패등을 판정한다.

Tiles.cs

  • 마작의 패와 관련된 부분들을 담당
    • Tile 구조체에는 보너스 타일(도라 타일) 속성, 타일의 속성이 뭔지, 앞면을 보여줄지 뒷면을 보여줄지, 숨겨야할지 등의 속성이 있다.
    • 타일과 타일 뭉치들 (Tile[] 배열, 덱) 을 프린트 할수 있는 메서드 정의
    • 타일의 속성을 편하게 bool 값으로 리턴해주는 조건들의 메서드를 정의한다

Yaku.cs (미구현)

  • 마작의 역과 관련된 부분들을 담당한다.
    • 플레이어 핸드와 비교하는 메서드, 역의 정보들 (몇 점 짜리?) 담아두는 메서드 정의 예정

우선 실행하면 게임 초기화 이후 패를 버리는 기능, 덱이 소진될 때까지 모두 패를 뽑으면 게임이 다음 판으로 넘어가게끔 하는 부분까지 완성했다. (무승부 판정)
앞으로 남은 개발 할 부분도 많지만, 일단은 마작을 뭔가 한다라는 느낌을 줄 수 있는 정도….?


앞으로 구현 할 내용들

  1. 내가 뽑았을때 리치를 할 수 있게 한다.
    • 리치를 하게 하려면..?
      • 지금 내가 텐파이 상태인지 할수 있는지를 판단 해야한다. (역에서 한장 모자란 상태)
    • 역을 판단 하려면..?
      • 가장 기본적인 역을 구현해 보자 (머리, 몸통 4개가 되었는지 판단.)
  2. 1이 되면 쯔모는 쉽다 (역이 완성된거에 쯔모 버튼을 구현해주기만 하면 됨.)
  3. 울기 구현 -> 울기는..? 다른 사람의 턴일때 패를 가져오는것
    • 울수 있는 때는..? 몸통을 만들 수 있거나, 론일때.
    • 몸통이 되는지를 판단하는것은 리치를 판단하는것 만들면서 같이 만들면 될듯.
  4. 깡 구현
    • 3번을 구현하면서 깡을 구현해보자 (어렵지는 않을듯..?)
  5. 론 구현
    • 3번을 구현하고, 화료 가능인지 (역과비교) 판단 하면되니 1번과 3번을 구현하면 쉽다.
  6. 점수 계산 및 승패 판단
    • 무승부 까진 구현했으나, 승패 판단을 아직 구현하지 않았다.
    • 1국이 끝났을때의 점수계산을 계속 진행하고, 게임이 끝났을때 점수를 판별해서 최종 게임의 승/패를 가린다.
    • 친이 이겼냐 / 자가 이겼냐에 따라 게임의 세트 종료가 달라짐을 구현.
  7. (시간이 난다면) 론이나 쯔모시에 애니메이션 들을 넣어 볼 수도 있을듯.
  8. (진짜 시간이 더난다면) 여태까지 했던 승패 전적이나, 각 역을 몇번이나 했는지 통계페이지 혹은 도움말 페이지 같은 마작 덱 사전을 만들어서 볼 수 있을듯.

그밖에 프로그램 적으로 구현할 내용들

  1. 모든 자료구현을 거의 배열만으로 선언 했기 때문에, 가변 배열이 필요한 부분들 리팩토링 필요할듯.
    • 고정 배열일 경우 패가 늘었다가 줄었을때 정렬하는부분 등이 너무 어렵다…
  2. 리스트 말고도 자료구현을 구현한다면 큐나 스택을 잘 쓸 수 있을듯. (턴 순서, 공용 타일 등등)
    • 혹은 턴의 구현 방향을 지금은 enum으로 했는데, 순환 링크드 리스트 같은걸로 구현하면 더 판별이 쉬울지도..
  3. 구조체 말고 객체의 용도가 아직 아리까리해서, 수업 진행 이후에 구조체를 객체로 변경한다는 식의 추가 개발이 필요할 듯 하다.