[완료] 이것은 올바른 설계인가요 ? [게임 설계시]

GMRyuj의 이미지

안녕하세요.. 프로그램 설계를 공부하고있지만.. 여전히 뜬구름잡는것처럼 답이 보이지 않습니다. 원래 이런건지.. 답이 없다고는 하지만 이렇게까지 답이 없을 필요는 없는데 ㅠ.ㅠ.;;

최근에 설계에 관한 공부를 마치고, 이를 이용해 게임을 설계하고 있습니다.

우선 몇가지 봉착했던 문제들을 나열해봅니다. (하향식 설계 -> 상향식 설계로 하니 답이 보이네요..)

[하향식 설계로 접근했을 때의 문제]
간단한 게임이지만, 세상이 없으면 나도 존재할수 없듯이 세상의 속성을 모르는 상태에서 객체를 표현할수 없었습니다.
객체를 표현하려고해도 도저히 무슨 속성이 꼭 필요한지 모르기에 GameObject(Entity)를 정의하는 것부터가 매우 어려웠습니다.
GameObject는 간단히 자신의 이름을 Set/Get 할수 있는 간단한 클래스입니다.
Entity는 게임오브젝트로부터 상속받고 게임세계의 데이터를 구현합니다.
이로부터 나온 인터페이스는 다음과 같습니다.(IDrawable, IAttackable, IAttackedable, IMoveable)

IDrawable : 객체가 그려질수 있음.
IAttackable : 객체가 공격할수 있음
IAttackedable : 객체가 공격당할수 있음.
IMoveable : 객체가 움직일수 있음.

이렇게 4개의 간단한 인터페이스를 정의했습니다. 이 다음부터 도저히 어떻게 해야할지를 모르겠습니다..
그래서 상향식 설계로 접근했습니다.
[상향식 설계로 접근했을때의 문제]
결국은 예전에 하던 프로그래밍 방법을 사용하게되었습니다. 다만 이번에는 프로그래밍이 아닌 설계이지만.. 가장 큰 그림부터 보는 것이기에.. Main 함수로부터 게임의 세상을 먼저 봤습니다.

게임의 세상 객체를 구현하려고 했습니다. 게임의 세상객체 : GameWorld 클래스
GameWorld 의 책임은 객체들을 관리하는 것입니다. (관리내용 : 객체의 추가, 객체의 삭제, 객체의 조회)
하지만 여기에도 문제는 있더군요.. 프로그램이 너무 딱딱하게 고정되어 있는것 같은 느낌이였습니다. 그래서 추상화와 책임의 분리(SRP) 이용하게 되었습니다.
객체의 추가,삭제를 관리하는 객체를 만들었습니다. ObjectManager 클래스
그리고 GameWorld 에서 World를 추상화 클래스로 분리하여 (Template Method 를 적용하여 Init, Run, End 의 abstarct 메소드를 두고, StartWorld를 이용해서
StartWorld :
Init()
Run()
End()
이런 식으로 구현을 했습니다.

과연 이렇게 개발하는 것이 올바른 설계입니까?

올바른 설계란 존재하는 것입니까? 경험많은 고수분들께서 저의 공허한 마음을 구제해주셨으면 하는 바램입니다. 감사합니다.

익명 사용자의 이미지

데모 수준으로 구현후 검증을 하시라고 말씀드리고 싶네요.

맛집 비결은 며느리도 모른다고 했듯이,

설계 비밀도 그러한듯합니다.

본인의 노력만이 정답인듯합니다.

GMRyuj의 이미지

데모로 테스트해보겠습니다.

이 세상에서 불가능한 것은 단 하나뿐이다.
그것은 자신을 완벽히 믿는 것이다.

empty2fill의 이미지

게임 관련해서는

현업분들이 많이 활동하고 계시는 게임코디(http://www.gamecodi.com)

연구소 질문/답변 종합 게시판(http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_QnA_etc)에 물어보세요.

——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -

GMRyuj의 이미지

왜 이런 사이트를 몰랐는지.. 정말 감사드립니다.

이 세상에서 불가능한 것은 단 하나뿐이다.
그것은 자신을 완벽히 믿는 것이다.

익명 사용자의 이미지

저 역시도 익명님 말씀에 동의합니다.

외람되지만 질문의 내용을 보면 어디서 부터 어떻게 답변을 해드려야 할 지 조금 난감합니다.

질문 내용의 설계는 아키텍쳐 관점의 설계를 의도하신게 아닐까 생각되는데 내용상으로는 좀 거리감이 느껴집니다.

OOP 개념을 조금씩 알아 가는 단계에 계신 것 같다는 생각도 들고요.

굳이 제 소견을 말씀을 드린다면 구현 대상과 기능을 지금 보다는 좀 더 구체화 시키실 필요가 있어보입니다.

디자인 패턴이나 OOP 개념도 아직 익숙하지 않으시다면, 기능 블럭 단위이나 연관된 클래스들 단위로 리펙토링을 하시면서 꼭

필요하다 생각되는 부분에 적용해 보시는 것도 한가지 방법이라 생각됩니다.

딱딱하게 고정되어 있는 느낌이라는 이유만으로 패턴을 적용해 굳이 클래스 간의 복잡도를 높이실 필요는 없지 않을까요?

분명 이유와 사용처가 있어 인터페이스들도 정의 하셨을 텐데 관련 코드를 작성할 곳이 혹여나 없으시다면 아직은 이 부분에 대한

정의와 고민이 필요한 단계가 아니실거라 생각합니다.

요구사항 분석이나 설계, 코드 모두 각각의 단계에서 점진적으로 상세화 되고 완성도 또한 여러가지 요건에 따라 결정되는

부분이니 꾸준히 하시다 보면 좋은 결과가 있으실거라 믿습니다.

GMRyuj의 이미지

저도 조금씩 조금씩 객체지향설계에 관한 감(?)이 잡히는 것을 느낌니다. 다만 이것이 너무 미비하다고 해야할까..? 너무 손에 확실히 잡히지가 않아 너무 답답하여 글로 표현하다보니 글의 내용을 정리하지 못하였습니다. 부족한 글 읽어주시고 답변 달아주셔서 정말 감사드립니다.!

이 세상에서 불가능한 것은 단 하나뿐이다.
그것은 자신을 완벽히 믿는 것이다.

익명 사용자의 이미지

가장 중요한 게임의 규칙이 없잖아요.

아무 것도 없는 허공에서 IGameWolrd니 IMovable이니 정의 해봐야 아무 쓸모 없어요. 차라리 그냥 메인 루프에서 scanf와 printf로만 돌아가는 main() 함수 하나만 만든 다음에, 점진적으로 개선/정련해나가면서 __필요에_따라__ 각종 기법들을 적용해보시는게 나을 듯 합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.